【问题标题】:SQL Server : update table tries to drop nonexistent triggersSQL Server:更新表尝试删除不存在的触发器
【发布时间】:2023-03-04 12:49:01
【问题描述】:

我正在使用 Microsoft SQL Server 2008 R2 (SP2)。我没有使用 SQL Server Management Studio。我正在使用一个带有 textarea 的简单网页作为我自己用 PHP 构建的查询窗口,所以我所做的只是 SQL 命令——没有 GUI 的东西。以前从来没有遇到过问题,我不认为我现在遇到的问题是因为我的 PHP。无论如何,如果您明白我的意思,我将非常感谢 SQL 代码中的答案,而不是建议我在 Management Studio 中右键单击表名的答案。

导致问题...

我曾经在表dbo.MyOldTableName 上有三个触发器:

trgOldUpdate1, trgOldUpdate2, and trgOldInsert

我使用以下代码重命名了表格:

EXEC sp_rename 'dbo.MyOldTableName', 'MyNewTableName';

然后我删除了这三个旧触发器并创建了以下三个新触发器(它们做同样的事情,但指向新表并具有新名称):

trgNewUpdate1, trgNewUpdate2, and trgNewInsert

我运行了这个 SQL,只看到了新的触发器:

SELECT 
    referencing_schema_name, 
    referencing_entity_name,
    referencing_id, 
    referencing_class_desc, 
    is_caller_dependent
FROM 
    sys.dm_sql_referencing_entities ('dbo.MyOldTableName', 'OBJECT');

我运行了这个 SQL 并且旧的触发器不存在:

SELECT * FROM sys.triggers;

以上所有信息都只是背景信息。这是实际的问题。我运行了一个简单的更新命令(比如这个 SQL):

UPDATE [dbo].[MyNewTableName] SET ColumnName = ColumnName;

...并收到以下错误消息:

无法删除触发器“dbo.trgOldUpdate2”,因为它不存在或您没有权限。

无法删除触发器“dbo.trgOldUpdate1”,因为它不存在或您没有权限。

无法删除触发器“dbo.trgOldUpdate1”,因为它不存在或您没有权限。

无法删除触发器“dbo.trgOldUpdate2”,因为它不存在或您没有权限。

  • 首先,为什么 SQL Server 试图在一个简单的更新命令上删除触发器(在你问之前,不,触发器代码本身根本不会删除任何东西)?

  • 二,SQL Server为什么要寻找不存在的触发器?

  • 第三个也是最重要的,我该如何阻止这种情况发生?

非常感谢您提供清晰、简洁和独立的答案! (嘿,一个人可以做梦,不是吗?)

【问题讨论】:

  • 为您提供清晰、简洁和自包含的问题 - 您是否从 Query Analyser 内部运行 UPDATE 查询,但在页面的不同部分您意外选择了 DROP TRIGGER 语句,当您按下F5 它没有执行您希望的操作?
  • 我根本没有使用查询分析器。我基本上已将这些命令一一粘贴到我的 html textarea 查询表单中,并一一执行。所以我没有突出显示错误代码的危险...... html textarea 中的所有内容都会运行(并且一次只有一个命令)。

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


【解决方案1】:

我的猜测是触发器DROP/CREATE 脚本中存在错误,导致旧触发器的 DROP 语句无意中包含在更新触发器之一中。检查新的触发器,看看是否是这种情况:

EXEC sp_helptext N'trgNewUpdate1';
EXEC sp_helptext N'trgNewUpdate2';

【讨论】:

  • 今晚我会调查的。感谢您的建议——我没有想到这种可能性。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多