一个联动更新的触发器
在表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'

浙公网安备 33010602011771号