Chamando um sproc para cada registro afetado de dentro do gatilho em Sybase ASA 6
-
20-09-2019 - |
Pergunta
Apenas ter algumas dores de cabeça implementando algo em um gatilho em uma versão antiga do Sybase e se perguntou se alguém poderia ajudar. Em poucas palavras, quero escrever um gatilho que chamará outro SPROC para cada um dos registros afetados (seja inserido, excluído ou ambos [atualizados]).
Uma maneira de fazer isso no T-SQL (SQL Server) seria usar um cursor, mas nenhum dos exemplos do cursor que encontrei na web parece realmente funcionar no Sybase ASA 6.0.4-ou não gosta do T-SQL Em geral ou parece compilar, mas geralmente não faz nada (mesmo com cenários patologicamente simples e artificiais).
Essencialmente, eu quero fazer um loop através de todos os registros de tabela 'inseridos' (se houver) e para cada um Execu Mysproc (inserido.keyid), depois passe por todos os registros de tabela 'excluídos' (se houver) e novamente para cada um Execu mysproc (deleted.keyid).
Alguém tem um exemplo de fazer esse tipo de coisa, ou mesmo apenas usar um cursor somente leitura no ASA 6? O manual on -line parece ter um exemplo de um cursor simples, mas na prática não consegui fazer o exemplo realmente funcionar. EU poderia Uss o outro sproc para o gatilho (não é tão complicado), mas é muito complicado a ser feito como parte de uma instrução 'Select a partir da inserida ...' - é realmente algumas linhas de código por si só. Daí eu pensando que preciso de um cursor de qualquer maneira.
EDITAR: (29/12/09) - Acabei desenrolando o código SPROC, em desespero, mas eu realmente gostaria de ter um exemplo de cursor em Sybase Asa 6 porque, mais cedo ou mais tarde, vou enfrentar algo que não posso facilmente desenrolar. Então eu vou jogar isso para recompensa - pode alguém Dê -me um exemplo de trabalho? :-)
Solução
Parece que você está procurando um gatilho de nível de linha.
Por padrão, os gatilhos no ASA são o nível de declaração (o gatilho é executado uma vez após a conclusão de toda a instrução de acionamento). Os gatilhos do nível da linha, por outro lado, executam uma vez para cada linha que é alterada.
Aqui está um exemplo de gatilho de nível de linha:
CREATE TRIGGER tr_log
AFTER UPDATE OF "myfield"
ON mytable
REFERENCING OLD AS old_data NEW AS new_data
FOR EACH ROW
BEGIN
Insert into Narc_USER_INFO_Change (Field_Changed, New_Value, Original_Value, user)
Values('myfield', new_data.myfield, old_data.myfield, CURRENT USER);
END