0
我試圖在SQL Server中創建一個而不是刪除觸發器,它將在從第一個表中刪除項目之前檢查第二個表中項目的值/數量。我一直無法在表格之間創建連接。任何人都可以識別我的代碼有什麼問題嗎?我會很感激任何幫助。而不是在SQL Server中使用多個表刪除觸發器
CREATE TRIGGER tr_delete_orders
ON orders
INSTEAD OF DELETE
AS
DECLARE @del_qty INT
SET @del_qty = orders.order_id
FROM DELETED
JOIN order_details ON order_details.order_id=orders.order_id
IF (SELECT order_details.quantity FROM DELETED) >= 1
BEGIN
PRINT 'You may not delete items that have quantity in the order_detail table.'
ROLLBACK TRANSACTION
END;
你的觸發器有**主要**缺陷,你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**觸發一次**,所以如果你的'DELETE'語句影響了25行,你將觸發**觸發一次**,但是'Deleted'僞表每個將包含25行。您的代碼在這25行中選擇哪一個? 'SET @del_qty = orders.order_id FROM DELETED' - 它是非確定性的,你會得到一個任意的行,並且所有24個其他的都被忽略。你需要重寫你的觸發器來考慮這個問題! –
您還需要注意觸發器內的回滾。如果執行刪除的代碼正在等待事務處理,那麼當事務在觸發器中回滾時將失敗。我會建議使用RAISERROR。 –
還有一個問題,您將加入DELETED到order_details.order_id = orders.order_id的Order_details。您需要將「訂單」替換爲「刪除」,因爲這是您加入的表格。 –