Fórum Fazer log de todas as ações que o usuário fez #147738
20/03/2003
0
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
Curtir tópico
+ 0Posts
20/03/2003
Aroldo Zanela
Qual é o banco de dados?
Gostei + 0
20/03/2003
Anonymous
Gostei + 0
20/03/2003
Aroldo Zanela
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
20/03/2003
Anonymous
Quardar a imagem da tela??
valeu pela dica um abraço...
Gostei + 0
20/03/2003
E_gama
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
20/03/2003
Anonymous
Gostei + 0
20/03/2003
E_gama
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
20/03/2003
Anonymous
Brigado!!!!
ha, é da palheta ibx mesmo....!!!!!
Gostei + 0
20/03/2003
Anonymous
Quis dizer Interbase!!
Gostei + 0
20/03/2003
E_gama
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
20/03/2003
Dor_poa
Gostei + 0
20/03/2003
Anonymous
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
Clique aqui para fazer login e interagir na Comunidade :)