gpt4 book ai didi

sql - 在“代替删除”触发器中删除记录

转载 作者:行者123 更新时间:2023-12-03 01:18:03 28 4
gpt4 key购买 nike

我想要一个而不是删除触发器,以便我可以从要删除的表行中获取文本字段值,以便在实际删除发生时保留这些字段。由于某种原因,我无法从标准删除触发器中的已删除表中提取它们(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 中完全删除。

关于sql - 在“代替删除”触发器中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com