SQLServer触发器的使用
基本语法创建:
create trigger trigger_name on {table_name view_name} {for After Instead of } [ insert,update,delete ] as sql_statement 删除触发器:
drop trigger trigger_name 查看数据库中已有触发器:use jxcSoftware go select * from sysobjects where xtype='TR' 修改触发器:alter trigger trigger_name on {table_name view_name} {for After Instead of } [ insert,delete ] as sql_statement? 触发器禁用与启用禁用: ? ALTER TABLE trig_example DISABLE TRIGGER trig1 GO 恢复: ? ALTER TABLE trig_example ENABLE TRIGGER trig1 GO--禁用某个表上的所有触发器 ? ALTER TABLE 你的表 DISABLE TRIGGER all --启用某个表上的所有触发器 ? ALTER TABLE 你的表 enable TRIGGER all --禁用所有表上的所有触发器 ? exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all' --启用所有表上的所有触发器 ? exec sp_msforeachtable 'ALTER TABLE ? enable TRIGGER all' 触发器的知识点一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 三:Instead of 和 After触发器 SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同: Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。 一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 两种触发器的工作流程: Instead of:
SQL Server接到执行SQL语句请求->建立临时的Inserted 表与Deleted表->触发Instead Of触发器->结束。注意:此触发器将代替原来要执行的Insert、Delete 或update操作; 例如:A表有一个关于Instead of Insert 的触发器,向A表插入一行数据时,触发器将要代替“向A表插入一行数据的操作”,至于什么操作,由触发器的内容决定; 用途:
1.多表连接的视图数据更新,可以写相应的Instead of 语句去更新多个表; 2.数据库某些表禁止进行Insert、Delete、Update,则可以写Instead of Insert、Instead of Delete、Instead of Update来屏蔽原来要进行的操作。 After /for:
SQL Server接到执行SQL语句请求->建立临时的Inserted 表与Deleted表->执行SQL语句->触发Instead Of触发器->结束。 .一个操作同时存在于Instead of 与After中时,Instead of 的一定会执行,After的则不一定会执行。如果Instead里执行的是非激活类型的操作,则不会执行After里面同种类型的操作。例如:Insert语句同时存在于Instead of 与After中,如果Instead of Insert 里面执行的是非本表的Insert语句操作,那么After?Insert 就不会执行了。 四:触发器的执行过程 实例:1:在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。 create trigger orderinsert on orders after insert as if (select status from goods,inserted where goods.name=inserted.goodsname)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滚﹐避免加入 end2:在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。 create trigger orderinsert1 on orders after insert as update goods set storage=storage-inserted.quantity from goods,inserted where goods.name=inserted.goodsname 3:在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。 create trigger goodsdelete on goods after delete as delete from orders where goodsname in (select name from deleted) instead of 触发器的用法INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。基于多个基表的视图必须使用???? ?????? INSTEAD OF触发器来支持引用多个表中数据的插入、更新和删除操作。INSTEAD OF触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。 ?????? Transact-SQL语句创建两个基表、一个视图和视图上的INSTEAD OF触发器。以下表将个人数据和业务数据分开并且是视图的基表。 /*在视图上定义 instead of insert触发器以在一个或多个基表中插入数据。*/ --部门表 create table dept ( ????d_id int primary key, ????d_name varchar(20) ) --员工表 create table emp ( ???e_id int primary key, ???e_name varchar(20), ???d_id int references dept(d_id) )
select * from emp
drop view v create view v as select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id
select * from v
insert into v values(1001,'张珊',101,'销售部')
/*******************使用instead of触发器******************/ drop trigger de_em_insert go create trigger de_em_insert on v instead of insert as begin ????if (not exists (select d.d_id from dept d,inserted i where d.d_id = i.d_id)) ?????insert into dept select d_id,d_name from inserted
???if (not exists (select e.d_id from emp e,inserted i where e.d_id = i.d_id)) ???insert into emp select e_id,d_id from inserted else ???update emp set e_id = i.e_id,e_name = i.e_name from emp e,inserted i where e.d_id = i.d_id end ?????? 可以在视图或表中定义 INSTEAD OF DELETE触发器,以代替 DELETE语句的标准操作。通常,在视图上定义 INSTEAD OF DELETE触发器以便在一个或多个基表中修改数据。??? ?????? 可在视图上定义 INSTEAD OF UPDATE 触发器以代替 UPDATE语句的标准操作。通常,在视图上定义 INSTEAD OF UPDATE 触发器以便修改一个或多个基表中的数据 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |