触发器中如何判断那些记录是Insert or Update or Delete 所影响的记录?
我想做一个通用触发器,在当前biao01表执行Insert/update/delete时,都判断执行,并向另一个表biao01_tmp中插入一条记录,
1.如biao01插入一条记录,则在biao01_tmp中插入一条记录,同时OptType=1
2.如biao01修改一条记录,则在biao01_tmp中插入一条记录,同时OptType=2
3.如biao01删除一条记录,则在biao01_tmp中插入一条记录,同时OptType=3
我写的触发器如下,但是执行时只有insert有效,update和delete时都有问题。
(由于这个触发器使用T-SQL,在Sqlanywhere中来写,多少还是和Sqlserver有点微小的差异,写起来实在有点别扭)
Create trigger dba.CommonToTmp on dba.biao01 for insert,delete,update
as
begin
declare @errorcode integer
declare @tab_name varchar(50)
select @errorcode=@@error
begin transaction
-- ***
if(@errorcode = 0)
begin
-- 获得触发器宿主源名(表名)
select @tab_name = table_name from systable where table_id = (select table_id from
systrigger where
trigger_name = 'CommonToTmp')
select @errorcode=@@error
end
-- ***
-- 判断是否存在,只在Inserted有记录而deleted中没有的记录,即,判断是否是Insert操作
if exists(select* from inserted where not UnitCoding = any(select UnitCoding from deleted))
begin
if(@errorcode = 0)
begin
insert into dba.biao01_tmp(UnitCoding,OptType,ObjName)
select UnitCoding,1,@tab_name from
inserted where not UnitCoding = any(select UnitCoding from deleted)
select @errorcode=@@error
end
end
-- ***
-- 判断是否存在,既在Inserted有记录又在deleted中有的记录,即,判断是否是update操作
if exists(select* from inserted as i join deleted as d on i.UnitCoding = d.UnitCoding)
begin
if(@errorcode = 0)
begin
insert into dba.biao01_tmp(UnitCoding,OptType,ObjName)
select i.UnitCoding,2,@tab_name from
deleted as d join inserted as i on d.UnitCoding = i.UnitCoding
select @errorcode=@@error
end
end
-- ***
-- 判断是否存在,只在deleted有记录而inserted中没有的记录,即,判断是否是deleted操作
if exists(select* from deleted where not UnitCoding = any(select UnitCoding from inserted))
begin
if(@errorcode = 0)
begin
insert into dba.biao01_tmp(UnitCoding,OptType,ObjName)
select UnitCoding,3,@tab_name from
deleted where not UnitCoding = any(select UnitCoding from inserted)
select @errorcode=@@error
end
end
-- ***
if(@errorcode = 0)
begin
commit transaction
end
else
begin
rollback transaction
end
end