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

Responder a