【问题标题】:Is it possible for triggers not to fire?触发器是否有可能不触发?
【发布时间】:2012-10-23 03:28:31
【问题描述】:

在三个不同的表上,我有单独的 INSERTUPDATEDELETE 触发器。

我肯定知道它们按预期工作(尝试添加、删除、更新并确认更改到日志表)。但是,发生行被删除或添加时,我的日志表没有任何内容。

所以我的问题是:是否可以在不触发启用的 INSERT 触发器的情况下添加记录?

这是在 SQL Server 2005 上。

【问题讨论】:

  • 是否可以在单个语句中插入/删除多条记录?我认为触发器只会在 SQL Server 中的这些情况下触发一次
  • 这个问题的一个常见来源是,当事实证明您编写的触发器只处理inserteddeleted 中的一行时(例如,执行select @var = col from inserted),然后多行语句仅记录触发器中的 一个 行。你能展示你的触发器之一吗?
  • 当然有可能,但总有一个原因(设置未打开、记录锁、代码中的语法等)。您能否提供您的代码和一些上下文来帮助我们了解您的特定问题可能是什么?
  • 如果您在触发器中使用任何逻辑,那么一切皆有可能;)请触发

标签: sql sql-server sql-server-2005 triggers


【解决方案1】:

如果执行的查询禁用了特定触发器的使用,例如通过使用

DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]

此外,正如 Damien 指出的那样,在某些情况下,您的触发器可能仅适用于单个记录。 错误(简化示例:

    UPDATE table SET field = value WHERE PK = (SELECT PK FROM inserted)

更好:

    UPDATE table SET field = value WHERE PK IN (SELECT PK FROM inserted)

向我们展示您的触发器,我们会弄清楚的。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2021-04-10
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多