【问题标题】:T-SQL TRY-CATCH not working in DDL triggerT-SQL TRY-CATCH 在 DDL 触发器中不起作用
【发布时间】:2013-08-30 21:28:58
【问题描述】:

我有一个 DDL 触发器来审核对服务器上发生的 DDL 事件的任何更改。

触发器中的代码读取事件数据并将其写入表。

我想将该操作包装在 TSQL try-catch 中,因此如果它因任何原因失败,那么我会将故障记录到 SQL 日志中,但让操作通过,但它似乎不起作用。 我已经在使用 if exists 来确保我需要写入的表仍然存在,但我想捕获任何不可预见的错误并使触发器尽可能健壮。

DDL 触发器的工作方式似乎与普通 T-SQL 不同,并且似乎不支持 TRY-CATCH 块。

以下代码在 SP 中可以正常工作,但在 DDL 触发器中则无法正常工作。

BEGIN TRY
-- Simulate an error
RAISERROR ('Just a test!', 14, 1);
END TRY

BEGIN CATCH
DECLARE @errorNumber INT = ERROR_NUMBER()
DECLARE @errorMessage NVARCHAR(2048) = ERROR_MESSAGE() + '('
    + CAST(ERROR_NUMBER() AS NVARCHAR) + ')'

-- Log the error to the SQL server event log
EXEC master..xp_logevent 50005, @errorMessage, WARNING
END CATCH; 

有什么想法吗?

【问题讨论】:

  • 根据我使用CATCH 的经验,如果您在catch 中没有THROW 错误,它将执行您在catch 块中指定的任何内容,但不会标记作业失败。

标签: sql sql-server tsql triggers ddl


【解决方案1】:

您不能从触发器http://technet.microsoft.com/en-us/library/ms186244.aspx 中使用 xp logevent 看备注说明原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多