这个问题是我见过的最奇怪的事情之一。
我已向数据库中的表添加了一个触发器。服务器是 SQL 2008。触发器不会做任何特别棘手的事情。当某些字段发生更改时,只需更改表中的 LastUpdated 字段。这是“更新后”触发器。
有一个大型 C++ 遗留应用程序针对该数据库运行各种大型查询。不知何故(我完全不知道如何)它正在删除这个触发器。它不会删除任何其他触发器,并且我确信它不会显式删除触发器或表。这个应用程序的开发人员甚至不知道我的触发器。
这怎么可能?
我尝试使用 SQL Server Profiler 运行跟踪,并检查了它发送的每个命令并使用 SQL Management Studio 运行它们,但我的触发器不受影响。它似乎只在我运行应用程序时发生。
我刚刚意识到,如果我更改触发器的名称,它就不会被删除。此外,如果我修改触发器,使其根本不执行任何操作,那么它仍然会被删除。由此我只能猜测其他开发人员正在明确删除它,但我已经在跟踪中搜索了触发器名称,但它不在那里。我去骚扰一下他们,看看他们怎么说。感谢您的建议。
其他开发人员认为他们没有明确删除它。它不存在于 sys.objects 或 sys.triggers 中,因此这不是 SSMS 的故障。很困惑:(猜猜我会重命名它并希望得到最好的结果?想不出其他可以尝试的东西。下面的一些评论询问触发器是否被删除或只是禁用或不起作用。正如我所说,它被完全删除了。而且,问题与触发器的实际内容无关。正如我所说,我删除了内容并替换为一些非常简单的代码,但它不执行任何操作,然后它仍然被删除。
想法:
我遇到了一个相同的问题,我发现创建脚本缺少最后的
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
所以这意味着每次调用存储过程时触发器也会被删除。
检查表中的 MERGE 命令,这会导致触发器出错