【问题标题】:SQL Server triggersSQL Server 触发器
【发布时间】:2009-11-06 12:47:07
【问题描述】:

在 INSERT、UPDATE 和 DELETE 之后,我正在 SQL Server 中创建触发器。有没有办法知道触发器代码是否在插入更新或删除语句上运行,因为我需要在每种情况下都有不同的行为,或者我需要为它们中的每一个创建一个触发器。

提前致谢,

保罗

【问题讨论】:

  • 您好,感谢您的所有回答,它们都是正确的,但我想知道触发器内是否存在一个自动标志,告诉我们正在运行什么语句。例如在 PostGreSQL 中,我们可以使用 IF(tg_op = 'INSERT') 来了解触发器是否正在运行并插入。非常感谢大家...

标签: sql-server triggers


【解决方案1】:

有称为 INSERTED 和 DELETED 的数据集。根据调用触发器的操作,这些数据集中有数据。对于更新,IIRC,原始数据在 DELETED,新数据在 INSERTED。

见here。

【讨论】:

    【解决方案2】:

    如果您需要实现“不同的行为”,那么尝试只编写 1 个触发器而不是每个操作一个触发器有什么意义?

    【讨论】:

      【解决方案3】:

      您可以访问逻辑上的临时“插入”和“删除”表。

      如果两个表中都有一些行,则表示其已更新。

      您可以通过选择查询“插入”表来获取新值。

      Select * from inserted
      

      您可以通过查询“已删除”表来获取正在更新的旧值。

      Select * from deleted
      

      【讨论】:

        【解决方案4】:

        如果更适合您,您可以使用 AFTER 关键字为每个事件指定单独的触发器。

        例如:-

        CREATE TRIGGER FooIns ON TableBar
        AFTER INSERT
        
        CREATE TRIGGER FooUpd ON TableBar
        AFTER UPDATE
        

        【讨论】:

        • 触发器是邪恶的,如果我们只能使用一个,我们只能使用一个触发器。
        • 触发器是邪恶的,我完全不要使用它们。但是,如果您要使用它们,将它们分开并有条理有助于维护
        • 如果有能力的开发人员正确使用触发器,它不会是邪恶的。
        【解决方案5】:

        正如 devio 所说,如果您对 INSERT 和 DELETE 执行不同的操作,则可以使用两个触发器。只需在 CREATE TRIGGER 行之后指定 FOR INSERT 或 FOR DELETE。

        如果您想使用一个触发器,那么正如 Ismail 所暗示的,您可以检查在触发器内提供给您的临时“插入”和“删除”表的值。

        如果“已删除”表为空,则此触发器由 INSERT 语句触发; 如果“deleted”不为空且“inserted”表为空,则触发器由 DELETE 语句触发。 如果两者都不为空,则将使用 UPDATE 语句。

        【讨论】:

          【解决方案6】:

          只需使用单独的触发器!有人提到触发器是邪恶的,但是如果您开始包含复杂的代码来尝试确定操作(插入/更新/删除),它们会变得更加邪恶 如果将来有人在您的触发器上工作,他们只会质疑 WTF他是不是想制造不必要的复杂性!

          另外值得记住的是,更新会影响多行,因此当触发触发器时,“已删除”和“插入”表可以有很多行!

          【讨论】:

            猜你喜欢
            • 2010-12-11
            • 1970-01-01
            • 1970-01-01
            • 2015-04-25
            • 2015-01-31
            • 2023-04-07
            • 1970-01-01
            • 2021-10-20
            相关资源
            最近更新 更多