如何使用SQL语句创建触发器

这篇具有很好参考价值的文章主要介绍了如何使用SQL语句创建触发器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何使用SQL语句创建触发器

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>记录SQL server触发器的创建语句,以及简单介绍.

前言

一、触发器的介绍

1.1 触发器 的概念以及定义:

触发器 是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。存储过程可以通过语句直接调用,而 触发器主要是通过事件进行触发而被执行的.
例如当对某一表进行诸如UPDATE(修改)、INSERT(插入)、DELETE(删除)这些操作时,SQL Server 就会自动执行触发器所定义的SQL语句,从而确保对数据之间的相互关系,实时更新.

1.2 、 触发器 的作用

触发器的主要作用就是其能够实现由 主键 外键 所不能保证的复杂的参照完整性和数据的一致性。除此之外, 触发器 还有其它许多不同的功能:

①、复杂的约束条件
触发器 能够实现比CHECK 语句更为复杂的约束。

②、保证数据的安全

触发器 因为 触发器是在对数据库进行相应的操作而自动被触发的SQL语句可以通过数据库内的操作从而不允许数据库中未经许可的指定更新和变化。

③.级联式

触发器 可以根据数据库内的操作,并自动地级联影响整个数据库的各项内容。例如:对A表进行操作时,导致A表上的 触发器被触发,A中的 触发器中包含有对B表的数据操作(UPDATE(修改)、INSERT(插入)、DELETE(删除)),而该操作又导致B表上 触发器被触发。

④.调用存储过程

为了响应数据库更新, 触发器 可以调用一个或多个存储过程.

但是,总体而言, 触发器性能通常比较低。

三、 触发器 的种类
SQL Server 中一般支持以下两种类型的触发器:

  1. AFTER 触发器

  AFTER 触发器 要求只有执行某一操作(INSERT、UPDATE、DELETE)之后, 触发器 才被触发,且只能在表上定义。可以为针对表的同一操作定义多个 触发器
2. INSTEAD OF 触发器

  INSTEAD OF 触发器 表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行 触发器 本身。既可在表上定义INSTEAD OF 触发器 ,也可以在视图上定义INSTEAD OF 触发器 ,但对同一操作只能定义一个INSTEAD OF 触发器

二、使用SQL语句创建触发器实例

1.创建after融发器

(1)创建一个在插入时触发的触发器sc_insert,当向sc表插入数据时,须确保插入的学号已在student表中存在,并且还须确保插入的课程号在Course表中存在﹔若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号不满足条件(注:Student表与sc表的外键约束要先取消)。

语句实现:

create trigger sc_insert
on sc
after insert
as
if not exists (select * from student,inserted
			where student.sno=inserted.sno)
	begin
		print '插入信息的学号不在学生表中! '
		if not exists (select * from course,inserted where
		course.cno=inserted. cno)
		print '插入信息的课程号不在课程表中!'
		rollback
	end
  else
		begin
			if not exists (select * from course,inserted where
		Course.cno=inserted.cno)
			begin
			print '插入信息的课程号不在课程表中! '
			rollback
		end
	end

如何使用SQL语句创建触发器

执行:

insert into sc
values ( '20110112','001','78')

删除外键约束;

alter table sc
drop constraint FK_sc__sno__332C9D34

(2)为Course表创建一个触发器Course_del,当删除了Course表中的一条课程信息时,同时将表sc表中相应的学生选课记录删除掉。

create trigger course_del
on course
after delete
as
if exists(select * from sc, deleted
where sc.cno=deleted.cno)
begin
delete from sc
where sc.cno in (select cno from deleted)
end
delete from Course
where Cno='003'

如何使用SQL语句创建触发器

select * from sc

如何使用SQL语句创建触发器

(3)在Course表中添加一个平均成绩avg_Grade字段(记录每门课程的平均成绩),创建一个触发器Grade_modify,当sc表中的某学生的成绩发生变化时,则Course表中的平均成绩也能及时相应的发生改变。

Course表中添加一个平均成绩avg_Grade字段

alter table Course
add avg_Grade smallint

avg_Grade中添加数据

update course
set avg_Grade= (select AVG(Grade) from sc
where sc.Cno=Course.Cno)

查看Course表:

select *from Course

如何使用SQL语句创建触发器

创建Grade_modify触发器

create trigger Grade_modify
on sc
after update
as
if update(grade)
begin
update course
set avg_grade=(select avg (grade)
from sc where course.cno=sc.cno
group by cno)
end
update sc
set Grade='90 '
where sno='20050001' and cno='001'

2.创建instead of触发器

(1)创建一视图Student_view,包含学号、姓名、课程号、课程名、成绩等属性,在Student_view上创建一个触发器Grade_moidfy,当对Student_view中的学生的成绩进行修改时,实际修改的是sc中的相应记录。

创建视图:

create view student_view
as
select s.Sno,Sname , c.Cno , Cname , Grade
from student s , course c, sc
where s.Sno=sc.sno and c.Cno=sc.cno

创建触发器:

create trigger Grade_moidfy 
on student_view
instead of update
as
if UPDATE (Grade)
begin
update sc
set Grade= (select Grade from inserted) where
Sno= (select sno from inserted) and 
Cno= (select Cno from inserted)
End
update student_viewset Grade=40
where Sno='20110001'and Cno='002'

测试修改数据:

select *
from student_view

(2)在sc表中插入一个getcredit字段(记录某学生,所选课程所获学分的情况),创建一个触发器ins_credit,当更改(注:含插入时)sc表中的学生成绩时,如果新成绩大于等于60分,则该生可获得这门课的学分,且该学分须与Course表中的值一致﹔如果新成绩小于60分,则该生未能获得学分,修改值为0。

添加新字段getcredit :

alter table sc
add getcredit smallint

创建触发器:

create trigger sc_up
on sc
after insert,update
as
declare @xf int,@kch char(3),@xh char(8),@fs int
select @fs=grade,@kch=cno,@xh=sno from inserted
if @fs>=60
update sc set @xf=(select credit from course where
sc.Cno=course.cno) where sno=@xh and cno=@kch
else
update sc set @xf=0 where sno=@xh and cno=@kch
修改数据:
update sc
set Grade='90'
where Sno='20050001' and cno='001'

以上就是对触发器的基本认识了,希望对大家有所帮助.

欢迎友友们私信与牛牛讨论问题.,只是牛牛的认知范围有限,目前只关注c语言,数据结构,C++等部分领域.
如何使用SQL语句创建触发器文章来源地址https://www.toymoban.com/news/detail-496692.html

到了这里,关于如何使用SQL语句创建触发器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL 触发器

    一、什么是触发器? 1、触发器是一个在修改指定表或数据库中的数据时执行的存储过程, 是通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或唯一性。 由于操作数据库不能绕过数据库,所以就可以用它来强制实施复杂的业务规则来保证数据的完整性。 2、

    2024年02月10日
    浏览(20)
  • SQL视图、存储过程、触发器

    视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查

    2024年02月09日
    浏览(40)
  • SQL Server之触发器

    触发器 触发器是一种特殊类型的存储过程,主要是通过事件触发来执行的,而存储过程可以通过存储过程名来直接调用。当往某一个数据表中插入、修改或者删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规

    2024年02月06日
    浏览(26)
  • 触发器的创建与管理实验

    一、验证性实验 某同学定义产品信息product表,主要信息有:产品编号、产品名称、主要功能、生产厂商、c厂商地址,生成product表的SQL代码如下: CREATE TABLE product ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , function VARCHAR(50) , company VARCHAR(20) NOT NULL, address VARCHAR(50) )

    2024年02月09日
    浏览(23)
  • 【基础7】SQL事务及触发器

    目录 事务(TRANSACTION) 触发器 DML触发器 DDL触发器 触发器的练习 什么是事务 事务是作为单个逻辑工作单元执行的一系列操作,它包含了一组数据库操作命令 所有的操作命令作为一个整体一起向系统提交,要么都执行、要么不执行 事是SQL Server 中执行并发控制的基本单位,是

    2024年02月06日
    浏览(30)
  • SQL sever中的触发器

    目录 一、触发器概念 二、触发器优缺点 2.1优点: 2.2缺点: 三、触发器种类 四、触发器创建 4.1创建DML触发器 4.2创建DDL触发器 4.3创建登录触发器 五、触发器管理 5.1查看触发器 5.1.1.使用sp_helptext存储过程查看触发器 5.1.2.获取数据库中触发器的信息 5.2修改触发器 5.2.1修改DM

    2024年02月05日
    浏览(30)
  • sql server中的触发器

    目录 1.触发器的定义 2  触发器的分类 3 :  dml触发器的工作原理 4 触发器的应用 1.insert触发器 2.delete触发器 3 update 触发器  DDL触发器 5.触发器的启用和禁用 触发器其实就是一个特殊的存储过程,这个存储过程呢,不能调用罢了, 而是当数据发生变化的时候才触发了这个过程,;  

    2024年02月06日
    浏览(30)
  • mysql 、sql server trigger 触发器

    sql server mySQL NEW与OLD详解 MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地: 在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据; 在UPDATE型触发器中,OLD用来表示将要或已

    2024年02月12日
    浏览(29)
  • MySQL-SQL存储函数以及触发器详解

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月11日
    浏览(33)
  • MySQL-SQL存储过程/触发器详解(下)

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包