2016-08-05 2 views
1

Я создал следующий триггер, так что если какой-либо элемент в таблице Sales.OrderDetails имеет UnitPrice менее 10, он не может получить скидку больше, чем .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); 

она принимает его, триггер не бросает ошибку, несмотря на то, что это UnitPrice меньше, чем 10 и decount больше, чем 5.

Wha Мне здесь не хватает?

ответ

3

У вас есть несколько ошибок здесь.

  1. Ваш триггер является триггером after. то есть он будет выполнен только после того, как строка уже вставлена ​​или обновлена.
  2. Вы останавливаете запуск триггера при обновлении строк, с этим if @@ROWCOUNT > 0 return;
  3. Это то, что вам не нужно для запуска триггеров, но контрольное ограничение.

Alter таблицу, чтобы добавить проверочное ограничение, которое предотвратит значение дисконта будет больше, то 5, когда цена единицы меньше 10.

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

Как это: ограничение Cons_PriceLessDicount Check (UnitPrice > 10 или dicount <0,50); ? –

+1

Я не понимаю комментария. Вы можете называть contstraint тем, что хотите, до тех пор, пока это значащее имя. –

+0

Я написал код ограничения в комментарии, который может быть добавлен в код изменения –

1

Проверьте эту строку if @@ROWCOUNT > 0 return ; Это немедленно вернется, если затронутые строки больше 0 ... поэтому дополнительная логика не будет выполнена. Заменить if @@ROWCOUNT = 0

1

это не сделать заявление по if @@ROWCOUNT > 0 return ;, потому что @@rowcount больше 0, то он вернется

Смежные вопросы