2013-12-12 3 views
0

У меня есть триггер после вставки в Таблице 1, который будет вставлен в Таблицу 2, после того, как столбец обновления в таблице 1 обновится в Таблице 2 Status_Column, где Table1.id = table2.id, после удаления строки в таблице1 удалит строку в таблице2, где table1 .id = table2.id.Мой триггер не работает

create TRIGGER mytrigger 
     ON Table1 
     after UPDATE,INSERT,DELETE 
    AS 
    Begin 
     if update (columnA) 
      BEGIN 
      SET NOCOUNT ON; 
       declare @ID int 
       select @ID = ID from DELETED  
       UPDATE Table2 
       SET T2.Status_Column ='Updated' 
       From Table2 T2 
       inner join Table1 T1 on T1.ID = T2.ID 
       where T1.ID = @ID 
      End 
     else if exists (select * from inserted) 
      Begin 
      declare @table2_ID int 
      select @table2_ID = ID from inserted  
       insert into table2 (ID,Status_Column) values (@table2_ID,'New') 
      End 
     else if exists (select ID from deleted) 
      Begin 
       delete from table2 
       from table2 T2 , Deleted d 
       where t2.id= d.id 
      End 
    End 

Только ВЕЬЕТЕ работает :(

+0

«вставлены» и «удалены» являются таблицами, чтобы они могли представлять результаты операций набора. Проектирование триггера в предположении, что они всегда будут содержать ровно одну строку, как правило, плохой план. Если вы абсолютно уверены, что никогда не будет больше одной строки, добавьте проверку количества строк и используйте «RaIsError», чтобы явным образом сообщить тем, кто пришел позже, чтобы попытаться выполнить неприемлемое утверждение. ('if (выберите значение Count (*) из вставленного)> 1 RaIsError ('FooTable_Insert: обрабатывается не более одной строки.', 25, 42) с log') – HABO

+0

Функция UPDATE() возвращает true как для INSERT, так и для UPDATE, поэтому вашей логике потребуется небольшая работа. – HABO

+0

@HABO, что вы предлагаете для изменения этого триггера? – Interaoi

ответ

0

Ваш фундаментальный недостаток в том, что вы, кажется, ожидает триггер для стрельбы один раз в строке - это НЕ случае в SQL Server Вместо. , триггер срабатывает один раз в заявлении и псевдотаблица Deleted может содержать несколько строк.

Учитывая, что этой вкладке le может содержать несколько строк, которые вы ожидаете, будут выбраны здесь?

select @ID = ID from DELETED   

Это не определено - вы можете получить значения из произвольных строк в Deleted.

Вам необходимо переписать весь триггер со знанием DeletedWILL содержит несколько строк! Вам нужно работать с множеством операций - не ожидайте только одной строки в Deleted!

+0

Я изменил else, если существует (выберите * из вставленного) в if (выберите * из вставленного), и все будет работать, но если я обновлю обновление триггера и вставить в то же время .. что изменилось бы и на работу? – Interaoi

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