SQL Server:触发器实例详解
1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。 所以触发器可以用来实现对表实施复杂的完整性约束。 2. 触发器的分类 SQL Server2000提供了两种触发器:“Instead of” 和“After” 触发器。 一个表或视图的每一个修改动作(Insert、Update和Delete)都可以有一个“Instead of” 触发器,一个表的每个修改动作都可以有多个“After”触发器。 2.1 “Instead of”触发器
instead of Delete as begin select 学号,姓名 from deleted end delete from 学生 where 学号 = 4 上例中定义了“trigger学生_Delete”触发器,该触发器从“delete”表中打印出所要删除的学生.在执行“delete”操作后,会发现“学号 = 4”的学生并未被删除, 原因在于“trigger学生Delete”替代了所要执行的“delete from 学生 where 学号 = 4”语句,而在“trigger学生_Delete”中并未真正删除学生。 2.2 “After”触发器
3. Inserted和Deleted表 SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。
4. 触发器的执行过程
5. 创建触发器 on {table_name|view_name}{After|Instead of} {insert|update|delete} as 相应T-SQL语句 6. 修改触发器: on {table_name|view_name}{After|Instead of} {insert|update|delete} as 相应T-SQL语句 7. 删除触发器: 8. 查看数据库中已有触发器: 8.1 查看数据库中所有触发器8.2 查看单个触发器9. “Instead of”相关示例: 两张表:学生(学号 int,姓名 varchar)、借书记录(学号 int,图书编号 int) 实现功能:在删除学生表时,如果该学生仍有借书记录(未还)则不能删除 on 学生instead of Delete as begin if not exists(select * from 借书记录,deleted where 借书记录.学号 = deleted.学号)
end 10. “After”触发器 10.1 在“订单”表中建立触发器,当向“订单”表中插入一条订单记录时,检查“商品”表的货品状态“状态”是否为1(正在整理),则不能往“订单”表加入该订单。 on 订单after insert as if (select 状态 from 商品,inserted where 商品.pid = inserted.pid)=1 begin
end
10.2 在“订单”表建立一个插入触发器,在添加一条订单时,减少“商品”表相应的货品记录中的库存。 on 订单after insert as update 商品 set 数量 = 数量 - inserted.数量 from 商品,inserted where 商品.pid = inserted.pid 10.3 在“商品”表建立删除触发器,实现“商品”表和“订单”表的级联删除。 on 商品after delete as delete from 订单 where 订单.pid in (select pid from deleted) 10.4 在“订单”表建立一个更新触发器,监视“订单”表的“订单日期”列,使其不能被“update”. on 订单after update as if update(订单日期) begin
end 10.5 在“订单”表建立一个插入触发器,保证向“订单”表插入的货品必须要在“商品”表中一定存在。 on 订单after insert as if (select count(*) from 商品,inserted where 商品.pid = inserted.pid)=0 begin
end 10.6 “订单”表建立一个插入触发器,保证向“订单”表插入的货品信息要在“订单日志”表中添加 on 订单for insert as insert into 订单日志 select inserted.Id,inserted.pid,inserted.数量 from inserted 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。 (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |