删除后删除触发器只会触发吗?

问题描述:

我认为“删除后”意味着触发器不会被解雇,直到删除已经发生之后,但这里是我的情况...删除后删除触发器只会触发吗?

我在C#中删除触发器后发了3个几乎相同的SQL CLR,其中工作了一个月左右的精美。突然之间,三个中的一个停止工作,同时在其上运行自动删除工具。

停止工作,我的意思是,记录不能通过客户端软件从表中删除。禁用触发器会导致删除被允许,但重新启用它会干扰删除的能力。

所以我的问题是'这怎么可能是这种情况?'是否有可能在其上使用的工具破坏了内存?它似乎即使触发器抛出一个异常,如果它是删除后,不应该记录消失?

所有触发看起来是这样的:

ALTER TRIGGER [sysdba].[AccountTrigger] ON [sysdba].[ACCOUNT] AFTER DELETE AS 
EXTERNAL NAME [SQL_IO].[SQL_IO.WriteFunctions].[AccountTrigger] 
GO 

的CLR触发做一个选择,一个插入到另一个数据库。我还不知道SQL Server Mgmt Studio是否有任何错误,但在我发现后会更新这个问题。

UPDATE:

好以后再执行上述相同的触发代码,一切再次工作,所以我可能永远不会知道任何错误SSMS会给什么。

另外,在触发器代码中的任何地方都没有回调。

后,意味着它只是在事件之后,它仍然可以回滚

例如

create table test(id int) 
go 


create trigger trDelete on test after delete 
as 

print 'i fired ' 
rollback 

执行插入

insert test values (1) 

现在删除数据

delete test 

H ERE是从触发

输出我解雇

消息3609,级别16,状态1,行

在触发器中结束交易。该批次已被中止。

现在检查表,并确认没有删除

select * from test 

的CLR触发不一个选择和 一个插入到另一个数据库中。我 不知道是否有任何来自SQL Server Mgmt Studio的错误 ,但在我发现后将更新该问题。

突然之间,三个中的一个停止了 的工作,同时在其上运行了自动删除工具 。

触发器触发每个批次/语句不是每行,是否有可能触发器没有编码为多行操作,并且自动化工具在批次中删除了多于一行?看看Best Practice: Coding SQL Server triggers for multi-row operations

下面是一个例子,这将使触发失败没有做明确的回滚

alter trigger trDelete on test after delete 
as 

print 'i fired ' 
declare @id int 
select @id = (select id from deleted) 
GO 

插入一些行

insert test values (1) 
insert test values (2) 
insert test values (3) 

来看,这种

delete test 

我解雇了 Msg 512,Level 16,State 1,Procedure trDelete,Line 6

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

该声明已终止。

检查表

select * from test 

没有删除

+0

是的,我知道您可以回滚事务,但我没有回滚它?有没有这种情况会自动发生? – Brandi 2010-05-05 14:57:05

+0

是的,请参阅附加代码 – SQLMenace 2010-05-05 15:11:06

+0

非常感谢。 :) – Brandi 2010-05-05 15:12:56

AFTER DELETE触发器中的错误将回退事务。这是在他们被删除之后但在变更提交之前。有没有什么特别的原因让你使用CLR触发器?这似乎是一个纯粹的SQL触发器应该能够以一种可能更轻量级的方式来完成的事情。

+0

其实,我有很多很好的理由去做我所做的事情。我不知道为什么有人总是赞扬只能批评的人,但原因之一是:最初我确实有SQL触发器 - 它偶尔会挂起,而c#在SQL读取器上有一个自动超时。其次,我需要写入一个文件(虽然后来我改变了这个要求),并产生了一个命令行进程,该进程收集从SQL Server登录信息转换而来的Windows用户数据。最后,我异步生成我的C#进程,以便即使它挂起,也不会影响用户。 – Brandi 2010-05-05 15:04:10

+0

我没有批评。我问你是否有任何使用CLR触发器的特殊原因。我不知道你为什么如此自信,如果你确信他们是很好的理由。 – 2010-05-05 16:47:23

那么你不应该做的触发器选择(谁将会看到的结果),如果你正在做的是插入它不该也不是CLR触发器。在触发器中使用CLR通常不是好事,除非你需要做一些t-sql无法处理的东西,这在触发器中使用t-SQL代码要好得多,无论如何这在触发器中可能是个坏主意。

你是否恢复到源代码管理中的最新版本?也许这会清除问题,如果它已经损坏。

+0

我需要“SELECT HOST_NAME()”的信息。我确实有源代码管理,所以这不是一个担心。 – Brandi 2010-05-05 15:06:25