文档介绍:触发器综合实例
本讲稿第一页,共十五页
触发器(trigger)是一种特殊的存储过程,它不同于一般的存储过程:
一般的存储过程通过存储过程名称被直接调用
触发器主要是通过事件进行触发而被执行。
本讲稿第二页,共十五页
触触发器综合实例
本讲稿第一页,共十五页
触发器(trigger)是一种特殊的存储过程,它不同于一般的存储过程:
一般的存储过程通过存储过程名称被直接调用
触发器主要是通过事件进行触发而被执行。
本讲稿第二页,共十五页
触发器的主要作用是实现由主键和外键等约束所不能保证的复杂的参照完整性和数据一致性。
除此之外,触发器还有以下作用:
触发器可以对数据库进行级联修改。
实现比CHECK约束更为复杂的限制。
比较数据修改前后的差别。
强制表的修改要合乎业务规则。
本讲稿第三页,共十五页
按照触发响应时间按的不同可以将触发器分为两大类:后触发器和前触发器。
(1)后触发器( After Trigger ):
这种类型的触发器将在数据变动(UPDATE、INSERT和DELETE操作)完成后才被触发。
指定 AFTER 与指定 FOR 相同。
AFTER触发器只能在表上定义。
在同一个数据表中可以创建多个AFTER触发器。
默认的为AFTER触发器。
本讲稿第四页,共十五页
按照触发响应时间按的不同可以将触发器分为两大类:后触发器和前触发器。
(2)前触发器( Inserted Of Trigger ):
INSTEAD OF触发器在数据变动以前被触发,并取代变动数据的操作(UPDATE、INSERT和DELETE操作),而去执行触发器定义的操作。
INSTEAD OF触发器可以在表或视图上定义。
在表或视图上,每个UPDATE、INSERT和DELETE语句最多可以定义一个INSTEAD OF触发器。
本讲稿第五页,共十五页
语法格式:
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view } /*指定操作对象*/
[ WITH ENCRYPTION ] /*说明是否采用加密方式*/
{ FOR |AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ] /*说明该触发器不用于复制*/
AS { sql_statement [ ; ] [ ...n ]
| EXTERNAL NAME asse
}
本讲稿第六页,共十五页
触发器中使用的特殊表
当触发器引用视图或者临时表,并产生两个特殊的表:deleted表和inserted表。
执行INSERT语句或UPDATE语句向表中插入数据行时,插入到触发器表中的行作为复本同时将被插入到inserted表中;
执行DELETE语句删除表中数据时,触发表中被删除的行作为复本被插入到deleted表中;
执行UPDATE语句修改数据时,先删除触发表中的旧行,并将该旧行插入deleted表中,再插入新行,同时将新行插入到inserted表中。
本讲稿第七页,共十五页
触发器的主要作用是实现由主键和外键等约束所不能保证的复杂的参照完整性和数据一致性。
除此之外,触发器还有以下作用:
触发器可以对数据库进行级联修改。
实现比CHECK约束更为复杂的限制。
比较数据修改前后的差别。
强制表的修改要合乎业务规则。
本讲稿第八页,共十五页
使用触发器实现复杂的参照完整性和数据一致性。
例1:若修改SC中一个记录的学号,则要检查S中是否存在与该学号相同的记录,若有则不允许修改,若没有则可以修改.
本讲稿第九页,共十五页
CREATE TRIGGER TRIGGER_SC ON [dbo].[sc]
FOR UPDATE
AS
IF UPDATE(SNO)
BEGIN
DECLARE ***@SNO_NEW CHAR(2) ,***@SNO_OLD CHAR(2),***@SNO_CNT INT
SELECT ***@SNO_OLD=SNO FROM DELETED
SELECT ***@SNO_CNT=COUNT(*) FROM S
WHERE SNO=***@SNO_OLD
IF ***@SNO_CNT<>0
ROLLBACK TRANSACTION
END
本讲稿第十页,共十五页
使用触发器对数据库进行级联修改。
,则表S