Ir para conteúdo

Arquivado

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

Robson Rodrigues

(Postgres) Função de Auditoria

Recommended Posts

Olá pessoal.

 

Estou usando uma função para fazer a auditoria das tabelas. A função é bem bacana pois dessa forma só preciso criar uma tabela de auditoria e criar as triggers para as tabelas de desejo auditar.

 

O problema esta quando a modificação na tabela é um update, pois nessa função só traz os campos que foram alterados (o que é ótimo) só que eu preciso que mostre o id(chave primaria) da tabela que foi alterada.

 

Por exemplo tenho a tabela produtos:

ID,Descritivo,preco

Se eu alterar o preco do id 5, preciso que na tabela de auditoria vá o id(5) é o preço.

 

A função em questão é essa:

CREATE OR REPLACE FUNCTION public.fn_auditoria () RETURNS trigger AS

$body$

DECLARE

v_new text[];

v_old text[];

v_fields hstore;

v_fields_old hstore;

BEGIN

CASE TG_OP

WHEN 'INSERT' THEN

v_fields = hstore(NEW);

WHEN 'UPDATE' THEN

v_fields = hstore(array[]::text[]);

v_fields_old = hstore(array[]::text[]);

v_new = hstore_to_matrix(hstore(NEW));

v_old = hstore_to_matrix(hstore(OLD));

FOR i IN 1..array_upper(v_new, 1) LOOP

RAISE NOTICE 'Value of % is %', v_new[1], v_new[2];

IF (v_new[2] <> v_old[2]) THEN

v_fields = v_fields || hstore(v_new[1], v_new[2]);

v_fields_old = v_fields_old || hstore(v_old[1], v_old[2]);

END IF;

END LOOP;

WHEN 'DELETE' THEN

v_fields = hstore(old);

END CASE;

 

INSERT INTO auditoria(

tabela,

type,

usuario,

estacao,

ip_estacao,

ordem,

campos)

VALUES(

TG_TABLE_NAME,

substr(TG_OP, 1, 1),

current_setting('app.usuario'),

current_setting('app.estacao'),

current_setting('app.ip_estacao'),

'NOVO',

v_fields);

 

INSERT INTO auditoria(

tabela,

type,

usuario,

estacao,

ip_estacao,

ordem,

campos)

VALUES(

TG_TABLE_NAME,

substr(TG_OP, 1, 1),

current_setting('app.usuario'),

current_setting('app.estacao'),

current_setting('app.ip_estacao'),

'ANTIGO',

v_fields_old);

 

 

RETURN NULL;

END;

$body$

LANGUAGE 'plpgsql'

VOLATILE

CALLED ON NULL INPUT

SECURITY INVOKER

COST 100;

 

Alguem tem alguma ideia de como pegar esse campo?

 

Obrigado

 

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.