SQL触发器不起作用

时间:2016-08-05 08:46:38

标签: sql tsql database-trigger

我创建了以下触发器,以便如果Sales.OrderDetails表中的任何项目的unitprice小于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);  

它接受它,触发器不会抛出错误,尽管它的unitprice小于10且decount大于5。

我在这里缺少什么?

4 个答案:

答案 0 :(得分:3)

这里有多个错误。

  1. 您的触发器是after触发器。意味着它只会在插入或更新行后执行。
  2. 您正在停止使用if @@ROWCOUNT > 0 return;
  3. 更新行时执行的触发器
  4. 这是你不想要触发器的东西,而是一个检查约束。
  5. 更改您的表格以添加一个检查约束,当单价低于10时,该约束将阻止折扣价值大于5。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

删除if (@@rowcount=0) return; ,将其更改为

format_output

答案 3 :(得分:1)

@@rowcount下没有声明,因为[ { Latitude: '3.59288601404616', Longitude: '98.6827551573515', Latitude1: '3.5828173285855724', Longitude1: '98.69136337190866', }, { Latitude: '3.65865664490563', Longitude: '98.6652326211333', Latitude1: '3.5828173285855724', Longitude1: '98.69136337190866', } ] 大于0然后返回