2015-04-06 67 views
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; 
+2

你的觸發器有**主要**缺陷,你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**觸發一次**,所以如果你的'DELETE'語句影響了25行,你將觸發**觸發一次**,但是'Deleted'僞表每個將包含25行。您的代碼在這25行中選擇哪一個? 'SET @del_qty = orders.order_id FROM DELETED' - 它是非確定性的,你會得到一個任意的行,並且所有24個其他的都被忽略。你需要重寫你的觸發器來考慮這個問題! –

+0

您還需要注意觸發器內的回滾。如果執行刪除的代碼正在等待事務處理,那麼當事務在觸發器中回滾時將失敗。我會建議使用RAISERROR。 –

+0

還有一個問題,您將加入DELETED到order_details.order_id = orders.order_id的Order_details。您需要將「訂單」替換爲「刪除」,因爲這是您加入的表格。 –

回答

0

我猜你只想刪除不包含任何訂單明細(數量= 0)的訂單。即使您打算使用每個訂單的刪除功能,觸發器應該能夠刪除許多訂單(如上面的註釋中所指出的)。

CREATE TRIGGER tr_delete_orders 
ON orders 
INSTEAD OF DELETE 
AS 
    delete o 
    from orders o inner join deleted d on d.order_id = o.order_id 
    where not exists (select top 1 
        from order_details od 
        where od.order_id = o.order_id and od.quantity > 0)