Log de alteração - Quem fez, o que foi feito e quando foi feito

(tnelson) #1

Estou querendo fazer um log de alterações da aplicação, para saber quem fez, o que foi feito e quando foi feito. Estou utilizando mysql e fiz através de triggers. Está funcionando sem problemas, mas o usuário que ele salva nas triggers é somente um, o da conexão. Ou seja, eu não estou conseguindo ter a informação de quem fez. Estou utilizando o sistema de login disponibilizado pela sc. Qual seria a forma mais prática de fazer esse log de alterações, seja através do sc, seja através do bando de dados.

Thiago

(Haroldo) #2

envie como montou suas triggers.

(alcvieira) #3

Eu tenho feito pelo SC n sei se é a melhor forma mas tem funcionado muito bem.
Coloco no eventos (Inclusao, alteracao e exclusao) faco um INSERT na tbllog e um abraço!

Grato

(system) #4

Na página da NetMake, na Base de Conhecimento, na categoria Aplicações, há um exemplo de Log do Sistema, inclusive com o arquivo de exportação da aplicação para download, o qual você poderá importá-lo para o seu Sistema.
Fiz algumas modificações para atender aos meus propósitos.
Tenho, agora, um poderoso arquivo de log de sistema!

Espero ter ajudado.

(DanielLN) #5

Pelo sistema de log da netmake dá pra saber o que o usuário fez, quando, e em qual aplicação do sistema, mas não dá pra saber em específico quais dados foram alterados ou excluídos.
Estou usando triggers, mas o código simplesmente não funciona (não indica erro de sintaxe mas também não executa o que foi programado). Assim fica difícil saber o que acontece…
Segue o código:

DELIMITER $$
CREATE TRIGGER cliente_trig_log AFTER update
ON cliente
FOR EACH ROW BEGIN
insert into cliente_log
(cnpj_cpf,tipo_pessoa,fantasia_nome,razao_sobrenome,ie_rg,endereco,numero,
complemento,bairro,cidade,estado,cep,site,email,fone_principal,fone_secundario)
VALUES
(OLD.cnpj_cpf,OLD.tipo_pessoa,OLD.fantasia_nome,OLD.razao_sobrenome,OLD.ie_rg,OLD.endereco,OLD.numero,
OLD.complemento,OLD.bairro,OLD.cidade,OLD.estado,OLD.cep,OLD.site,OLD.email,OLD.fone_principal,OLD.fone_secundario);
END$$
DELIMITER ;

A tabela cliente_log possui a mesma estrutura da tabela cliente.
Estou usando: WindowsXP PRO / SC4 / MySQL5.1. Como interface gráfica do MySQL uso o SQLyog.
Alguém pode me dar uma mãozinha? Já estou agradecendo desde agora! Valeu!

(Eduardo Alves) #6

Vou “seguir” esse topico…estou estudando TRIGGERS. tenho algumas simples mais preciso me aperfeiçoar no assunto, para ao inves de usar o metodo habitual (do scriptcase, apresentando no site do fabricante), sem duvidas trigger parece ser muito mais funcional.

(Haroldo) #7

para gravar o usuario se faz necessário ter o campo user_id em cada tabela, e alimentqaar esse campo pelo SC.

Eu uso uma única tabela de log, do tipo ‘engine archive’, e num campo texto tenho o antes e o depois.

(Haroldo) #8

Segue um exemplo de minhas triggers:


– Definition of trigger log_insert_vendedores

DROP TRIGGER /*!50030 IF EXISTS */ log_insert_vendedores;

DELIMITER $$

CREATE DEFINER = root@% TRIGGER log_insert_vendedores AFTER INSERT ON vendedores FOR EACH ROW begin
DECLARE xxx TEXT;
Set @xxx=’’;
set @xxx=concat(@xxx,‘Vendedor:’,new.descricao_vendedor,’
');
insert into LogSysTab values (new.user_id,‘vendedores’,‘I’,now(),@xxx);
end $$

DELIMITER ;


– Definition of trigger log_update_vendedores

DROP TRIGGER /*!50030 IF EXISTS */ log_update_vendedores;

DELIMITER $$

CREATE DEFINER = root@% TRIGGER log_update_vendedores AFTER UPDATE ON vendedores FOR EACH ROW begin
DECLARE xxx TEXT;
Set @xxx=’’;
if new.descricao_vendedor <> old.descricao_vendedor then
set @xxx=concat(@xxx,‘Vendedor:’,old.descricao_vendedor,’ --> ‘,new.descricao_vendedor,’
‘);
end if;
if new.endereco_vendedor <> old.endereco_vendedor then
set @xxx=concat(@xxx,‘Endereco:’,old.endereco_vendedor,’ --> ‘,new.endereco_vendedor,’
‘);
end if;
if new.cidade_vendedor <> old.cidade_vendedor then
set @xxx=concat(@xxx,‘Cidade:’,old.cidade_vendedor,’ --> ‘,new.cidade_vendedor,’
‘);
end if;
if new.bairro_vendedor <> old.bairro_vendedor then
set @xxx=concat(@xxx,‘Bairro:’,old.bairro_vendedor,’ --> ‘,new.bairro_vendedor,’
‘);
end if;
if new.cep_vendedor <> old.cep_vendedor then
set @xxx=concat(@xxx,‘Cep:’,old.cep_vendedor,’ --> ‘,new.cep_vendedor,’
‘);
end if;
if new.estadoid <> old.estadoid then
set @xxx=concat(@xxx,‘UF:’,old.estadoid,’ --> ‘,new.estadoid,’
‘);
end if;
if new.fone_vendedor <> old.fone_vendedor then
set @xxx=concat(@xxx,‘Fone:’,old.fone_vendedor,’ --> ‘,new.fone_vendedor,’
‘);
end if;
if new.celular_vendedor <> old.celular_vendedor then
set @xxx=concat(@xxx,‘Celular:’,old.celular_vendedor,’ --> ‘,new.celular_vendedor,’
‘);
end if;
if new.email_vendedor <> old.email_vendedor then
set @xxx=concat(@xxx,‘Email:’,old.email_vendedor,’ --> ‘,new.email_vendedor,’
‘);
end if;
if new.comissao_vendedor <> old.comissao_vendedor then
set @xxx=concat(@xxx,‘Comissao:’,old.comissao_vendedor ,’ --> ‘,new.comissao_vendedor ,’
');
end if;
insert into LogSysTab values (new.user_id,‘vendedores’,‘U’,now(),@xxx);
end $$

DELIMITER ;


– Definition of trigger log_delete_vendedores

DROP TRIGGER /*!50030 IF EXISTS */ log_delete_vendedores;

DELIMITER $$

CREATE DEFINER = root@% TRIGGER log_delete_vendedores BEFORE DELETE ON vendedores FOR EACH ROW begin
DECLARE xxx TEXT;
if old.user_id<>0 Then
set @xxx=’’;
set @xxx=concat(‘Tecnico:’,old.descricao_vendedor,’
');
insert into LogSysTab values (old.user_id,‘vendedores’,‘D’,now(),@xxx);
end if;
end $$

DELIMITER ;

(Eduardo Alves) #9

Opa mano… vou fazer uns testes aqui vlw…um abração e um otimo final de semana “procê”…

(Eduardo Alves) #10

Estou tentando trabalhar com uma trigger simples onde tenho uma tabela principal com a seguinte estrutura:

Tabela adm_os

id, id_cliente, data_atendimento, bairro

e a tabela que ira receber os valores da trigger:

Tabela alteracoes_os

data, id_os, old_id_cliente, new_id_cliente, old_data_atendimento, new_data_atendimento, old_bairro, new_bairro

Gostaria de montar uma trigger para saber as ultimas alterações que foram feitas conforme os campos acima citados.

tentei:

DELIMITER $$

USE nome_do_banco$$

DROP TRIGGER /*!50032 IF EXISTS */ tg_update_os$$

CREATE
/*!50017 DEFINER = ‘root’@‘localhost’ */
TRIGGER tg_update_os AFTER UPDATE ON adm_os
FOR EACH ROW BEGIN
INSERT INTO alteracoes_os
(new_data_atendimento)
VALUES
(NEW.data_atendimento);
END;
$$

Mais não estou sabendo como colocar tanto o old.valores como o new.valores juntos (problema por não conhecer estrutura de triggers)

Se alguem puder me dar uma mão, agradeço…vlw

DELIMITER ;

(Haroldo) #11

old.nome do campo -> contem ovalor antes da alteração ou exclusão
new.nome do campo -> contem o valor depois da alteração, exclusão ou inclusão.

(Eduardo Alves) #12

Fala mano…!!! blz…!!!

vou montar aqui, e estando OK, posto para o pessoal…um abração brother…

(Eduardo Alves) #13

Fechou… deu 99% certo…

so uma duvida…meu primeiro campo é DATA. como eu faço para passar a data da atualização para esse campo ??? (data atual)…

vlw cara…

(Haroldo) #14

cria o campo data do tipo timestamp e coloque no default CURRENT_TIMESTAMP (MySql)

(Eduardo Alves) #15

Matou como sempre, meu brother… fechou 100%…muito obrigado NOVAMENTEEEE cara…!!! um abraço…!!!

(Eduardo Alves) #16

Não querendo abusar e ja abusando, como não coloquei parametro nenhum na TRIGGER, ele está gravando todas as vezes que aperta o botão ATUALIZAR. Queria ver se é possivel ele gravar somente quando ele verificar que os campos realmente tiveram alterações. ou seja um IF. Como montar essa estrutura nesta TRIGGER ?

DELIMITER $$

USE nome_banco$$

DROP TRIGGER /*!50032 IF EXISTS */ tg_update_os$$

CREATE
/*!50017 DEFINER = ‘root’@’%’ */
TRIGGER tg_update_os AFTER UPDATE ON adm_os
FOR EACH ROW BEGIN
INSERT INTO alteracoes_os
(id_os,old_id_usuario,new_id_usuario,old_data_atendimento,new_data_atendimento,old_hora_atendimento,new_hora_atendimento,old_solicitante,new_solicitante,
old_usuario,new_usuario,old_autorizado,new_autorizado,old_destino_inicial,new_destino_inicial,old_cidade,new_cidade,old_bairro,new_bairro,old_destino_final,
new_destino_final,old_valor_pagamento,new_valor_pagamento,old_valor_faturado,new_valor_faturado,old_id_pagamento,new_id_pagamento,old_status,new_status)
VALUES
(NEW.id,OLD.id_usuario,NEW.id_usuario,OLD.data_atendimento,NEW.data_atendimento,OLD.hora_atendimento,NEW.hora_atendimento,OLD.solicitante,NEW.solicitante,
OLD.usuario,NEW.usuario,OLD.autorizado,NEW.autorizado,OLD.destino_inicial,NEW.destino_inicial,OLD.cidade,NEW.cidade,OLD.bairro,NEW.bairro,OLD.destino_final,
NEW.destino_final,OLD.valor_pagamento,NEW.valor_pagamento,OLD.valor_faturado,NEW.valor_faturado,OLD.id_pagamento,NEW.id_pagamento,OLD.status,NEW.status);
END;
$$

DELIMITER ;

(Haroldo) #17

coloque um if na frente insert

(sedese) #18

Haroldo,

A sua tabela de VENDEDORES possui o campo user_id também?

Na trigger log_insert_vendedores você usa o campo user_id.

CREATE DEFINER = root@% TRIGGER log_insert_vendedores AFTER INSERT ON vendedores FOR EACH ROW begin
DECLARE xxx TEXT;
Set @xxx=’’;
set @xxx=concat(@xxx,‘Vendedor:’,new.descricao_vendedor,’
');
insert into LogSysTab values (new.user_id,‘vendedores’,‘I’,now(),@xxx);
end $$

(wanderlanlima) #19

Em todas as tabelas que quero saber quem fez o que, tenho campos:
usu_alteracao, usu_inclusao, data_inclusao, data_alteracao
Só na delecao crio um arquivo de log só pra isso.