Fazer log de todas as ações que o usuário fez
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
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
Curtidas 0
Respostas
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
20/03/2003
Firebir 1.0
GOSTEI 0
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
20/03/2003
O que vc quer dizer com fotografar ?
Quardar a imagem da tela??
valeu pela dica um abraço...
Quardar a imagem da tela??
valeu pela dica um abraço...
GOSTEI 0
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:
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
20/03/2003
Eu não uso BDE uso IBX será que funciona a mesma coisa ?
GOSTEI 0
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:
Verifque aí no IBX se é isso mesmo. Qualquer coisa, lhe passo a rotina completa.
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
20/03/2003
Ok vou tentar ?
Brigado!!!!
ha, é da palheta ibx mesmo....!!!!!
Brigado!!!!
ha, é da palheta ibx mesmo....!!!!!
GOSTEI 0
Anonymous
20/03/2003
Desculpe
Quis dizer Interbase!!
Quis dizer Interbase!!
GOSTEI 0
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
20/03/2003
GOSTEI 0
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
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