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
你这里有多个错误。
- 您的触发器是
after
触发器。这意味着它只会在行已被插入或更新后执行。
- 您正在停止更新行时执行的触发器,
if @@ROWCOUNT > 0 return;
- 这是一种您不需要触发器的东西,而是检查约束。
更改您的 table 以添加检查约束,以防止在单价小于 10 时折扣值大于 5。
ALTER TABLE Sales.OrderDetails
ADD CONSTRAINT CHK_UnitPriceAndDiscount
CHECK (unitprice > 10 OR discount < 0.5)
GO
我创建了以下触发器,这样如果 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
你这里有多个错误。
- 您的触发器是
after
触发器。这意味着它只会在行已被插入或更新后执行。 - 您正在停止更新行时执行的触发器,
if @@ROWCOUNT > 0 return;
- 这是一种您不需要触发器的东西,而是检查约束。
更改您的 table 以添加检查约束,以防止在单价小于 10 时折扣值大于 5。
ALTER TABLE Sales.OrderDetails
ADD CONSTRAINT CHK_UnitPriceAndDiscount
CHECK (unitprice > 10 OR discount < 0.5)
GO