我的触发器是如何被删除的?

时间:2011-06-29 07:05:18

标签: sql-server tsql sql-server-2008 triggers

如果你能弄清楚这一个你是一个真正的SQL大师!这是我见过的最奇怪的事情之一。

我在数据库中的表中添加了一个触发器。服务器是SQL 2008.触发器没有做任何特别棘手的事情。只需在更改某些字段时更改表​​中的LastUpdated字段。这是一个“更新后”触发器。

有一个大型C ++遗留应用程序可以对这个数据库运行各种大量查询。不知何故(我完全不知道如何)它正在删除此触发器。它不会删除任何其他触发器,我确定它没有明确地删除触发器或表。这个应用程序的开发人员甚至不了解我的触发器。

这怎么可能?

我尝试使用SQL Server Profiler运行跟踪,并且我已经完成了它发送的每个命令并使用SQL Management Studio运行它们但我的触发器不受影响。它似乎只在我运行应用程序时发生。 WTF :(

更新:

抱歉,我不想浪费你的时间。我刚刚意识到,如果我更改了触发器的名称,那么它就不会被删除。此外,如果我修改触发器,使它根本不做任何事情,那么它仍然会被删除。从这里我只能猜测其他开发人员明确地删除它但我搜索了跟踪的触发器名称,它不在那里。我会麻烦他们,看看他们说什么。感谢您的建议。

更新2:

其他开发人员认为他们没有明确删除它。它在sys.objects或sys.triggers中不存在,因此它不是SSMS的故障。如此困惑:(猜猜我只是重命名并希望最好的?想不​​出其他任何事情可以尝试。下面的一些评论询问触发器是被删除还是被禁用或不工作。正如我所说,它被完全删除。此外,问题与触发器的实际内容无关。正如我所说的,我删除了内容并替换了一些非常简单的代码,它们什么也没做,然后它仍然被删除。

干杯
标记

3 个答案:

答案 0 :(得分:4)

思想:

  • 删除触发器需要ALTER权限=不应由应用
  • 使用
  • 可以使用ALTER TABLE
  • 禁用触发器
  • 通过在开始时测试@@ ROWCOUNT来捕获虚拟更新等,可能会混淆触发器
  • 触发器仅针对单行进行编码,并且似乎不会运行
  • 触发器是否存在于sys.objects / sys.triggers中:不依赖于SSMS中的对象资源管理器
  • 如果删除并重新创建表,则可以删除触发器
  • 触发器不会触发TRUNCATE TABLE

答案 1 :(得分:1)

我遇到了一个相同的问题,我追溯到创建脚本,错过了最终的GO声明。

脚本1

IF EXISTS (....)
    DROP PROC MyProc
GO

CREATE PROC MyProc
.....
/* GO statement is missing */

脚本2

IF EXISTS (....)
    DROP TRIGGER MyDisappearingTrigger
GO

CREATE TRIGGER MyDisappearingTrigger
.....
GO

当我在对象资源管理器中检查MyProc时,它看起来像这样:

CREATE PROC MyProc
AS
...

IF EXISTS (....)
    DROP TRIGGER MyDisappearingTrigger
GO

所以这意味着每次调用存储过程时触发器也会被删除。

答案 2 :(得分:-1)

在表中检查MERGE命令会导致触发器获取错误