Boa tarde a todos
Estou fazer um script de auditoria, mais o que acontece é que tenho tabela
com mais de 200 campos, então está ficando muito braçal, sem contar o risco
que estou correndo de deixar algum campo de fora da comparação, como mostra
o script abaixo.
Caso alguém tem uma idéia ou mesmo um script onde esta comparação e feita
dentro de um loop ou algo que não seja tanto braçal, e se o mesmo puder min
enviar um modelo ou mim da uma orientação como fazer isso, ficarei muito
agradecido....
Desde já obrigado!
Rildo..
-- deleta o trigger e as funções
DROP TRIGGER Tg_Mfi_InsUpd_Ant_Tbl_SysEstPr_Tabela_Estado on SysEstPr;
DROP TRIGGER Tg_Mfi_Delete_Dep_Tbl_SysEstPr_Tabela_Estado on SysEstPr;
DROP FUNCTION Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado();
-- cria a função ativada via a tabela de estado
Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado()
CREATE FUNCTION Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado() RETURNS trigger
AS $Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado$
DECLARE -- declaração das variaveis
------Tipo de operação-------
vlStrTpoOpr VARCHAR;
-----------Auditoria---------
vlIntRgsInc INTEGER;
vlIntRgsFnl INTEGER;
vlStrNmeTbl VARCHAR;
vlStrNmeCmp VARCHAR;
vlStrTpoCmp VARCHAR;
vlStrCntTxt TEXT;
BEGIN
IF tg_op <> 'DELETE' THEN
vlStrTpoOpr := 'I';
IF tg_op = 'UPDATE' THEN
vlStrTpoOpr := 'U';
END IF;
----------------Inicio da auditoria----------------------------------
vlStrNmeTbl := 'SysEstPr';
vlIntRgsInc := 1 ;
vlIntRgsFnl := (SELECT MAX(Ordinal_Position) FROM
information_schema.columns where table_name = vlStrNmeTbl);
IF vlIntRgsFnl IS NULL THEN
vlIntRgsFnl := 0;
END IF;
---WHILE vlIntRgsInc <= vlIntRgsFnl LOOP
--vlStrNmeCmp := (SELECT Column_name FROM
information_schema.columns where table_name = vlStrNmeTbl And
Ordinal_Position = vlIntRgsInc);
--vlStrTpoCmp := (SELECT data_type FROM
information_schema.columns where table_name = vlStrNmeTbl And
Ordinal_Position = vlIntRgsInc);
--vlStrCntCmp := 'SELECT ' || vlStrNmeCmp || ' FROM ' ||
vlStrNmeTbl || ' Where ' || vlStrCmpChv || ' = ' || vlStrEstChv ;
--IF vlStrCntTxt
--RAISE Notice ' (%), (%), (%), (%), (%), (%)', vlIntRgsInc,
vlIntRgsFnl, vlStrNmeTbl, vlStrNmeCmp, vlStrTpoCmp, vlStrCntCmp;
--vlIntRgsInc := vlIntRgsInc + 1;
--END LOOP;
vlStrCntTxt := '' ;
IF vlStrTpoOpr = 'U' THEN
IF New.NmeEst <> Old.NmeEst THEN
vlStrCntTxt := 'NmeEst ' || NmeEst.Old;
END IF;
IF New.RgoEst <> Old.RgoEst THEN
vlStrCntTxt := vlStrCntTxt || 'RgoEst ' || Old.RgoEst;
END IF;
IF New.FlgEst <> Old.FlgEst THEN
vlStrCntTxt := vlStrCntTxt || 'FlgEst ' || Old.FlgEst;
END IF;
IF New.ObsEst <> Old.ObsEst THEN
vlStrCntTxt := vlStrCntTxt || 'ObsEst ' || Old.ObsEst;
END IF;
END IF;
IF vlStrTpoOpr = 'I' THEN
INSERT INTO TblLogSs SELECT Current_DataBase(), Current_Schema(),
vlStrNmeTbl, Session_User, Inet_Client_Addr(), Session_User,
New.UsrUltAltEst, now(), New.DtahorUltAltEst, vlStrTpoOpr, '', vlStrCntTxt;
ELSIF vlStrTpoOpr = 'U' THEN
INSERT INTO TblLogSs SELECT Current_DataBase(), Current_Schema(),
vlStrNmeTbl, Session_User, Inet_Client_Addr(), Session_User,
New.UsrUltAltEst, now(), New.DtahorUltAltEst, vlStrTpoOpr, '', vlStrCntTxt;
END IF;
----------------Fimal da auditoria----------------------------------
RETURN NEW;
END IF;
IF tg_op = 'DELETE' THEN
IF (TG_OP = 'DELETE') THEN
RETURN OLD;
END IF;
RETURN OLD;
END IF;
END;
$Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado$ LANGUAGE plpgsql;
-- cria o gatilho Tg_Mfi_InsUpd_Ant_Tbl_SysEstPr_Tabela_Estado
CREATE TRIGGER Tg_Mfi_InsUpd_Ant_Tbl_SysEstPr_Tabela_Estado BEFORE INSERT OR
UPDATE ON SysEstPr
FOR EACH ROW EXECUTE PROCEDURE
Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado();
-- cria o gatilho Tg_Mfi_Delete_Dep_Tbl_SysEstPr_Tabela_Estado
CREATE TRIGGER Tg_Mfi_Delete_Dep_Tbl_SysEstPr_Tabela_Estado AFTER DELETE ON
SysEstPr
FOR EACH ROW EXECUTE PROCEDURE
Fc_Mfi_Atv_Via_Tbl_SysEstPr_Tabela_Estado();
_________________________________________________________________
MSN Busca: fácil, rápido, direto ao ponto. http://search.msn.com.br
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral