[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