SQL Server:更新表尝试删除不存在的触发器

时间:2014-08-29 01:22:08

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

我正在使用Microsoft SQL Server 2008 R2(SP2)。我没有使用SQL Server Management Studio。我正在使用带有textarea的简单网页作为我自己用PHP构建的查询窗口,所以我所做的只是SQL命令 - 没有GUI的东西。从来没有遇到任何问题,我不认为我现在遇到的问题是因为我的PHP。无论如何,我非常感谢SQL代码中的答案,而不是建议我在管理工作室中右键单击表名称的答案,如果你得到我的漂移。

导致问题......

我曾经在表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会寻找不存在的触发器?

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

非常感谢您提供清晰,简洁,自成一体的答案! (嘿,一个人可以做梦,可以吗?)

1 个答案:

答案 0 :(得分:1)

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

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