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

Responder a