sybase disparador de atualização - seleção de várias linhas para atualização

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

  •  14-11-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um gatilho em um banco de dados Sybase ASE que aciona uma atualização e compara o valor antes e depois da atualização.Eu faço isso para verificar se a atualização foi, na verdade, alterou os dados.Se este for o caso, adiciona uma linha a um quadro de monitoramento.Infelizmente o gatilho só funciona se o comando update afeta apenas 1 linha.Se está a afectar mais do que uma linha recebo este erro:

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.

minha proc tem esta aparência:

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

alguma idéia de como posso contornar este multi problema de atualização dentro do meu gatilho?

Foi útil?

Solução

se o erro está no gatilho, então, o seguinte deve funcionar:em vez de:

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

utilização

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

Outras dicas

Isso deve funcionar:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top