一个联动更新的触发器

在表A中插入(删除)数据时,在表B的“记录”列加(去除)上表A的”用户名“值。

 

use Foxtable
go

if exists ( select 1 from sysobjects where name='A表' and type ='U' )
begin
drop table A表 ;
end;
go
create table A表(
ID varchar(10) , --编号
用户名 varchar(50) , 
)
go

if exists ( select 1 from sysobjects where name='B表' and type ='U' )
begin
drop table B表 ;
end;
go
create table B表(
ordID varchar(10) , --编号
记录 varchar(50) , 
)
go

--after insert触发器

alter TRIGGER [dbo].[tri_A_insert]
ON [dbo].[A表] after insert
AS
BEGIN
DECLARE @oldvalue nvarchar(50),@newvalue nvarchar(50)
    select @oldvalue =isnull([记录],'') from B表 where ordID=(SELECT ID FROM inserted)
select @newvalue=用户名  FROM inserted
    UPDATE B表 set 记录= @oldvalue +  @newvalue WHERE ordID =(SELECT ID FROM inserted);
END

go

--after delete触发器

alter TRIGGER [dbo].[tri_A_delete]
ON [dbo].[A表] after delete
AS
BEGIN
declare YB cursor --声明一个游标,支持批量删除
for
 select ID from deleted --这里的ID要和下面的匹配
 open YB
  declare @ID varchar(50) --这里的ID要和上面的匹配,定义一个游标变量@ID,用来操作insered表中的ID.
  fetch next from YB into @ID --这里的ID要是上面的匹配,移动游标
  while(@@fetch_status=0) --0操作成功,-1 FETCH 语句失败或此行不在结果集中,-2 被提取的行不存在
  begin
  DECLARE @delvalue nvarchar(50)
   select @delvalue=用户名  FROM deleted where ID=@ID
    UPDATE B表 set 记录=replace(cast(记录 as varchar(8000)),@delvalue,'') WHERE ordID = @ID ;  --cast支持 text,ntext类型字段的替换
 fetch next from YB into @ID --继续移动游标,直到@@fetch_status不等于时.
   end
close YB --关闭游标
deallocate YB --释放游标

END

go

--测试

insert A表 values('1','CA')
insert B表 values('1',NULL)
delete B表
delete A表

delete A表 where id='1' and 用户名='CA'

 

posted @ 2022-04-10 15:01  晨诚他爸  阅读(71)  评论(0)    收藏  举报