【问题标题】:Create or alter trigger if exists如果存在,则创建或更改触发器
【发布时间】:2015-11-03 15:03:54
【问题描述】:

我正在尝试确定是否应该创建或更改和触发。我的代码如下。

IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    ALTER TRIGGER Sales.bonus_reminder
    ON Sales.SalesPersonQuotaHistory
    AFTER INSERT
    AS RAISERROR ('Notify Compensation', 16, 10);
else
    CREATE TRIGGER Sales.bonus_reminder
    ON Sales.SalesPersonQuotaHistory
    WITH ENCRYPTION
    AFTER INSERT, UPDATE 
    AS RAISERROR ('Notify Compensation', 16, 10);

我得到的错误是:

  • else 附近的语法不正确
  • 创建触发器应该是唯一的 批量声明。

这段代码应该是什么样子?

【问题讨论】:

标签: sql sql-server tsql triggers


【解决方案1】:

使用动态 SQL

IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    EXEC('
    ALTER TRIGGER Sales.bonus_reminder
    ON Sales.SalesPersonQuotaHistory
    AFTER INSERT
    AS RAISERROR (''Notify Compensation'', 16, 10)'
    );
else
    EXEC('
    CREATE TRIGGER Sales.bonus_reminder
    ON Sales.SalesPersonQuotaHistory
    WITH ENCRYPTION
    AFTER INSERT, UPDATE 
    AS RAISERROR (''Notify Compensation'', 16, 10)'
    );

【讨论】:

    【解决方案2】:

    如果您不想将 create trigger 语句作为动态 SQL,那么您可以执行以下操作:

    IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
        exec sp_executesql N'DROP TRIGGER Sales.bonus_reminder';
    GO
    
    CREATE TRIGGER Sales.bonus_reminder
        ON Sales.SalesPersonQuotaHistory
        WITH ENCRYPTION
        AFTER INSERT, UPDATE 
        AS RAISERROR ('Notify Compensation', 16, 10);
    

    【讨论】:

    • 我考虑过删除和重新创建,但更改而不是重新创建不是更好吗?或者这没关系?
    • @szpic 。 . . alter 通常会更好。例如,当您删除触发器并重新创建它时,有一段时间可以修改数据并且没有触发器。但在实践中,我非常谨慎地使用触发器。因为它们是任何系统上“维护模式”的一部分,所以我不担心数据的变化。
    • @Sajad 。 . .当然。触发器一直都是这样用来维护汇总表的。
    • 我的想法和你一样,但似乎错了。看看here(编辑的一部分)。没有人不回答我:(!
    【解决方案3】:

    使用this articular 作为我的真实来源。这是简短的答案。

    SQL Server 2016 sp1 开始,您可以在某些数据库对象(stored procedures/functions/triggers/@987654328 @)。

    所以你的脚本可能看起来像

    create or alter TRIGGER Sales.bonus_reminder
        ON Sales.SalesPersonQuotaHistory
        WITH ENCRYPTION
        AFTER INSERT, UPDATE 
        AS RAISERROR ('Notify Compensation', 16, 10)
    

    【讨论】:

    猜你喜欢
    • 2015-09-12
    • 2013-05-26
    • 2018-03-16
    • 2017-05-01
    • 2014-12-05
    • 1970-01-01
    • 2017-01-27
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多