,您的觸發已經不遠了,但實際上,你可以使用和INSTEAD OF觸發器
創建測試數據
create table product (productId int identity(1,1) constraint PK_product_productId primary key clustered, quantity_in_stock int)
create table order_detail ( order_id int
,productId int constraint FK_order_product_productId foreign key references product (productId)
,quantity int not null)
set identity_insert product on
insert into product (productId, quantity_in_stock) values (1, 100), (2, 25) , (3, 2);
這「工作」(在長期的lossest感) 考慮到馬丁的評論爲quantity_in_stock
需要確定。
CREATE TRIGGER tr_check_qty
ON order_detail
FOR insert, update AS
DECLARE @stock int
DECLARE @neworder int
SELECT @stock = quantity_in_stock
From product
Where productid = (select productid from inserted)
SELECT @neworder = quantity FROM inserted
IF @neworder > @stock
BEGIN
PRINT 'NO WAY JOSE'
ROLLBACK TRANSACTION
END
這些現在都按預期工作......
INSERT order_detail (order_id, productId, quantity)
values
(10044, 1, 30) -- works as stock is 100
,(10044, 3, 1)
insert order_detail (order_id, productId, quantity)
values
(10044, 1, 130) /* fails (CORRECTLY) WITH Msg 3609, Level 16... (transacted ended in the trigger..) */
/* this should work... */
UPDATE order_detail
SET quantity = 30
WHERE order_id = 10044
AND productid = 1
/* this should fail.. */
UPDATE order_detail
SET quantity = 3000 /*< not enough stock. */
WHERE order_id = 10044
AND productid = 1
,並解決馬丁斯第一點這種方式較好:
CREATE TRIGGER tr_check_qty
ON order_detail
FOR insert, update AS
DECLARE @stock int
DECLARE @neworder int
if(exists(select *
from inserted i join product p on i.productId = p.productId
where i.quantity > p.quantity_in_stock))
begin
PRINT 'NO WAY JOSE'
ROLLBACK TRANSACTION
End
感謝您的幫助@Dog Ears和@Martin!你是對的,這是一個任務:p但希望有一天我會達到一個水平,我可以爲他人的家庭作業給出我自己的答案。 :D哦,是的,我有觸發器工作!我在@Dog Ears的建議中提到加入產品並插入表格:DECLARE \t @stock int DECLARE \t @neworder \t int SELECT \t @stock = products.quantity_in_stock從\t產品插入WHERE products.product_id = inserted.product_id SELECT \t @neworder = inserted.quantity從\t插入觸發器工作!再次感謝您的回覆!^_^ – Magi604 2010-12-04 07:37:05