se você tem mais de 200 campos numa tabela, recomendo que considere a
hipótese de remodelar o seu sistema.

On 5/29/07, Rildo Santos Santos <[EMAIL PROTECTED]> wrote:

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




--
Atenciosamente,
Sebastian Selau Webber Colombo

Sl 67.1-2: "Ó Deus, tem misericórdia de nós e abençoa-nos! Trata-nos com
bondade.
Assim o mundo inteiro conhecerá a tua vontade, e a tua salvação será
conhecida por todos os povos".
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a