(Postgres) Função de Auditoria
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
Discussão (0)
Carregando comentários...