2016-08-05 154 views
1

我已经创建了如下触发这样如果在Sales.OrderDetails表中的任何项目都有一个单价低于10,就不能有折扣大于0.5度:SQL触发器不工作

create trigger Sales.tr_SalesOrderDetailsDML 
on Sales.OrderDetails 
After insert, update 
as 
begin 
    if @@ROWCOUNT > 0 return ; 

    set nocount on;  
    if exists (select oi.orderid 
      from inserted as oi 
      where oi.unitprice < 10.0 and oi.discount > 0.50) 
    Throw 50002, 'Order can''t have discount more than 5 if unit price is less than 10', 10; 

end; 
go 

当我插入下面一行:

INSERT INTO Sales.OrderDetails (orderid,productid,unitprice,qty,discount) 
VALUES (10249, 16, 9.00, 1, 0.90); 

它接受它,触发不会抛出错误,尽管事实上,它的单价低于10 decount是大于5

什我在这里错过吗?

回答

3

您有多个错误在这里。

  1. 您的触发器是一个after触发器。这意味着它只会在该行已被插入或更新后才执行。
  2. 当更新行时,您正在停止要执行的触发器,其中if @@ROWCOUNT > 0 return;
  3. 这是您不想触发的事物,但是是一个检查约束。

改变你的表中增加一个检查约束,以防止折扣的价值更大然后5时单价不到10

ALTER TABLE Sales.OrderDetails 
ADD CONSTRAINT CHK_UnitPriceAndDiscount 
CHECK (unitprice > 10 OR discount < 0.5) 
GO 
+0

像这样:约束Cons_PriceLessDicount 检查(单价> 10或者dicount <0.50); ? –

+1

我不明白评论。只要它是一个有意义的名字,你可以随心所欲地调用contstraint。 –

+0

我已经在约束代码中写了约束代码,它可以在alter code中添加 –

1

检查此行if @@ROWCOUNT > 0 return ;如果受影响的行大于0,将立即返回...因此附加逻辑将不会执行。与if @@ROWCOUNT = 0

1

删除RowCount >0更换,将其更改为

if (@@rowcount=0) return; 
1

它不是做if @@ROWCOUNT > 0 return ;下语句,因为@@rowcount大于0,则返回