2012-02-29 5 views
0

Я пишу триггер в базе данных Sybase ASE, которая запускает обновление и сравнивает значение до и после обновления. Я делаю это, чтобы проверить, действительно ли обновление изменило данные. Если это так, он добавляет строку в таблицу мониторинга. К сожалению, триггер работает только в том случае, если команда обновления влияет только на 1 строку. Если это затрагивает более чем одну строку я получаю эту ошибку:sybase update trigger - проверить несколько строк для обновления

Msg 512, Level 16, State 5: 
Server 'myserver', Procedure 'myproc', Line 2: 
Subquery returned more than 1 value. This is illegal when the subquery follows =, !=, <, <= , >, >=, or when the subquery is used as an expression. 

мой прок выглядит следующим образом:

create trigger mytrigger on mytable for update as 

set nocount on 

/* now do the insert if colum was updated */ 
if update(col_a) and (select col_a from inserted) not in (select col_a from deleted) 
begin 
    insert into monitoring_table (login,tablename,field,action,pstamp) 
     select suser_name(),'mytable','col_a','U',getdate() from inserted 
end 
/* now do the insert if colum was updated */ 
if update(col_b) and (select col_b from inserted) not in (select col_b from deleted) 
begin 
    insert into monitoring_table (login,tablename,field,action,pstamp) 
     select suser_name(),'mytable','col_b','U',getdate() from inserted 
end 
go 

любая идея, как я могу обойти эту проблему нескольких обновлений в моем триггере?

+0

поставить все SP пожалуйста , –

+0

@aF. я отредактировал код выше – dom

ответ

2

если ошибка в триггере, то следующее должно работать: вместо:

if update(col_a) and (select col_a from inserted) not in (select col_a from deleted) 

использование

if update(col_a) and exists (select col_a from inserted where col_a not in (select col_a from deleted)) 
+0

, это не работает - все равно получите ту же ошибку: – dom

+0

отредактировал мой ответ. попробуйте пожалуйста. – Vikram

+0

Это было мое решение, попробуйте @dom –

1

Это должно работать:

create trigger mytrigger on mytable for update as 

set nocount on 

/* now do the insert if colum was updated */ 
if update(col_a) and (select col_a from inserted where col_a not in (select col_a from deleted) 
begin 
    insert into monitoring_table (login,tablename,field,action,pstamp) 
     select suser_name(),'mytable','col_a','U',getdate() from inserted 
end 
/* now do the insert if colum was updated */ 
if update(col_b) and (select col_b from inserted where col_b not in (select col_b from deleted) 
begin 
    insert into monitoring_table (login,tablename,field,action,pstamp) 
     select suser_name(),'mytable','col_b','U',getdate() from inserted 
end 
go 
Смежные вопросы