O Joao obrigado pela a sua atenção
Tenho uma tabela de auditoria , onde a mesma tem um campo texto, o qual
receberá o nome e valor dos campos que venha ser modificados, pois bem,
para fazer isto estou tendo que comparar campo a campo, neste ponto que
percebo que está errado, pois eu tenho o nome da tabela, consigo pegar o
nome do campo, tenho também o numero de campos que a tabela consiste,
diante destas informações. Quero montar um loop que de acordo que vou
incrementando o número da coluna inicial, venho ter uma nova informação da
coluna seguinte. Algo parecido com Isso. Veja um exemplo simples abaixo onde
consigo pega estás informações
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);
Aqui que o bicho pega, preciso saber de que forma eu tenho acesso ao
valores
Old/New de coluna, pois parece que tenho tudo que preciso para obter
estes valores,
mais infelizmente não estou conseguindo monta o quebra cabeça.
Esta vlStrNmeTbl variável contem o nome da tabela
Esta vlStrNmeCmp variável contem o nome do campo
Esta vlStrTpoCmp variável contem o tipo do campo
Esta vlIntRgsInc variável contem o número da coluna
vlIntRgsInc := vlIntRgsInc + 1;
End
Desde já obrigado !!!
Rildo...
From: "Joao" <[EMAIL PROTECTED]>
Reply-To: Comunidade PostgreSQL Brasileira
<pgbr-geral@listas.postgresql.org.br>
To: "Comunidade PostgreSQL Brasileira"
<pgbr-geral@listas.postgresql.org.br>
Subject: Re: [pgbr-geral] script de auditoria no banco de dados
Date: Tue, 29 May 2007 15:47:11 -0300
explique exatemente o q vc quer!
vc quer dado uma tabela obter seus campos e tipos?
----- Original Message ----- From: "Rildo Santos Santos"
<[EMAIL PROTECTED]>
To: <pgbr-geral@listas.postgresql.org.br>
Sent: Tuesday, May 29, 2007 2:52 PM
Subject: [pgbr-geral] script de auditoria no banco de dados
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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_________________________________________________________________
MSN Messenger: converse com os seus amigos online.
http://messenger.msn.com.br
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral