Fórum Fazer log de todas as ações que o usuário fez #147738

20/03/2003

0

Bom dia, estou com o seguinte Problema,
Eu tenho um sistema rodando em um cliente e agora ele quer fazer auditoria mensa, ´Porque tá sumindo valores´, ai ele quer que toda vez que um usuário Cadastrar,alterar ou excluir alguma coisa o sitema guarde isso pra auditoria ..

Alguém tem alguma dica como fazer???? Obrigado


Anonymous

Anonymous

Responder

Posts

20/03/2003

Aroldo Zanela

Bom dia, estou com o seguinte Problema, Eu tenho um sistema rodando em um cliente e agora ele quer fazer auditoria mensa, ´Porque tá sumindo valores´, ai ele quer que toda vez que um usuário Cadastrar,alterar ou excluir alguma coisa o sitema guarde isso pra auditoria .. Alguém tem alguma dica como fazer???? Obrigado

Qual é o banco de dados?


Responder

Gostei + 0

20/03/2003

Anonymous

Firebir 1.0


Responder

Gostei + 0

20/03/2003

Aroldo Zanela

Firebir 1.0

Caro Gênimo,

Não conheço o FireBird/Interbase, portanto, não sei se ele tem recursos nativos para auditoria. Vou considerar que não, então:

1. Crie uma tabela para armazenar: data, hora, operacao (alteração e exclusão) e um blob para guardar um conteúdo XML;
2. Como o Delphi ainda não é orientado a aspecto e sim a objetos, vai ter que colocar código nos eventos beforeedit e before post das tabelas/consultas para ´fotogravar´ o registro antes da efetivação da ação do método envolvido;
3. Não vejo necessidade de armazenar o registros novos sem alterações.

Isso é apenas uma sugestão. Você deverá receber várias opções para resolver isso. O pessoal que usa interbase deve ter algo mais apropriado, coloque sua dúvida naquele fórum também.


Responder

Gostei + 0

20/03/2003

Anonymous

O que vc quer dizer com fotografar ?

Quardar a imagem da tela??

valeu pela dica um abraço...


Responder

Gostei + 0

20/03/2003

E_gama

Se vc utiliza BDE e o componente TDatabase, tem umas funcoes de ´callback´ que vc pode utilizar para fazer o log de todas as transações no banco de dados.

Na minha aplicação utilizo esse recurso. Tenho um log diário com com todas as operações efetuadas.

segue um exemplo do log gerado:

----- 02/09/2002 10:03:21
UPDATE CLIENTE SET REG_CODIGO=?,CLI_EMAIL=?,VDO_CODIGO=?,CLI_DIA=?,CLI_DTATU=?,ATV_CODIGO=? WHERE CLI_CODIGO=?
 REG_CODIGO, 1
 CLI_EMAIL, teste@teste2.com.br
 VDO_CODIGO, 4
 CLI_DIA, Quarta
 CLI_DTATU, 9/2/2002 10:3:21:0
 ATV_CODIGO, 101
 CLI_CODIGO, 81
UPDATE CLIENTE SET REG_CODIGO=?,CLI_EMAIL=?,VDO_CODIGO=?,CLI_DIA=?,CLI_DTATU=?,ATV_CODIGO=? WHERE CLI_CODIGO=?



Responder

Gostei + 0

20/03/2003

Anonymous

Eu não uso BDE uso IBX será que funciona a mesma coisa ?


Responder

Gostei + 0

20/03/2003

E_gama

Esses componentes IBX ficam na paleta Interbase ?

Se sim, verifique no componente IBDatabase, a propriedade TraceFlags. Essa propriedade define o ´nível´ de rastreamento que ser quer fazer no banco de dados.

A funcao abaixo, habilita a funcao callback para fazer o log:

  Database1.TraceFlags := [tfQPrepare, tfQExecute, tfDataIn];

  Check(DbiRegisterCallBack(
    nil,                         //Cursor (Optional)
    cbTRACE,                     //Type of Callback
    LongInt(0),                  //Pass-through client data
    sizeof(TCallBackInfo),       //Callback buffer len
    @cbinfo,                     //Pointer to callback function
    @RotinaLog                   //Call back fn being registered
    ));


Verifque aí no IBX se é isso mesmo. Qualquer coisa, lhe passo a rotina completa.


Responder

Gostei + 0

20/03/2003

Anonymous

Ok vou tentar ?

Brigado!!!!

ha, é da palheta ibx mesmo....!!!!!


Responder

Gostei + 0

20/03/2003

Anonymous

Desculpe
Quis dizer Interbase!!


Responder

Gostei + 0

20/03/2003

E_gama

Olhe o trecho da minha aplicação que cuida do Log:


implementation

type TCallBackInfo = record
       Categoria: Integer;
       TotalLen : Word;
       Msg      : array[0..8192] of Char;
     end;
type pCallBackInfo = ^TCallBackInfo;

var sqlInicio   : string;

function RotinaLog(ecbType : CBType; iClientData : LongInt;
  pCbInfo : pCallBackInfo): CBRType; stdcall;

var ArqLog, S, Aux_S, sLog: string;
    I, J: Integer;
    F: TextFile;
    InicioComando: Boolean;

begin
  InicioComando := False;
  S := StrPas(pCbInfo^.Msg);

  // Descarta select´s
  Aux_S := UpperCase(S);
  if (Pos(´RDB$´, Aux_S) > 0) or (Pos(´SELECT´, Aux_S) > 0 ) then
     Exit;

  sLog := ´´;

  // Checa parâmetros
  I := Pos(´Param´, S);
  if (sqlInicio <> ´´) and (I > 0) then
     begin
       J := Pos(´Name´, S);
       Delete(S, 1, J + 6);
       J := Pos(´Type´, S);
       sLog := ´ ´ + Copy(S, 1, J - 1);
       J := Pos(´Data´, S);
       Delete(S, 1, J + 6);
       sLog := sLog + S;
     end
  else
     begin
       Aux_S := UpperCase(S);
       I := Pos(´UPDATE´, Aux_S);
       if I = 0 then
          begin
            I := Pos(´INSERT´, Aux_S);
            if I = 0 then
               I := Pos(´DELETE´, Aux_S);
          end;

       if I > 0 then
          begin
            InicioComando := True;
            Delete(S, 1, I - 1);
            sLog := S;
            if sqlInicio = ´´ then
               sqlInicio := S
            else
               if S = sqlInicio then
                  begin
                    InicioComando := False;
                    sqlInicio := ´´;
                  end;
          end;
     end;

  if sLog <> ´´ then
     begin
       sLog := StringReplace(sLog, #$D$A, ´[CR][LF]´, [rfReplaceAll]);
       if InicioComando then
          sLog := ´----- ´
                + FormatDateTime(´dd/mm/yyyy hh:nn:ss´, Now)
                + $D$A
                + sLog;
       if DirLog_Trans <> ´´ then
          ArqLog := DirLog_Trans
       else
          ArqLog := DirLog;
       AssignFile(F, ArqLog);
       if not FileExists(ArqLog) then
          Rewrite(F)
       else
          Append(F);
       WriteLn(F, sLog);
       Flush(F);
       CloseFile(F);
     end;
end;


procedure TDM_DADOS.DataModuleCreate(Sender: TObject);
var cbinfo: TCallBackInfo;
    F     : TextFile;
    Ini   : TIniFile;

begin
  DirLog_Trans := ´´;

  Database1.Connected  := True;
  Database1.TraceFlags := [tfQPrepare, tfQExecute, tfDataIn];

  Check(DbiRegisterCallBack(
    nil,                         //Cursor (Optional)
    cbTRACE,                     //Type of Callback
    LongInt(0),                  //Pass-through client data
    sizeof(TCallBackInfo),       //Callback buffer len
    @cbinfo,                     //Pointer to callback function
    @RotinaLog                   //Call back fn being registered
    ));

end;



Responder

Gostei + 0

20/03/2003

Dor_poa




Responder

Gostei + 0

20/03/2003

Anonymous

vc pode criar arquivos txt e jogar numa pasta o nome do usuario e o que ele fez

var
dir, arq : string;
txt : TextFile;
sai_00, usu_00, ent_00 : string ;
begin

dir := ´digitar aonde vai ser salvo o arquivo´;
if not DirectoryExists(Dir) then //se nao existe entao é
ForceDirectories(dir); //criado na linha abaixo

sai_00 := datetimetostr(now()); //joga em uma variavel a data atual
arq := usu_00+´.txt´; //cria o arquivo txt com o nome do usuario

//na linha abaixo ele verifica se o arquivo existe senao ele cria

if not fileexists(´diretorio mais o arquivo´+arq) then
begin
AssignFile(Txt, ´diretorio´+arq);
Rewrite(txt);
Writeln(txt, ´Usuário ´+usu_00+´ ---- ´+´Entrada ´+ent_00+´ ---- ´+´Saída ´+sai_00);
closefile(txt);
end
else
begin
AssignFile(Txt, ´diretorio´+arq);
Append(txt);
Writeln(txt, ´Usuário ´+usu_00+´ ---- ´+´Entrada ´+ent_00+´ ---- ´+´Saída ´+sai_00);
closefile(txt);
end;

close;


Treze 132935706


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar