删除记录而不是删除触发器
我想有一个而不是删除触发器,以便我可以从正在删除的表行中获取文本字段值,以便在发生实际删除时保留这些字段。出于某种原因,我无法将它们从标准删除触发器中的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(最大)或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对于触发器中的CURSOR,不会看到“text”数据类型 – gbn 2010-07-16 16:58:09
@brismith,光标仅作为最后的手段!你可以用下面的代替你的游标:'insert into delta(... fields ...)SELECT ... fields from deleted'它为从select中返回的每一行插入一行。但是,这会对OP提到的弃用的TEXT数据类型产生问题。 – 2010-07-16 17:45:49
感谢您的提示!我以为我必须遍历逐个记录的批记录,将记录复制到新表 – 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
唯一的问题是无法从删除的表中插入文本字段。 – Caveatrob 2010-07-16 16:18:37
“不能在'已插入'和'已删除'表中使用文本,ntext或图像列。” – Caveatrob 2010-07-16 16:19:19
你可以将文本数据转换为nvarchar(max)吗?它看起来像文字ntext和图像数据类型已根据此http://archnet.microsoft.com/en-us/library/bb510662.aspx – etoisarobot 2010-07-16 16:52:59
如果我不说别人会这样,那么这里就是这样。 “你可以在sproc中执行此操作吗?为什么要使用触发器而不是在删除之前选择记录?” – 2010-07-16 15:27:07
如果您在使用现有代码时遇到问题,也许您可以在此处显示该代码。也许有人会发现一个错误。 – 2010-07-16 15:29:04