Amigos, vcs não entenderam a questão. Estou inserindo o valor OLd e NEW de uma em outra e NÃO SEI O NOME DA COLUNA, peguei ela dinamicamente. O nome da coluna é o valor da variável rec.coluna, por isso não sei como chamar o OLD, entenderam? Não posso rodar OLD.<nome da coluna> simplesmente pois ela é o VALOR da variável!!!
2011/8/18 Victor Hugo <[email protected]> > Roseane, > Acho que vc está cometendo algum erro, pelo meu entender os valores : > NEW – Para INSERT e UPDATE > OLD – Para DELETE > > Já que vc está fazendo insert, vc não terá valor OLD. > > [1] - http://www.postgresql.org/docs/9.0/static/plpgsql-trigger.html > > []'s > Victor Hugo > > Em 18 de agosto de 2011 15:34, Roseane Falcao > <[email protected]> escreveu: > > Pessoal, estou tentando receber o valor OLD e NEW de uma coluna que seu > nome > > está armazenado em uma variável. Tentei através de um SQL dinâmico mas > não > > deu certo. Preciso de ajuda para resolver este problema. Aí vai o trecho > de > > código que quero fazer funcionar. > > Qualquer ajuda é bem vinda. > > CREATE OR REPLACE FUNCTION x.log_table() > > RETURNS "trigger" AS > > $BODY$ > > DECLARE > > rec RECORD; > > BEGIN > > FOR rec IN SELECT > > pg_namespace.nspname as schema, > > pg_class.relname as tabela, > > pg_attribute.attname AS coluna, > > pg_type.typname > > FROM pg_class > > JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid AND > > pg_namespace.nspname not in ('information_schema', > 'pg_catalog','pg_toast') > > AND pg_class.relkind = 'r' > > JOIN pg_attribute ON pg_attribute.attrelid=pg_class.oid > > JOIN pg_type ON pg_attribute.atttypid = pg_type.oid > > where pg_namespace.nspname = TG_TABLE_SCHEMA > > and pg_class.relname = TG_TABLE_NAME > > and pg_type.typname not in ('oid','cid','xid','tid') > > ORDER BY pg_namespace.nspname, pg_class.relname > > LOOP > > > > EXECUTE ('INSERT INTO x.LOG ( > > logtabela > > ,logpk > > ,logtransacao > > ,logdata > > ,logusrid > > ,logcoluna > > ,logvlrantigo > > ,logvlrnovo > > ) > > VALUES ( > > '||TG_TABLE_SCHEMA||'.'||TG_TABLE_NAME||' > > , '||OLD.idexecucao||' > > , '||substring(TG_OP from 1 for 1)||' > > , CURRENT_TIMESTAMP(2) > > , NULL > > , '||rec.coluna||' > > , CAST (OLD.'||rec.coluna||' as character) -- rec.coluna tem como > > valor o NOME da minha coluna > > , CAST (NEW.'||rec.coluna||' as character)'); > > END LOOP; > > RETURN NEW; > > END; > > $BODY$ > > LANGUAGE 'plpgsql' VOLATILE; > > > > Ao rodar deu o seguinte erro: > > ERROR: OLD used in query that is not in a rule > > SQL state: 42601 > > Contexto: SQL statement "INSERT INTO x.LOG ( > > logtabela > > ,logpk > > ,logtransacao > > ,logdata > > ,logusrid > > ,logcoluna > > ,logvlrantigo > > ,logvlrnovo > > ) > > VALUES ( > > x.execucao > > , 3 > > , U > > , CURRENT_TIMESTAMP(2) > > , NULL > > , assunto > > , CAST (OLD.assunto as character) > > , CAST (NEW.assunto as character)" > > PL/pgSQL function "log_execucao" line 26 at execute statement > > Desde já, agradeço. > > _______________________________________________ > > pgbr-geral mailing list > > [email protected] > > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > > > > > > -- > []´s > Victor Hugo > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
