【问题标题】:How to put CREATE TRIGGER into TRY-CATCH block with TRANSACTION?如何使用 TRANSACTION 将 CREATE TRIGGER 放入 TRY-CATCH 块中?
【发布时间】:2019-08-13 09:56:10
【问题描述】:

我不是 SQL 高级程序员,也许我的问题很愚蠢,但我在 google 中没有找到答案。我们有一些用于实现更改包的 SQL 结构:

...
BEGIN TRY
    BEGIN TRANSACTION;
    <User Code Is Here>
    ...
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ...
END CATCH;
...

我怎样才能正确放置 CREATE TRIGGER 块链而不是 &lt;User Code Is Here&gt;

-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   ...
   SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   ...
   SET NOCOUNT OFF;
END
GO

目的是创建所有触发器或不创建任何触发器,如果​​失败,则在 CATCH 代码块中打印消息。

已编辑

错误是:

  1. 在第一个触发器的BEGINSQL80001:“BEGIN”附近的语法不正确。期待外部。
  2. 第一次触发后,GOSQL80001:'GO' 附近的语法不正确。
  3. END TRYSQL80001:“TRY”附近的语法不正确。期待对话。
  4. END CATCH: SQL80001: 'CATCH' 附近的语法不正确。期待对话。

【问题讨论】:

  • 如果在 的位置添加所有的 create... 脚本,它不起作用吗?
  • @GeorgeMenoutis 不,它没有。我会在 Edited 部分写一个错误
  • 您使用的是什么平台和版本?我在sql server上没见过这种错误...
  • Visual Studio 2017 (v 15.9.9) 或 SSMS v 17.9 - 两种环境都有错误

标签: sql-server tsql transactions try-catch database-trigger


【解决方案1】:

您需要在单独的范围/批处理中运行每个 create table 语句(因为它必须是批处理中的第一个语句)。因此,您还必须转义触发器定义中的任何引号:

BEGIN TRY
    BEGIN TRANSACTION;
    exec sp_executesql N'CREATE TRIGGER trTable1_Dates ON dbo.Table1
    AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       //An empty string in here has to be '''' to escape the quotes
       SET NOCOUNT OFF;
    END'

    exec sp_executesql N'CREATE TRIGGER trTableN_Dates ON dbo.TableN
    AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       ...
       SET NOCOUNT OFF;
    END'
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ...
END CATCH;

事务与批处理和嵌套范围正交,因此事务也涵盖了每个 EXEC 内部发生的所有活动。

【讨论】:

  • Damien,为什么在触发器创建查询之间放置“GO”不起作用?奇怪的是,我得到了Incorrect syntax near the keyword 'TRIGGER',但是第二个(!!)触发器被创建了。
  • @GeorgeMenoutis - 因为GO 不是 T-SQL 构造 - 它告诉客户端工具如何将脚本拆分成批次以提交给服务器。 TRY/CATCH 块不能跨越批次边界。您的第二批(在GO 之后)以CREATE TRIGGER 开头,因此创建了触发器。
猜你喜欢
  • 2016-03-24
  • 2013-11-14
  • 2014-05-19
  • 2011-08-31
  • 2019-03-30
  • 2010-12-15
  • 2011-07-09
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多