2014-08-29 109 views
0

我正在使用Microsoft SQL Server 2008 R2(SP2)。我没有使用SQL Server Management Studio。我正在使用一个带有textarea的简单网页作为我自己构建在PHP中的查询窗口,所以我所做的只是SQL命令 - 无需GUI。从来没有遇到过问题,我不认为我现在遇到的问题是因为我的PHP。无论如何,我将非常感谢SQL代码中的答案,而不是那些建议我在管理工作室中右键单击表名的答案,如果你有我的偏差。SQL Server:更新表尝试删除不存在的触发器

导致该问题...

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

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

非常感谢您的明确,简洁和自包含的答案! (嘿,一个人可以梦想,不是吗?)

+0

清晰,简明和自包含的问题要问你 - 你从查询分析器中运行更新查询,但在页面的不同部分,你有DROP TRIGGER语句意外选择,当您按下F5时它不执行您希望的内容? – 2014-08-29 07:29:15

+0

我根本没有使用查询分析器。我基本上把这些命令一个接一个地粘贴到我的HTML textarea查询表单中,并逐个执行每一个。所以我没有强调错误代码的危险...... html textarea中的所有内容都可以运行(并且每次只有一个命令)。 – gcdev 2014-08-29 13:44:17

回答

1

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

EXEC sp_helptext N'trgNewUpdate1'; 
EXEC sp_helptext N'trgNewUpdate2'; 
+0

我会在今天晚上进行调查。感谢您的建议 - 我没有想到这种可能性。 – gcdev 2014-08-29 13:45:11

+0

哇。你很好。谢谢mucho先生。这是问题。 – gcdev 2014-08-29 23:32:51