SqlServer的触发器
触发器是Sqlserver响应以下任意语句而自动执行的一天T-SQL语句。delete,insert,update.表和视图支持触发器。(但是临时表不支持)。
我们在哪些业务场景需要用到触发器呢?
1.每当订购一个产品时,都从库存数量中减去订购的数量。
2.每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写。
1.首先,创建触发器。触发器用create trigger语句创建。下面是一个简单的例子:
create trigger newproduct_trigger on products after insert as select ‘product added‘
触发器定义为after insert,所以此触发器将在insert语句成功执行后执行。触发器按每个表每个事件每次地定义,因此每个表最多支持3个触发器(insert,update,delete各一个触发器)
2.删除触发器。我们用drop trigger语句删除一个触发器。如下所示:
drop trigger newproduct_trigger;
3.启用和禁用触发器,我们用disable trigger和enable trigger语句:
--禁用触发器 disable trigger newproduct_trigger on products; --重新启用触发器 enable trigger newproduct_trigger on products;
4.我们如何确定这个表有没有触发器呢?我们可以使用内建的存储过程sp_helptrigger:
--sp_helptrigger取一个表名并返回触发器的一个列表。 SP_HELPTRIGGER products;
5.使用触发器。
5.1 insert触发器
insert触发器在insert语句执行之后执行。在insert触发器代码内,可引用一个名为inserted的虚拟表,访问被插入的行。
--创建一个insert触发器,当插入一个新订单时,生成一个新订单号保存到order_num中 create trigger neworder_trigger on orders after insert as select @@identity as order_num; --为测试这个触发器,试着插入一下新行。 insert into orders(order_date,cust_id) values(GetDate(),10001) --输出 order_num -- 20010
5.2 delete触发器
delete触发器在delete语句执行之后执行。在delete触发器代码内,可引用一个名为deleted的虚拟表,访问被删除的行。
--使用delete触发器保存将要被删除的行到一个存档表中 create trigger deleteorder_trigger on orders after delete as begin insert into orders_archive(order_num,order_date,cust_id) select order_num,order_date,cust_id from deleted; end;
此触发器在从表orders中删除行时知行。它使用insert select语句保存deleted中的行到一个名为orders_achive的存档表中。
5.3 update触发器
update触发器在update语句执行之后执行。在update触发器代码中,你可以引用名为deleted的虚拟表访问以前的值,引用名为inserted的虚拟表访问新更新的值。
--下面的例子中保证州名缩写总是大写。 create trigger vendor_trigger on vendors after insert,update as begin update vendors set vend_state=upper(vend_state) where vend_id in (select vend_id from inserted); end;
此触发器在insert,update之后执行。每当行被插入或更新时,vend_state中的值都用upper(vend_state)替换。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。