sql – 删除而不是删除触发器中的记录

前端之家收集整理的这篇文章主要介绍了sql – 删除而不是删除触发器中的记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要一个而不是删除触发器,以便我可以从正被删除的表行中获取文本字段值,以便在实际删除时保留这些字段.出于某种原因,我无法在标准的Delete触发器中将它们从Deleted表中拉出来(sql错误输出).

有没有办法在“而不是删除”触发器内进行实际删除而不使触发器重新启动?

或者一旦删除行以保存到新记录中,获取文本字段的更好方法是什么?

解决方法

这个方法应该可以解决问题.而不是触发器将执行您指定的任何操作,而不是自动执行删除操作.这意味着手动删除密钥或记录不会被删除是关键.它不会递归运行.它只能在没有启用级联删除的表上完成.基本上,技巧是你加入id字段的原始表,以便从删除的伪表中无法访问的字段中获取数据.
create table dbo.mytesting (test_id int,sometext text)
go
create table dbo.myaudit (test_id int,sometext text)
go
insert into dbo.mytesting
values (1,'test')
go

Create Trigger audit_Table_Deletes on dbo.mytesting INSTEAD OF delete  
as 
if @@rowcount = 0 return; 
Insert into dbo.myaudit (test_id,sometext) 
Select d.test_id,t.sometext from deleted d 
join dbo.mytesting t on t.test_id = d.test_id

Delete dbo.mytesting where test_id in (select test_id from deleted)
go

delete dbo.mytesting where test_id = 1
select * from dbo.mytesting
select * from dbo.myaudit 
Go 

drop table dbo.mytesting
drop table dbo.myaudit

如果您可以将字段更改为varchar(max)或nvarchar(max),这是最佳解决方案.不推荐使用Text和ntext,应该在下一版本中从sql Server中删除它们.

猜你在找的MsSQL相关文章