Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabianne

new dinamico em uma trigger

Recommended Posts

Ola..

nao sei se eh possivel fazer isso.. a partir desse laço recupero o nome dos campos de uma tabela atraves das tabelas de sistema do Firebird, no exemplo, FILIAL... a ideia eh fazer uma trigger de insersao e atualizacao dos dados meio q dinamica.. e mais algumas coisas.. mas a questao é.. por exemplo, caso exista um campo CODIGO na tabela, entao ao inves de eu escrever no NEW.CODIGO, eu montar esse new. alguma coisa..

mais ou menos assim :

FOR SELECT (RDB$FIELD_NAME) FROM RDB$RELATION_FIELDS WHERE

RDB$RELATION_NAME = 'FILIAL' INTO :CAMPO DO

BEGIN

 

IF NEW.||:CAMPO = NULL THEN

 

 

END

 

MAS NEW.||:CAMPO nao consigo fazer....

tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

pois eh, a ideia é mais ou menos a mesma.. Segue o código da trigger que fiz, a baixo. Porém, note que ele faz a mesma coisa, tem que ficar fazendo if pra cada campo da tabela, pra verificar se é ou nao null. Podendo eu recuperar os campos das tabelas dinamicamente pelo primeiro código que postei ali encima, eu poderia jogar em um while por ex., e ir verificando se o campo é nulo, entende, com poucas linhas, e melhor, um código dinâmico, onde eu poderia acrescentar campos nas tabelas, sem mexer em mta coisa na trigger depois.

O código abaixo, gera gera uma linha de SQL da alteração feita na tabela PAIS, seja inserção ou atualização.

E jogar essa linha de SQL para uma outra Tabela.

Seria uma mini-replicação para outro banco de dados! Por isso a preocupação de fazer dinamicamente.. ja pensou ter que fazer de todos os campos, de todas as tabelas?? rss

 

*****************************************

 

AS DECLARE VARIABLE SQLEX VARCHAR(520);
DECLARE VARIABLE DADOS VARCHAR(520);
DECLARE VARIABLE CODIGOSQL INTEGER;
DECLARE VARIABLE TERMINAL INTEGER;

BEGIN SELECT MAX (CODIGO +1) FROM SCRIPTSQL INTO :CODIGOSQL;
       if (:CODIGOSQL IS NULL) then
           CODIGOSQL = 1;


       IF (INSERTING) then
       BEGIN DADOS = 'INSERT INTO PAIS VALUES (' || NEW.CODIGO || ',''''' || NEW.DESCRICAO || '''''' || ',''''' || NEW.SIGLA || '''''' || ');';

           FOR SELECT CODIGO FROM TERMINAL INTO :TERMINAL DO BEGIN SQLEX = 'INSERT INTO SCRIPTSQL (CODIGO, SCRIPT, TERMINAL) VALUES ('||:CODIGOSQL||', '||
                       '''' || :DADOS  ||  '''' || ',' || :TERMINAL ||')' ;
               EXECUTE STATEMENT SQLEX;
               CODIGOSQL = :CODIGOSQL + 1;
           END
       END

       IF (UPDATING) then
       BEGIN DADOS = 'UPDATE PAIS SET ';
           SELECT MAX (CODIGO +1) FROM SCRIPTSQL INTO :CODIGOSQL;
           if (NEW.DESCRICAO <> OLD.DESCRICAO) THEN
               BEGIN DADOS = DADOS || 'DESCRICAO = '||'''''' || NEW.DESCRICAO ||'''''' ||',';
               END

           if (NEW.SIGLA <> OLD.SIGLA) then
               BEGIN DADOS = DADOS || 'SIGLA = ' ||''''''|| NEW.SIGLA ||''''''|| ',';
               END


                   DADOS = SUBSTRING (DADOS from 1 for char_length(DADOS)-1) || ' WHERE CODIGO = ' || NEW.CODIGO;
                   FOR SELECT CODIGO FROM TERMINAL INTO :TERMINAL DO BEGIN SQLEX = 'INSERT INTO SCRIPTSQL (CODIGO, SCRIPT, TERMINAL) VALUES ('||
                               '''' || :CODIGOSQL || '''' || ',' ||
                               '''' || :DADOS  ||  '''' || ',' ||
                               :TERMINAL || ')' ;
                       EXECUTE STATEMENT SQLEX;
                   END
           END
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.