Fazer log de todas as ações que o usuário fez

Delphi

20/03/2003

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

Curtidas 0

Respostas

Aroldo Zanela

Aroldo Zanela

20/03/2003

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?


GOSTEI 0
Anonymous

Anonymous

20/03/2003

Firebir 1.0


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

20/03/2003

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.


GOSTEI 0
Anonymous

Anonymous

20/03/2003

O que vc quer dizer com fotografar ?

Quardar a imagem da tela??

valeu pela dica um abraço...


GOSTEI 0
E_gama

E_gama

20/03/2003

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=?



GOSTEI 0
Anonymous

Anonymous

20/03/2003

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


GOSTEI 0
E_gama

E_gama

20/03/2003

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.


GOSTEI 0
Anonymous

Anonymous

20/03/2003

Ok vou tentar ?

Brigado!!!!

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


GOSTEI 0
Anonymous

Anonymous

20/03/2003

Desculpe
Quis dizer Interbase!!


GOSTEI 0
E_gama

E_gama

20/03/2003

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;



GOSTEI 0
Dor_poa

Dor_poa

20/03/2003




GOSTEI 0
Anonymous

Anonymous

20/03/2003

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


GOSTEI 0
POSTAR