SQL 触发器不工作

SQL Trigger is Not working

我创建了以下触发器,这样如果 Sales.OrderDetails table 中的任何商品的单价小于 10,它的折扣就不能大于 .5:

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。

我在这里错过了什么?

检查此行 if @@ROWCOUNT > 0 return ; 如果受影响的行大于 0,这将 return 立即...因此不会执行其他逻辑。替换为 if @@ROWCOUNT = 0

删除RowCount >0,将其更改为

if (@@rowcount=0) return;

它不是在 if @@ROWCOUNT > 0 return ; 下做语句,因为 @@rowcount 大于 0 那么它 return

你这里有多个错误。

  1. 您的触发器是 after 触发器。这意味着它只会在行已被插入或更新后执行。
  2. 您正在停止更新行时执行的触发器,if @@ROWCOUNT > 0 return;
  3. 这是一种您不需要触发器的东西,而是检查约束。

更改您的 table 以添加检查约束,以防止在单价小于 10 时折扣值大于 5。

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