触发两个表同步增删改

下面是代码和注释

--建表
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

posted on 2008-11-07 11:05  老有所依  阅读(213)  评论(0)    收藏  举报

导航