如果触发器失败,SQL知道什么语句激活了触发器

时间:2014-04-07 00:37:27

标签: c# sql .net sql-server triggers

我在C#应用程序中使用SQL Server,我正在使用批处理语句。我遇到的问题是在语句失败的情况下,无论出于何种原因,我需要知道哪个语句失败并返回它。

我设法做了这个,我在SQL语句周围放了一个try catch(所以如果它失败就不会退出)然后C#cmd.ExecuteQuery返回受影响的行数。

我现在遇到的问题是,如果由于触发器而发生故障,则触发器位于原始批次的try catch之外,因此不会被捕获,但会被捕获由C#应用程序。此时,批次的状态在边缘丢失,整个事情都失败了。

我需要一些方法来了解哪个语句(或到目前为止受影响的行数,或批处理中的索引)触发了导致异常的触发器。无论我在SQL还是C#中都可以做些什么,我都愿意接受。

感谢。

2 个答案:

答案 0 :(得分:1)

这不是一个答案,但它对评论来说太大了,需要格式化。

  

说我有一个声明,例如BEGIN TRY INSERT INTO JAZZHANDS VALUES(2)END TRY BEGIN CATCH END CATCH。如果表JAZZHANDS具有在其他表中插入任何内容的触发器,则如果该触发器失败,则它将不会循环返回并从原始插入中捕获到CATCH中。交易完全失败

我不知道你为什么这么认为。以下SQL:

create table JazzHands (ID int not null,constraint CK_ID_JH CHECK (ID < 10))
go
create table JazzHands2 (ID int not null,constraint CK_ID_JH2 CHECK (ID < 5))
go
create trigger T_JazzHands on JazzHands after insert
as
    insert into JazzHands2(ID)
    select ID from inserted
go
--1
begin try
    insert into JazzHands (ID) values (11)
    PRINT 'No error 1'
end try
begin catch
    Print 'error 1'
end catch
go
--2
begin try
    insert into JazzHands (ID) values (6)
    PRINT 'No error 2'
end try
begin catch
    Print 'error 2'
end catch
go
--3
begin try
    insert into JazzHands (ID) values (1)
    PRINT 'No error 3'
end try
begin catch
    Print 'error 3'
end catch
go

产地:

(0 row(s) affected)
error 1

(0 row(s) affected)

(0 row(s) affected)
error 2

(1 row(s) affected)

(1 row(s) affected)
No error 3

两个表都包含一行。这与您的断言相反,当表中的某些内容阻止插入成功,或者表中的触发器内的某些内容阻止插入成功时,发生完全相同的错误处理,它通常难以区分。


如果您确实有一个实际示例,其中触发器的失败产生的行为与直接在桌面上失败的行为不同,请在您的问题中编辑这样的示例。

答案 1 :(得分:0)

你要找的是最后一句话,对吧?您可以通过调用DBCC INPUTBUFFER从触发器内部获取此信息。

另请参阅这是否有帮助:

SELECT session_id, TEXT
FROM sys.dm_exec_connections
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS ST