我的 SQL Server 触发器如何被删除?

问题描述 投票:0回答:3

这个问题是我见过的最奇怪的事情之一。

我已向数据库中的表添加了一个触发器。服务器是 SQL 2008。触发器不会做任何特别棘手的事情。当某些字段发生更改时,只需更改表中的 LastUpdated 字段。这是“更新后”触发器。

有一个大型 C++ 遗留应用程序针对该数据库运行各种大型查询。不知何故(我完全不知道如何)它正在删除这个触发器。它不会删除任何其他触发器,并且我确信它不会显式删除触发器或表。这个应用程序的开发人员甚至不知道我的触发器。

这怎么可能?

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

更新

我刚刚意识到,如果我更改触发器的名称,它就不会被删除。此外,如果我修改触发器,使其根本不执行任何操作,那么它仍然会被删除。由此我只能猜测其他开发人员正在明确删除它,但我已经在跟踪中搜索了触发器名称,但它不在那里。我去骚扰一下他们,看看他们怎么说。感谢您的建议。

更新2

其他开发人员认为他们没有明确删除它。它不存在于 sys.objects 或 sys.triggers 中,因此这不是 SSMS 的故障。很困惑:(猜猜我会重命名它并希望得到最好的结果?想不出其他可以尝试的东西。下面的一些评论询问触发器是否被删除或只是禁用或不起作用。正如我所说,它被完全删除了。而且,问题与触发器的实际内容无关。正如我所说,我删除了内容并替换为一些非常简单的代码,但它不执行任何操作,然后它仍然被删除。

sql-server t-sql sql-server-2008 triggers
3个回答
4
投票

想法:

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

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

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


-1
投票

检查表中的 MERGE 命令,这会导致触发器出错

© www.soinside.com 2019 - 2024. All rights reserved.