SQL触发器(不容错过!)


前言

学无止境,笔勤不辍。笔者今天給大家带来SQL完整性中的触发器的应用and 完整性的一些易错点的补充…


一、完整性易错点的补充

1.在用户自定义的完整性约束中 CHECK约束可以对一张表的列的取值范围进行约束,也可以对一张表中多列之间的取值进行限制,也可以对表间列之间的取值进行限制。
2.完整性控制防范的对象是 不合语义的数据
3.对表进行SELECT 查询操作时,不会自动触发触发器。(这个应该是下方内容的,但是为了好看,
就放上面了)

二、触发器

1.定义

触发器是与表有关的数据库对象,在满足定义条件(操作事件 如:插入INSERT 删除 DELETE 修改 UPDATE)时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。
触发器(TRIGGER):为每个表创建两张表INSERTED、DELETED表,类似于日志的作用,是放置在内存中,不能被用户所修改,是逻辑表,每次插入一个元组,就在INSERTED表中增加一条记录,类似,删除一条记录,就在DELETED表中增加一条记录。UPDATE会在两张表中都插入一条数据,在INSERTED表中是修改后的记录数据,在DELETED表中是修改前的记录数据。这两张表,在运行过程中产生,是临时视图,运行结束后,就不存在了。
定义TRIGGER包括:1.指明触发器的触发事件(ON INSERT / ON DELETE / ON UPDATE)2.指明触发器执行的动作。

2.组成和类型

定义触发器,一定要有触发器条件,可以是一个/多个INSERT DELETE UPDATE
UPDATE事件可以指定特定属性/属性组修改,作为触发条件
事件触发,也有三个时间节点:BEFORE,AFTER,INSTEAD OF
AFTER类触发器可以有多个,但视图/表中,每一个事件只能建立一个INSTEAD OF 触发器
同时触发器类型也可以分为FOR EACH STATEMENT(语句级) FOR EACH ROW(每一行)

3.创建触发器

这是一种创建的方式
语句如下(示例):

CREATE TRIGGER 触发器名称
ON { table | view }
{ BEFORE | AFTER | INSTEAD OF }
{ [INSERT] | [UPDATE OF[列名清单]] | [DELETE] }
[REFERENCING 临时视图名 =]
[WHEN  触发条件 =
[FOR EACH{ROW|STATEMENT}]]
触发动作
BEFORE :执行触发语句前,激发触发器
AFTER :执行出发语句后,触发触发器
INSTEAD OF :不执行该SQL语句直接执行触发器语句

还有一种创建方法:

CREATE TRIGGER 触发器名称
ON { table | view }
[WITH ENCRYPTION]//加密
{ FOR | AFTER | INSTEAD OF }
{ [INSERT] | [UPDATE] | [DELETE] }
AS
//可以有 IF UPDATE(列名)[操作/事件] 只能由于INSERT UPDATE 不能适用于DELETE操作
SQL语句[,...n]

INSTEAD OF 触发器举例

1.2 INSTEAT OF 举例

 **要求**:插入数据前判断 s_id 是否已经存在,若存在则输出 ‘插入ID已经存在,不允许插入’ +插入学生的学号,并进行回滚数据;反之,进行插入操作,并输出’成功执行’+插入学生的学号。


 --创建修改之后的触发器
 CREATE TRIGGER trig_student_InsteadOF
 ON student
 Instead OF  INSERT #相当于重写INSERT
 AS 
 	PRINT 'THE TRIGGER IS instead of'
 	declare @id char(10)
 	select @id=s_id from inserted
 	--判断新插入的数据是否存在
 	IF EXISTS(SELECT s_id FROM student where s_id=@id)
 		BEGIN
 			ROLLBACK TRANSACTION
 			PRINT '插入ID已经存在,不允许插入'+@id
 		END
 	ELSE
 		BEGIN
 			INSERT INTO student SELECT * FROM inserted
 			PRINT '成功执行'+@id
 		END	
 --触发器被触发的SQL语句
 INSERT INTO 
 student  ([s_id],[sname],[ssex],[sbirthday],[sdepartment],[smajor],[spoliticalStatus],[photo],[smemo])
 VALUES
 ('20070104',N'张莉',N'女','1/30/1998',N'信息工程学院',N'计算机',N'党员',NULL,NULL)

3.修改TRIGGER

ALTER TRIGGER 触发器名称
ON { table | view }
{ FOR | AFTER | INSTEAD OF }
{ [INSERT] | [UPDATE] | [DELETE] }
AS
SQL语句[,...n]

4.删除TRIGGER

DROP TRIGGER 触发器名称[,...n]

总结

例如:以上就是今天要讲的内容,数据库是涉及范围很广、知识点很多的课程,笔者在自己的学习过程中,将这些知识进行整理,分享给大家,希望大家和笔者一起学习和进步,同时,如果笔者有对知识点错误理解的地方也希望大家能够指教…最后提前祝大家五一劳动节快乐!笔者要去度假啦!!! 期待一下接下来对安全性的概述吧~~~

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值