2014-08-29 113 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