2014-12-01 2 views
0

У меня есть тест в моем триггере, который отлично работает для 1 строки, но я не могу понять, как заставить его отказаться от обновления, если несколько строк будут отредактированы.триггер, запрещающий обновление для нескольких строк

Текущий код:

CREATE TRIGGER forecasting.sitenametest 
ON forecasting.sitenames 
AFTER UPDATE 
AS 
    BEGIN 
     if @@ROWCOUNT = 0 
     return 

     SET nocount ON; 

     DECLARE @test INT 
     DECLARE @SiteTest CHAR(8) 

     SELECT @SiteTest = i.sitename FROM inserted i 

     SET @test = CASE 
       WHEN @SiteTest = 'NA  ' THEN 1 
       WHEN OtherTest..   THEN 1 
       ELSE 0 
      END 

     IF @test = 0 
     BEGIN 
      ROLLBACK 
      RAISERROR('Site code not in correct format',16,1) 
     END 
END 

ответ

0

Как насчет теста с снова в ROWCOUNT:

CREATE TRIGGER forecasting.sitenametest ON forecasting.sitenames 
    AFTER UPDATE 
AS 
    BEGIN 
     IF @@ROWCOUNT = 0 
      RETURN 

     SET NOCOUNT ON; 

     SELECT * 
     FROM inserted 
     WHERE sitename IN ('NA  ', 'Other Examples') 

     IF @@ROWCOUNT > 0 
      BEGIN 
       ROLLBACK 
       RAISERROR('Site code not in correct format',16,1) 
      END 

    END 
+0

Вторичные тесты не так просто, как быть в состоянии использовать 'в'. Кроме того, не следует проверять тест на предыдущую строку. – SeanC

+0

Ну, как бы я знал, что по вашему вопросу? @@ ROWCOUNT возвращает предыдущий счетчик строк. –

+0

Первый тест гарантирует, что что-то обновлено, поэтому он не запускается с помощью «обновления», когда 1 = 0', но я не мог понять, как изменить тестовую работу с более чем одной строкой. Ваш ответ заставил меня в правильном направлении, так как я смог сделать «Выбрать * из вставленного» и сохранить этот номер строки, а затем предоставленный вами оператор select позволил мне проверить, равны ли число строк. – SeanC

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