我正在使用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查找不存在的觸發器?
第三也是最重要的,我該如何阻止這種情況發生?
非常感謝您的明確,簡潔和自包含的答案! (嘿,一個人可以夢想,不是嗎?)
清晰,簡明和自包含的問題要問你 - 你從查詢分析器中運行更新查詢,但在頁面的不同部分,你有DROP TRIGGER語句意外選擇,當您按下F5時它不執行您希望的內容? – 2014-08-29 07:29:15
我根本沒有使用查詢分析器。我基本上把這些命令一個接一個地粘貼到我的HTML textarea查詢表單中,並逐個執行每一個。所以我沒有強調錯誤代碼的危險...... html textarea中的所有內容都可以運行(並且每次只有一個命令)。 – gcdev 2014-08-29 13:44:17