2012-12-16 25 views
3

這可能是一個愚蠢的問題,但它讓我追逐我的尾巴。SQL:觸發引用2個表

Order表和產品表,如果訂購數量的股票數量超過然後...

我可能一派50個關鍵詞,檢查3本書籍,不能找到這樣做的方式。這是我試圖做的前提,而不是我嘗試過的。

CREATE TRIGGER tr_check_qty 
ON order_details 
FOR INSERT,UPDATE 
AS 
IF (SELECT quantity FROM inserted) > products.quantity_in_stock 
    BEGIN 
     PRINT 'Orderded quantity cannot exceed quantity in stock' 
     ROLLBACK TRANSACTION 
    END 

我可以在哪裏加入他們?我試過20種不同的方法,試着在前面聲明一個變量,我找不到一種方法來做到這一點。

乾杯。

+0

MSDN正是你所需要的。看看示例C:http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx –

+0

考慮存儲過程作爲觸發器的更簡單的替代方法。如果您使用存儲過程更新訂單行,那麼首先修改以檢查庫存是否相當容易。 – Andomar

+1

想想你總是可以同時插入多個記錄到表中,甚至可能影響不同的產品。你的觸發方法並不能反映這種可能性,但它必須。涉及「插入」或「刪除」和*的每個觸發器都不是一個集合操作*是嚴重缺陷的。在設計觸發器之前,您必須定義如果有人插入20條記錄會發生什麼情況,其中有些記錄是好的,有些則不是。 (如果您只想允許單記錄插入,則可以使用存儲過程。) – Tomalak

回答

3

你可以這樣做:

CREATE TRIGGER tr_check_qty ON order_details 
FOR INSERT,UPDATE 
AS 
BEGIN 
    -- rollback transaction if any product type in order exceeds stock amount 
    IF EXISTS (
    SELECT 
     * 
    FROM 
     inserted 
     INNER JOIN products ON inserted.product_id = products.product_id 
    GROUP BY 
     products.product_id 
    HAVING 
     SUM(inserted.quantity) > MAX(products.quantity_in_stock) 
) 
    BEGIN 
    PRINT 'Ordered quantity cannot exceed quantity in stock' 
    ROLLBACK TRANSACTION 
    END 
END 

它同時適用於單行插入和多行插入。

+0

您需要使用MIN(),MAX()或AVG()來存放products.quantity_in_Stock,否則您將多次計入quantity_in_stock。 – StrayCatDBA

+0

@StrayCatDBA你是對的。固定。 (感謝提示!) – Tomalak