一样!都是后触发 AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。
...触发 SQL 语句中指定...这个"SQL 语句"指的是什么?
-- 作者:zjsql2000 -- 发布时间:2004-7-27 17:18:42-- [原创]课堂笔记之 触发器--触发器类型: --1)for <=> after:先执行触发触发器的条件语句,然后执行 --触发器, 即后触发。 --2)instead of:取消触发触发器的条件语句,执行触发器--触发条件:insert , update ,delete--逻辑表:只能在触发器中调用。两个逻辑表存放在内存中, --因此对这两个逻辑表的访问速度会很快。表结构和触发器所 --依赖的表的结构完全相同 --1)inserted:对触发器所依赖的表进行insert动作后 --,所有新插入的数据全部存放在inserted逻辑表中 --2)deleted:对触发器所依赖的表进行delete --动作后,所有删除掉的数据全部存放在deleted逻辑表中。 --update动作系统在处理的时候分解为delete + insert, --因此执行update时,两个逻辑表中都会有数据, --deleted存放更新前的数据,inserted存放更新后的数据 select * from inserted --X:不在触发器中调用 --ex: insert into test (id ,name) values (9,\'www\') go create trigger t_test_insert on test for insert as select \'t_test_insert\' select * from inserted update test set name=\'t_insert\' where id=9 go select * from test --触发器是事务的一部分 create trigger t_test_insert1 on test for insert as select \'t_test_insert1\' select * from inserted rollback tran update test set name=\'t_insert1\' where id=9 go insert into test (id ,name) values (9,\'www\') --=>等价于 begin tran insert into test (id ,name) values (9,\'www\')select \'t_test_insert\' select * from inserted update test set name=\'t_insert\' where id=9 select \'t_test_insert1\' select * from inserted rollback tran update test set name=\'t_insert1\' where id=9commit tran --<=等价结束 select * from test--设定同一条件触发器执行顺序 sp_settriggerorder[@triggername = ] \'triggername\' , [@order = ] \'value\' , [@stmttype = ] \'statement_type\' exec sp_settriggerorder \'t_test_insert\' ,\'Last\',\'insert\' exec sp_settriggerorder \'t_test_insert1\' ,\'First\',\'insert\' go insert into test (id ,name) values (9,\'www\') --=>等价于 begin tran insert into test (id ,name) values (9,\'www\')
select \'t_test_insert1\' select * from inserted rollback tran update test set name=\'t_insert1\' where id=9--select \'t_test_insert\' --select * from inserted --update test set name=\'t_insert\' where id=9commit tran --<=等价结束 select * from test --结果:只有触发器t_test_insert1执行 --分析:因为指定了触发器的触发顺序,所以 --t_test_insert1先执行,当执行完rollback tran语句 --后,即标志触发触发器的语句insert into...是无效的, --所以不会写入数据文件,因此另外的一个触发器 --t_test_insert没有执行。--ex:当一个教练挑选队员上场,当超出5名队员时应该给 --出一个错误信息提示“目前已经选择了五名队员!”, --用触发器实现。 create table member (id int, name varchar(20)) go create trigger t_member_insert on member for insert as select \'t_member_insert\' declare @count int set @count=5 if @count<(select count(*) from member) begin raiserror(\'目前已经选择了五名队员!不再在选择了。\',16,1) rollback transaction end go insert into member (id,name) values (1,\'tom\') insert into member (id,name) values (2,\'tom1\') insert into member (id,name) values (31,\'tom2\') insert into member (id,name) values (21,\'tom3\') insert into member (id,name) values (13,\'tom4\') insert into member (id,name) values (16,\'tom5\')select * from member--触发器的enable & disable --ex:使test表上的t_test_insert,t_test_insert1暂时无效 alter table test disable trigger t_test_insert,t_test_insert1--all go insert into test (id ,name) values (1,\'tom\') select * from test --有效 alter table test enable trigger t_test_insert,t_test_insert1--all go --ex:删除触发器 --删除表中的数据 --1)delete from table_name:把表中数据删除, --同时命令及数据写入日志文件 --2)trancate table table_name:把表中所有数据删除, --数据不写入日志文件 create trigger t_test_delete on test for delete as select \'t_test_delete\' go select * from test delete from test where id=9 --t_test_delete执行 truncate table test --t_test_delete不执行 select * from test--EX: update trigger create trigger t_test_update_id on test after update as select \'t_test_update_id\' if update(id) begin raiserror(\'不能更新ID!\',10,1) rollback tran end go create trigger t_test_update_name on test after update as select \'t_test_update_name\' if update(name) begin select * from inserted select * from deleted end go insert into test values (1,\'tom\') update test set id=10 update test set name=\'ddd\' select * from test
AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。
-- 发布时间:2004-7-27 17:18:42-- [原创]课堂笔记之 触发器--触发器类型:
--1)for <=> after:先执行触发触发器的条件语句,然后执行
--触发器, 即后触发。
--2)instead of:取消触发触发器的条件语句,执行触发器--触发条件:insert , update ,delete--逻辑表:只能在触发器中调用。两个逻辑表存放在内存中,
--因此对这两个逻辑表的访问速度会很快。表结构和触发器所
--依赖的表的结构完全相同
--1)inserted:对触发器所依赖的表进行insert动作后
--,所有新插入的数据全部存放在inserted逻辑表中
--2)deleted:对触发器所依赖的表进行delete
--动作后,所有删除掉的数据全部存放在deleted逻辑表中。
--update动作系统在处理的时候分解为delete + insert,
--因此执行update时,两个逻辑表中都会有数据,
--deleted存放更新前的数据,inserted存放更新后的数据
select * from inserted --X:不在触发器中调用
--ex:
insert into test (id ,name) values (9,\'www\')
go
create trigger t_test_insert
on test
for insert
as
select \'t_test_insert\'
select * from inserted
update test set name=\'t_insert\' where id=9
go
select * from test
--触发器是事务的一部分
create trigger t_test_insert1
on test
for insert
as
select \'t_test_insert1\'
select * from inserted
rollback tran
update test set name=\'t_insert1\' where id=9
go
insert into test (id ,name) values (9,\'www\')
--=>等价于
begin tran
insert into test (id ,name) values (9,\'www\')select \'t_test_insert\'
select * from inserted
update test set name=\'t_insert\' where id=9
select \'t_test_insert1\'
select * from inserted
rollback tran
update test set name=\'t_insert1\' where id=9commit tran
--<=等价结束
select * from test--设定同一条件触发器执行顺序
sp_settriggerorder[@triggername = ] \'triggername\'
, [@order = ] \'value\'
, [@stmttype = ] \'statement_type\'
exec sp_settriggerorder \'t_test_insert\'
,\'Last\',\'insert\'
exec sp_settriggerorder \'t_test_insert1\'
,\'First\',\'insert\'
go
insert into test (id ,name) values (9,\'www\')
--=>等价于
begin tran
insert into test (id ,name) values (9,\'www\')
select \'t_test_insert1\'
select * from inserted
rollback tran
update test set name=\'t_insert1\' where id=9--select \'t_test_insert\'
--select * from inserted
--update test set name=\'t_insert\' where id=9commit tran
--<=等价结束
select * from test
--结果:只有触发器t_test_insert1执行
--分析:因为指定了触发器的触发顺序,所以
--t_test_insert1先执行,当执行完rollback tran语句
--后,即标志触发触发器的语句insert into...是无效的,
--所以不会写入数据文件,因此另外的一个触发器
--t_test_insert没有执行。--ex:当一个教练挑选队员上场,当超出5名队员时应该给
--出一个错误信息提示“目前已经选择了五名队员!”,
--用触发器实现。
create table member
(id int,
name varchar(20))
go
create trigger t_member_insert
on member
for insert
as
select \'t_member_insert\'
declare @count int
set @count=5
if @count<(select count(*) from member)
begin
raiserror(\'目前已经选择了五名队员!不再在选择了。\',16,1)
rollback transaction
end
go
insert into member (id,name) values (1,\'tom\')
insert into member (id,name) values (2,\'tom1\')
insert into member (id,name) values (31,\'tom2\')
insert into member (id,name) values (21,\'tom3\')
insert into member (id,name) values (13,\'tom4\')
insert into member (id,name) values (16,\'tom5\')select * from member--触发器的enable & disable
--ex:使test表上的t_test_insert,t_test_insert1暂时无效
alter table test
disable trigger t_test_insert,t_test_insert1--all
go
insert into test (id ,name) values (1,\'tom\')
select * from test
--有效
alter table test
enable trigger t_test_insert,t_test_insert1--all
go
--ex:删除触发器
--删除表中的数据
--1)delete from table_name:把表中数据删除,
--同时命令及数据写入日志文件
--2)trancate table table_name:把表中所有数据删除,
--数据不写入日志文件
create trigger t_test_delete
on test
for delete
as
select \'t_test_delete\'
go
select * from test
delete from test where id=9 --t_test_delete执行
truncate table test --t_test_delete不执行
select * from test--EX: update trigger
create trigger t_test_update_id
on test
after update
as
select \'t_test_update_id\'
if update(id)
begin
raiserror(\'不能更新ID!\',10,1)
rollback tran
end
go
create trigger t_test_update_name
on test
after update
as
select \'t_test_update_name\'
if update(name)
begin
select * from inserted
select * from deleted
end
go
insert into test values (1,\'tom\')
update test set id=10
update test set name=\'ddd\'
select * from test
而after是sql 2000的版本