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

Responder a