我有一個像table1
(table1_id, col1, some_ID
),一張桌子和另一table2
(table2_id, col1, table1_id
)SQL Server進行刪除觸發器刪除其他表中的記錄與程序
我有一個過程
PROC deleteTable2(@id int)
AS
BEGIN
DELETE table2
WHERE table1_id = @id
END
我m試圖爲table1
表創建刪除觸發器,所以當我試圖從table1
刪除時,觸發器將刪除table2
中的所有記錄。
我寫了這樣觸發:
CREATE TRIGGER deleteTable1 on table1
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @id int = 0
SELECT @id = del.table1_ID from deleted as del
EXECUTE dbo.deleteTable2 @id
它的工作原理如果有一個some_ID
只有一條記錄,但是如果有更多的記錄,這是行不通的。例如:
delete table1
where some_ID='some value'
此SQL查詢將刪除table1中的所有記錄,並且僅刪除table2中的所有記錄。
這是有道理的,所以我做了CURSOR觸發,像
CREATE TRIGGER deleteTable1 ON table1
FOR DELETE
AS
BEGIN
DECLARE @id int = 0, @CURSOR cursor
SET @CURSOR = CURSOR scroll FOR
SELECT deleted.table1_id
FROM deleted
OPEN @CURSOR
FETCH NEXT FROM @CURSOR into @id
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE dbo.deleteTable2 @id
FETCH NEXT FROM @CURSOR into @id
END
CLOSE @CURSOR
END
但它不工作在所有...也許我只是錯過了一些東西或者我不明白一些細微差別。謝謝。
UPDATE
事實上,這兩個表是在一個分貝,但我有3臺table3 (table3_id, col1, table2_id)
。而這table3
是在其他數據庫,並通過鏈接的服務器連接。因此,當我嘗試調用存儲過程時,此存儲過程調用存儲過程(使用光標)刪除table3
中的記錄。這就是爲什麼我試圖使用存儲過程刪除table2中的記錄的確切原因。
***請*** ......一個觸發器應該**快速,小巧靈活** - 一切都是**光標**絕對不是!請勿在觸發器內使用** CURSOR **(所有內容)來殺死您的系統!這太糟糕了......使用** M.Ali在他的回覆中顯示的** set-based **方法 - **總是**。觸發器內的遊標是任何SQL Server數據庫的**最糟糕的噩夢!從來沒有在任何情況下做到這一點! –
我評論過它。 – bredmann