beforeDelete()
31/10/2012 15:00
0
Olá a todos!

Fiz um sistema de log por meios dos métodos beforeInsert(), beforeUpdate() e o beforeDelete() e também por triggers no Mysql.

Não sei se é o mais recomendável, mas me deu maior controle do que guardar no log.

O que eu faço é antes de dar update, gravo na tabela principal, atrás do afterUpdate() o usuário que editou por último e a data.

Nisso, a trigger é iniciada e grava esse registro na tabela de log.

Caso outro usuário altere algum campo, no log eu tenho o histórico do que foi mudado.

O estranho é que o log funciona perfeitamente com o before Insert e Update, mas não no delete. O que pode ser?

Segue um exemplo abaixo:

package teste

//Importa as requisições das variáveis de sessão do sistema para uso da classe
import org.springframework.web.context.request.RequestContextHolder

class Sala {

//Definições dos campos
Integer id
String sala
//Log do registro
String user_inc
Date dt_inclusao
String user_edt
Date dt_edicao
String user_del
Date dt_delete

//Validações dos campos e organização da ordem de exibição
static constraints = {
id()
sala(blank:false, nullable:false, maxSize:30, unique:true, )
turmas(blank:true, nullable:true)
//Logo do registro
user_inc (blank:true, nullable:true)
dt_inclusao (blank:true, nullable:true)
user_edt (blank:true, nullable:true)
dt_edicao (blank:true, nullable:true)
user_del (blank:true, nullable:true)
dt_delete (blank:true, nullable:true)
}

//Organiza os campos por ID do BD
static mapping = {
sort "id"
batchSize 20
}

//Formata o campo sala para as demais classes
String toString() {
return "${sala}"
}

//Log depois insert
def beforeInsert() {
//Define a variavel session para buscar o conteúdo de uma variavel de sessão externa
def session = RequestContextHolder.currentRequestAttributes().getSession()

user_inc = session.user
dt_inclusao = new Date()
}

//Log depois Update
def beforeUpdate() {
//Define a variavel session para buscar o conteúdo de uma variavel de sessão externa
def session = RequestContextHolder.currentRequestAttributes().getSession()

user_edt = session.user
dt_edicao = new Date()
}

//Log depois Delete
def beforeDelete() {
//Define a variavel session para buscar o conteúdo de uma variavel de sessão externa
def session = RequestContextHolder.currentRequestAttributes().getSession()

user_del = session.user
dt_delete = new Date()
}


Tabela que armazena o log:


DROP TABLE IF EXISTS GAIA.LOG_SALA;
CREATE TABLE GAIA.LOG_SALA (
`ID` INTEGER NOT NULL AUTO_INCREMENT,
`NEW_ID` int(11),
`USUARIO` varchar(30),
`DATA` DATETIME,
`TIPO` int(1),
`NEW_SALA` varchar(30),
`OLD_SALA` varchar(30),
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;


Segue a trigger do delete:


DROP TRIGGER IF EXISTS TRG_LOG_DEL_SALA;
delimiter $$
CREATE TRIGGER TRG_LOG_DEL_SALA
AFTER DELETE ON BANCO.SALA
FOR EACH ROW
BEGIN
DECLARE NEW_ID int(11);
DECLARE USUARIO VARCHAR(30);
DECLARE DATA DATETIME;
DECLARE TIPO INT(1);

DECLARE OLD_SALA VARCHAR(30);

SET NEW_ID = old.id;
SET USUARIO = old.user_del;
SET DATA = old.dt_delete;
SET TIPO = 2;

SET OLD_SALA = old.sala;

INSERT INTO BANCO.LOG_SALA (NEW_ID, USUARIO, DATA, TIPO, OLD_SALA) VALUES (NEW_ID, USUARIO, DATA, TIPO, OLD_SALA);

END$$
delimiter ;
Tags: beforeDelete() Trigger Mysql


0
Danilo, você está recebendo algum erro?

[]'s
31/10/2012 19:08


0
Erro nenhum. O que ocorre é que os campos user_del e dt_delete não estão recebendo os valores do método beforeDelete.

Fiz exatamente igual ao beforeUpdate e funciona.

Eu acredito que o beforeDelete deveria dar um update nos campos user_del e dt_delete e depois deletar a linha toda. Mas o que ocorre é que a linha é deletada sem a alteração dos campos.


0
Cara, não tenho certeza... mas acho que está relacionado ao flush. O posso estar falando besteira, mas suspeito que esteja relacionado a isso. Tenta criar outra seção (no gorm), e veja se da certo.


def beforeDelete() {
//Define a variavel session para buscar o conteúdo de uma variavel de sessão externa
def session = RequestContextHolder.currentRequestAttributes().getSession()

Sala.withNewSession {
user_del = session.user
dt_delete = new Date()
}
}



[]'s
31/10/2012 20:18


0
Então Luciano, não deu certo.

Eu não teria que forçar o save() em algum momento?! Acho estranho pois os outros métodos que uso funcionam certinho...

Bom, será que no controller dá p/ fazer alguma modificação para ele dar update antes de deletar o registro?!

Vlw a ajuda.


0
ok.... vc chegou a verificar se as variáveis são preenchidas no método beforeDelete? Dá um print nelas e veja se estão sendo populadas. Faz um teste, dê um save com flush antes do print.




def beforeDelete() {
Sala.withNewSession {
//Define a variavel session para buscar o conteúdo de uma variavel de sessão externa
def session = RequestContextHolder.currentRequestAttributes().getSession()
user_del = session.user
dt_delete = new Date()

this.save(flush:true)
print user_del
print dt_delete
}
}
01/11/2012 14:23


0
Quando eu coloco o comando this.save(flush:true) o registro não é deletado. Aparece uma mensagem informando que o registro não pode ser deletado. Aparentemente o registro fica bloqueado.

Será que não há um comando que feche essa sessão que aparentemente esta aberta?

Com o print que você colocou no final, mostra que as variáveis estão recebendo os valores sim, mas não esta salvando na tabela.

Obrigado novamente.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto