Sybase Update Trigger - Проверьте несколько строк для обновления

StackOverflow https://stackoverflow.com/questions/9502651

  •  14-11-2019
  •  | 
  •  

Вопрос

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

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
.

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

Это было полезно?

Решение

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

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))
.

Другие советы

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

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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top