这是一个非常奇怪的问题。我在此之前已经问过这件事: How did my trigger get deleted?
我重命名了我的触发器,我认为它已经停止发生,但问题似乎又回来了。这是一个描述:
如果你能弄清楚这一个你是一个真正的SQL大师!这是我见过的最奇怪的事情之一。
我在数据库中的表中添加了一个触发器。服务器是SQL 2008.触发器没有做任何特别棘手的事情。只需在更改某些字段时更改表中的LastUpdated字段。这是一个“更新后”触发器。
有一个大型C ++遗留应用程序可以对这个数据库运行各种大量查询。不知何故(我完全不知道如何)它正在删除此触发器。它不会删除任何其他触发器,我确定它没有明确地删除触发器或表。这个应用程序的开发人员甚至不了解我的触发器。
这怎么可能?
我尝试使用SQL Server Profiler运行跟踪,并且我已经完成了它发送的每个命令并使用SQL Management Studio运行它们但我的触发器不受影响。它似乎只在我运行应用程序时发生。 WTF :(
其他开发人员认为他们没有明确删除它。它在sys.objects或sys.triggers中不存在,因此它不是SSMS的故障。如此困惑:(猜猜我只是重命名并希望最好的?想不出其他任何事情可以尝试。下面的一些评论询问触发器是被删除还是被禁用或不工作。正如我所说,它被完全删除。此外,问题与触发器的实际内容无关。正如我所说的,我删除了内容并替换了一些非常简单的代码,它们什么也没做,然后它仍然被删除。
干杯 标记
答案 0 :(得分:2)
查找表格丢失 - 您可能会对实际导致表格丢弃的原因感到惊讶。 (与通过SSMS UI执行的操作不同,而不是直接使用tsql。)
你可以防止这种不经意的表丢失如下: 工具 - >选项 - > Designers->取消选中“防止保存需要重新创建表的更改”
答案 1 :(得分:2)
也许您可以在数据库上创建DDL trigger并记录所有对象删除语句。特别是,您可以将drop events写入表中以进行记录以跟踪它,或者只是将其阻止。
答案 2 :(得分:1)
其他应用程序代码是否会丢弃并重新创建整个表?如果是这样,也许它不知道触发器。
答案 3 :(得分:0)
感谢大家的建议。特别是Billinkc关于创建DDL触发器的建议很酷。我不知道存在这样的事情。
无论如何,经过3个月的想知道WTF正在进行中,我终于找到了它的底部。希望这会让某人大笑:)
我有一堆脚本来创建各种触发器。它们具有“if trigger exists then delete”,“go”,然后是“create trigger”和另一个“go”的典型格式。我使用脚本一次性将所有这些单独的触发器添加到数据库中。我错过了create命令底部的一个“go”命令(在所有这几百行中)。这意味着触发器A被添加到数据库中,其中“如果触发器B存在,则删除”。经典!那个令人困惑的人......
干杯
标记