Boa tarde a todos,
Estamos criando uma função de gatilho para gravar histórico de alterações
de algumas tabelas no banco de dados, mais nós deparamos com um problema
que não estamos conseguindo solução.
Fizemos um SQL para pegar dinamicamente as colunas da tabela para que a
função seja o mais genérica possível a fim de utiliza-lá em qualquer
tabela, até ae tudo bem. O problema surgiu quando tentamos recuperar o
valor OLD usando a coluna dinâmica que foi encontrada pelo SQL Ex.: OLD ||
'.' || record.coluna, fizemos diversos teste e pesquisas mais ainda não
obtivemos sucesso.
Segue um pequeno treco do código:
sql := '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'')
AND pg_attribute.attname = ''assunto''
ORDER BY pg_namespace.nspname, pg_class.relname';
FOR record IN sql LOOP
EXECUTE ('INSERT INTO SIBRATER.LOG (
logtabela
,logpk
,logtransacao
,logdata
,logusrid
,logcoluna
,logvlrantigo
,logvlrnovo
)
VALUES (
'||TG_TABLE_SCHEMA||'.'||TG_TABLE_NAME||'
, ''
, '||substring(TG_OP from 1 for 1)||'
, CURRENT_TIMESTAMP(2)
, NULL
, '||record.coluna||'
, CAST (OLD.'||record.coluna||' as character)
, CAST (NEW.'||record.coluna||' as character)');
END LOOP;
--
Deusimar Ferreira - +55 61 9162 8928 +55 61 2020 0853 +55 61 3388 6975
Analista de Sistemas/Desenvolvedor
CGMI/MDA
"Sem Ele eu não sou nada, mas com Ele eu posso todas as coisas através de
Jesus Cristo, que me fortalece" (Filipenses 4:13)
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral