[firebase-br] LOG via Trigger
Marson Luís
marsonluis em gmail.com
Seg Jan 5 15:54:06 -03 2015
Essa, acho, cabe principalmente ao Cantu.
Recebi um material da 7 FDD atribuída ao Cantu que
exemplifica como criar um log de alterações de tabelas. Como havia a
necessidade de criar uma pequena coleção de funções (Stored Procedures)
optei por tentar inovar mas “empaquei” em um problema.
Veja o código a baixo:
[SQL]
/* Crio um FOR para os campos da tabela */
for select RF.RDB$FIELD_NAME CAMPO
from RDB$RELATION_FIELDS RF
inner join RDB$FIELDS F on (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
where (RF.RDB$RELATION_NAME = '<NOME_DA_TABELA>')
order by RF.RDB$FIELD_POSITION
into :VCAMPO
do
begin
/* Crio as variáveis CONTEXT*/
VTEXTOSQL = 'select RDB$SET_CONTEXT(''USER_SESSION'', ''OLDVALOR'',
coalesce(old.' || trim(:VCAMPO) || ', 0)) from rdb$database';
execute statement :VTEXTOSQL;
VTEXTOSQL = 'select RDB$SET_CONTEXT(''USER_SESSION'', ''NEWVALOR'',
coalesce(new.' || trim(:VCAMPO) || ', 0)) from rdb$database';
execute statement :VTEXTOSQL;
/* Comparo o conteúdo */
if (RDB$GET_CONTEXT('USER_SESSION', 'NEWVALOR') <>
RDB$GET_CONTEXT('USER_SESSION', 'OLDVALOR')) then
begin
if (:VLISTACAMPOS = '') then
begin
VLISTACAMPOS = 'CAMPO(S) ';
end
else
begin
VLISTACAMPOS = :VLISTACAMPOS || ', ';
end
VLISTACAMPOS = :VLISTACAMPOS || trim(:VCAMPO) || ' DE ' ||
RDB$GET_CONTEXT('USER_SESSION', 'OLDVALOR') || ' PARA ' ||
RDB$GET_CONTEXT('USER_SESSION', 'NEWVALOR');
end
/* Tento evitar a exceção caso o SET_CONTEXT tente acessar um campo que não
possui alteração */
when any do
begin
end
end
... Executo o INSERT na tabela de LOG com o obtido no código a cima
[/SQL]
Aí vem o meu problema: o código “WHEN ANY DO ...” parece
matar tudo o que foi feito ...
Eu só queria, dinamicamente, comparar o antes e depois de
cada campo mas, como o acesso a um campo não alterado tem me causado
exceção, resolvi ignorá-las mas, daí, :VLISTACAMPOS que deveria ter a lista
das alterações acabou “sumindo” ...
Alguém, ou o próprio Cantu, tem alguma idéia para
solucionar isso? Se é possível solucionar?
Grato,
Márson de Paula
Mais detalhes sobre a lista de discussão lista