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

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

envie como montou suas triggers.

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

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.

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!

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.

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.

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 ;

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

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 ;

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.

Fala mano…!!! blz…!!!

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

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…

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

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

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 ;

coloque um if na frente insert

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 $$

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.