触发两个表同步增删改
下面是代码和注释
--建表
create table T1(
id int not null PRIMARY KEY, --这里必须有主键
value int
)
go
create table T2( --这里必须有主键
id int not null PRIMARY KEY,
value int
)
go
--触发器代码
--T1 Insert 触发器
Create Trigger tr_T1_Insert
on T1
for Insert
as
set nocount on
if exists ( --这个判断是防止无限递归的
select 1 from inserted i
where not exists (
select 1 from T2 where id=i.id
)
)
insert T2
select * from inserted i
where not exists ( --必须有这个条件,防止重复插入
select 1 from T2 where id=i.id
)
print '1I' --报告触发器执行,只用于测试
go
--T2 Insert 触发器
Create Trigger tr_T2_Insert
on T2
for Insert
as
set nocount on
if exists ( --这个判断是防止无限递归的
select 1 from inserted i
where not exists (
select 1 from T1 where id=i.id
)
)
insert T1
select * from inserted i
where not exists ( --必须有这个条件,防止重复插入
select 1 from T1 where id=i.id
)
print '2I' --报告触发器执行,只用于测试
go
--T1 Update 触发器
Create Trigger tr_T1_Update
on T1
for update
as
set nocount on
if update (value) --只有修改value才触发
begin
if exists ( --这个判断是防止无限递归的
select 1
from T2,Inserted i,deleted d
where i.id=d.id
and i.id=T2.id
and i.value<>d.value
)
update T2
set value=i.Value
from T2,Inserted i,deleted d
where i.id=d.id
and i.id=T2.id
and i.value<>d.value --这个条件保证只有真正修改了值才触发
end
print '1U' --报告触发器执行,只用于测试
go
--T2 Update 触发器
Create Trigger tr_T2_Update
on T2
for update
as
set nocount on
if update (value) --只有修改value才触发
begin
if exists ( --这个判断是防止无限递归的
select 1
from T1,Inserted i,deleted d
where i.id=d.id
and i.id=T1.id
and i.value<>d.value
)
update T1
set value=i.Value
from T1,Inserted i,deleted d
where i.id=d.id
and i.id=T1.id
and i.value<>d.value --这个条件保证只有真正修改了值才触发
end
print '2U' --报告触发器执行,只用于测试
go
--T1 Delete 触发器
Create Trigger tr_T1_delete
on T1
for delete
as
set nocount on
if exists ( --这个判断是防止无限递归的
select 1 from T2,deleted d
where T2.id=d.Id
)
delete T2
from deleted d
where T2.id=d.Id
print '1D' --报告触发器执行,只用于测试
go
--T2 Delete 触发器
Create Trigger tr_T2_delete
on T2
for delete
as
set nocount on
if exists ( --这个判断是防止无限递归的
select 1 from T1,deleted d
where T1.id=d.Id
)
delete T1
from deleted d
where T1.id=d.Id
print '2D' --报告触发器执行,只用于测试
go
--测试
--测试1
insert T1 values(1,1)
--结果1
2I
1I
--这说明调用了两个触发器
--以下查看数据
select * from T1
id value
----------- -----------
1 1
select * from T2
id value
----------- -----------
1 1
--测试2
insert T2 select 2,2 union all select 3,3 --一次插入两条记录
--结果2
1I
2I
--这说明调用了两个触发器
--以下查看数据
select * from T1
id value
----------- -----------
1 1
2 2
3 3
select * from T2
id value
----------- -----------
1 1
2 2
3 3
--测试3
update T1
set value=5
where id=1
--结果3
1U
2U
1U
--这说明调用了两个触发器,其中1表的update触发器调用了两次
--以下查看数据
select * from T1
id value
----------- -----------
1 5
2 2
3 3
select * from T2
id value
----------- -----------
1 5
2 2
3 3
--测试4
update T1
set value=value+1
where id>1
--结果4
1U
2U
1U
--这说明调用了两个触发器,其中1表的update触发器调用了两次
--以下查看数据
select * from T1
id value
----------- -----------
1 5
2 3
3 4
select * from T2
id value
----------- -----------
1 5
2 3
3 4
--测试5
delete T1
where id=1
--结果5
2D
1D
--这说明调用了两个触发器
--以下查看数据
select * from T1
id value
----------- -----------
2 3
3 4
select * from T2
id value
----------- -----------
2 3
3 4
--测试6
delete T2
where id=2
--结果6
1D
2D
--这说明调用了两个触发器
--以下查看数据
select * from T1
id value
----------- -----------
3 4
select * from T2
id value
----------- -----------
3 4
浙公网安备 33010602011771号