sql server触发器用到的两个逻辑表:
deleted和inserted分别代表操作所变更的旧记录集和操作所产生的新记录集。
其中:
执行INSERT操作后deleted逻辑表为空,inserted逻辑表有数据;
执行DELETE操作后inserted逻辑表为空,deleted逻辑表有数据;
执行UPDATE操作后两个逻辑表都有数据,deleted为旧记录集,inserted为新记录集。
以上操作变更几条记录,逻辑表就会产生几条记录,多条记录可以在触发器中用游标处理。
如:
CREATETRIGGERqf_trigger
ONUser_table
forINSERT,DELETE,UPDATE
AS
BEGIN
declare@useridvarchar(20)
--保存旧值
declarerscursorfor
selectuseridfromdeleted
openrs
fetchnextfromrsinto@userid
while@@fetch_status=0
begin
ifupdate(用户名)
insertintoold_users(userid)values(@userid)
fetchnextfromrsinto@userid
end
closers
deallocaters
--保存新值
declarerscursorfor
selectuseridfrominserted
openrs
fetchnextfromrsinto@userid
while@@fetch_status=0
begin
ifupdate(用户名)
begin
if(@userid='admin')
begin
raiserror('此用户名禁用!',10,1)withnowait
rollback
return
end
insertintonew_users(userid)values(@userid)
end
fetchnextfromrsinto@userid
end
closers
deallocaters
END
ONUser_table
forINSERT,DELETE,UPDATE
AS
BEGIN
declare@useridvarchar(20)
--保存旧值
declarerscursorfor
selectuseridfromdeleted
openrs
fetchnextfromrsinto@userid
while@@fetch_status=0
begin
ifupdate(用户名)
insertintoold_users(userid)values(@userid)
fetchnextfromrsinto@userid
end
closers
deallocaters
--保存新值
declarerscursorfor
selectuseridfrominserted
openrs
fetchnextfromrsinto@userid
while@@fetch_status=0
begin
ifupdate(用户名)
begin
if(@userid='admin')
begin
raiserror('此用户名禁用!',10,1)withnowait
rollback
return
end
insertintonew_users(userid)values(@userid)
end
fetchnextfromrsinto@userid
end
closers
deallocaters
END
在用INSERT,DELETE,UPDATE更新表时,如果触发器执行的操作失败,对表的操作也会回滚,并提示触发器程序产生错误的位置与原因。
本文详细介绍了SQL Server触发器中的deleted和inserted逻辑表的使用方式,通过实例展示了在INSERT、DELETE和UPDATE操作中如何利用这两个特殊表来记录变更前后的数据,并实现了触发器内的错误处理机制。
1875

被折叠的 条评论
为什么被折叠?



