删除记录而不是删除触发器

问题描述:

我想有一个而不是删除触发器,以便我可以从正在删除的表行中获取文本字段值,以便在发生实际删除时保留这些字段。出于某种原因,我无法将它们从标准删除触发器中的Deleted表中拉出(SQL错误输出)。删除记录而不是删除触发器

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

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

+1

如果我不说别人会这样,那么这里就是这样。 “你可以在sproc中执行此操作吗?为什么要使用触发器而不是在删除之前选择记录?” – 2010-07-16 15:27:07

+1

如果您在使用现有代码时遇到问题,也许您可​​以在此处显示该代码。也许有人会发现一个错误。 – 2010-07-16 15:29:04

这种方法应该做的伎俩。而不是触发器将执行您指定的任何操作,而不是自动执行删除操作。这意味着您手动进行删除是关键,否则记录不会被删除。它不会递归运行。它只能在没有启用级联删除的表上完成。基本上,诀窍是你加入到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(最大)或nvarchar(最大),这是最好的解决办法,但。文本和ntext已被弃用,并应在下一版本中从SQL Server中完全删除。

我曾经需要捕获正在删除的记录;我写了一个触发器,它会记录复制到一个不同的表具有相同的结构,第一个:它去是这样的:

create trigger [delta_del] on [customer] 
for delete 
as 

declare <variables> from deleted; 
open mycurs 
fetch next from mycurs into @v1, @v2 
while (@@fetch_status = 0 
begin 
insert into delta (fields) values (@v1, @v2) 
fetch next from mycursor into @v1, @v2 
end 

close mycursor 
deallocate mycursor 

etc. 
+1

-1对于触发器中的CURSOR,不会看到“text”数据类型 – gbn 2010-07-16 16:58:09

+2

@brismith,光标仅作为最后的手段!你可以用下面的代替你的游标:'insert into delta(... fields ...)SELECT ... fields from deleted'它为从select中返回的每一行插入一行。但是,这会对OP提到的弃用的TEXT数据类型产生问题。 – 2010-07-16 17:45:49

+0

感谢您的提示!我以为我必须遍历逐个记录的批记录,将记录复制到新表 – brismith 2010-07-19 12:26:59

这可能是更好地与AFTER触发器来做到这一点。不太复杂。

如果你有下列表格

CREATE TABLE [dbo].[Data](
[DocumentID] [smallint] NULL, 
[Data] [nvarchar](max) NULL 
) 

CREATE TABLE [dbo].[Audit](
[DocumentID] [smallint] NULL, 
[Data] [nvarchar](max) NULL 
) 

下扳机后应行插入审核表每当行从数据表删除

Create Trigger audit_Table_Deletes on dbo.Data for delete 
as 
if @@rowcount = 0 return; 
Insert into audit (DocumentID, Data) Select DocumentID, Data from deleted; 
Go 
+1

唯一的问题是无法从删除的表中插入文本字段。 – Caveatrob 2010-07-16 16:18:37

+0

“不能在'已插入'和'已删除'表中使用文本,ntext或图像列。” – Caveatrob 2010-07-16 16:19:19

+4

你可以将文本数据转换为nvarchar(max)吗?它看起来像文字ntext和图像数据类型已根据此http://archnet.microsoft.com/en-us/library/bb510662.aspx – etoisarobot 2010-07-16 16:52:59