Olá, estou tendo um problema com uma trigger. Explicando a situação:
Eu tenho as seguintes tabelas:
CREATE TABLE `pessoas`(`codigo`int(11) NOT NULL,`nome` varchar(70) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`codigo`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `programa_semanal`(`semana` date NOT NULL,`tema` varchar(100) CHARACTER SET utf8 DEFAULT NULL,`presidente`int(11) DEFAULT NULL,`orador`int(11) DEFAULT NULL,
PRIMARY KEY (`semana`),
KEY `FK_Orador_idx`(`orador`),
KEY `FK_Presidente_idx`(`presidente`),
CONSTRAINT `FK_Orador` FOREIGN KEY (`orador`) REFERENCES `pessoas`(`codigo`),
CONSTRAINT `FK_Presidente` FOREIGN KEY (`presidente`) REFERENCES `pessoas`(`codigo`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
O que acontece:
Eu tenho um cadastro de pessoas e um cadastro de programação semanal que vou alimentando no início de cada mês as semanas seguintes. Neste cadastro antecipado, informo a semana e o tema, e as informações são inseridas na tabela programa_semanal.
Alguns dias antes de determinada semana chegar, eu preciso editar a programação e escolher, dentre a lista de pessoas, quem vai ser o presidente e quem vai ser o orador, e as informações são editadas na tabela programa_semanal. Eu posso também, caso a semana não tenha passado, editar a programação semanal e escolher outras pessoas como presidente e orador.
Para evitar que algumas pessoas sejam escolhidas com mais frequência do que outras como presidentes ou oradores, eu criei outra tabela que tem a seguinte estrutura:
CREATE TABLE `participacao`(`codigo_pessoa`int(11) NOT NULL,`semana` date NOT NULL,`tipo_participacao` varchar(1) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`codigo_pessoa`,`semana`),
CONSTRAINT `FK_Pessoa` FOREIGN KEY (`codigo_pessoa`) REFERENCES `pessoas`(`codigo`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Quando eu gravar as alterações na tabela programa_semanal, a ideia é que a trigger faça uma inserção ou uma alteração nesta tabela participacao, levando em consideração o seguinte:
Quando eu faço INSERT na tabela programa_semanal, as colunas 'presidente' e 'orador' ficam com valor NULL, pois estou apenas cadastrando as semanas antecipadamente.
Neste caso a trigger não deve fazer nada pois o presidente e o orador ainda não foram escolhidos.
Quando eu faço UPDATE na tabela programa_semanal é quando as colunas 'presidente' e 'orador' ficam com valor inteiro.
Neste caso, a trigger deve validar se o valores antigos das colunas 'presidente' e 'orador' na tabela programa_semanal são nulos:
- Se forem nulos, a trigger deve fazer INSERT na tabela participação, pois é a primeira vez que o presidente e o orador foram definidos para aquela semana.
- Se não forem nulos, a trigger deve fazer UPDATE na tabela participacao, pois resolvi escolher outra pessoa como presidente ou orador naquela semana.
- Tanto no INSERT quanto no UPDATE as colunas 'codigo_pessoa' e 'semana' vem da tabela programa_semanal e a coluna 'tipo_participacao' recebe o valor 'O' caso seja orador, ou valor 'P' caso seja presidente;
Isso me permitiria, na hora de escolher o presidente e o orador para determinada semana, fazer um SELECT ordenando pelas pessoas que a mais tempo não são escolhidas como presidente ou como orador, para que todos tenham as mesmas chances de participar.
No momento, a trigger está definida assim:
DELIMITER $$
DROP TRIGGER IF EXISTS updateParticipantes;
$$
DELIMITER //
CREATE TRIGGER updateParticipantes AFTER UPDATE ON programa_semanal
FOR EACH ROW
BEGIN
IF old.presidente <>new.presidente THEN
IF old.presidente IS NULL THEN
INSERT INTO participacao (codigo_pessoa, semana, tipo_participacao) VALUES (new.presidente,new.semana,'P');
ELSE
UPDATE participacao SET codigo_pessoa =new.presidente
WHERE participacao.semana =new.semana
AND participacao.tipo_participacao ='P';END IF;END IF;
IF old.orador <>new.orador THEN
IF old.orador IS NULL THEN
INSERT INTO participacao (codigo_pessoa, semana, tipo_participacao) VALUES (new.orador,new.semana,'O');
ELSE
UPDATE participacao SET codigo_pessoa =new.orador
WHERE participacao.semana =new.semana
AND participacao.tipo_participacao ='O';END IF;END IF;END
Só que ela não está funcionando e eu não consigo entender o por quê. Quando eu executo este script para deleção / criação da trigger não dá nenhum erro de execução, então até onde eu entendo não há erro de sintaxe na definição da trigger.
Só que quando atualizo a tabela programa_semanal com valores para presidente e orador, nada acontece na tabela participacao. Mas se eu colocar algum INSERT ou UPDATE logo após o BEGIN, isso funciona, então aparentemente o problema é nos IFs.
Alguém poderia me ajudar a entender o que está errado?
Pergunta
felipekraemer
Olá, estou tendo um problema com uma trigger. Explicando a situação:
Eu tenho as seguintes tabelas:
O que acontece:
Eu tenho um cadastro de pessoas e um cadastro de programação semanal que vou alimentando no início de cada mês as semanas seguintes. Neste cadastro antecipado, informo a semana e o tema, e as informações são inseridas na tabela programa_semanal.
Alguns dias antes de determinada semana chegar, eu preciso editar a programação e escolher, dentre a lista de pessoas, quem vai ser o presidente e quem vai ser o orador, e as informações são editadas na tabela programa_semanal. Eu posso também, caso a semana não tenha passado, editar a programação semanal e escolher outras pessoas como presidente e orador.
Para evitar que algumas pessoas sejam escolhidas com mais frequência do que outras como presidentes ou oradores, eu criei outra tabela que tem a seguinte estrutura:
Quando eu gravar as alterações na tabela programa_semanal, a ideia é que a trigger faça uma inserção ou uma alteração nesta tabela participacao, levando em consideração o seguinte:
Neste caso a trigger não deve fazer nada pois o presidente e o orador ainda não foram escolhidos.
Neste caso, a trigger deve validar se o valores antigos das colunas 'presidente' e 'orador' na tabela programa_semanal são nulos:
- Se forem nulos, a trigger deve fazer INSERT na tabela participação, pois é a primeira vez que o presidente e o orador foram definidos para aquela semana.
- Se não forem nulos, a trigger deve fazer UPDATE na tabela participacao, pois resolvi escolher outra pessoa como presidente ou orador naquela semana.
- Tanto no INSERT quanto no UPDATE as colunas 'codigo_pessoa' e 'semana' vem da tabela programa_semanal e a coluna 'tipo_participacao' recebe o valor 'O' caso seja orador, ou valor 'P' caso seja presidente;
Isso me permitiria, na hora de escolher o presidente e o orador para determinada semana, fazer um SELECT ordenando pelas pessoas que a mais tempo não são escolhidas como presidente ou como orador, para que todos tenham as mesmas chances de participar.
No momento, a trigger está definida assim:
Só que ela não está funcionando e eu não consigo entender o por quê. Quando eu executo este script para deleção / criação da trigger não dá nenhum erro de execução, então até onde eu entendo não há erro de sintaxe na definição da trigger.
Só que quando atualizo a tabela programa_semanal com valores para presidente e orador, nada acontece na tabela participacao. Mas se eu colocar algum INSERT ou UPDATE logo após o BEGIN, isso funciona, então aparentemente o problema é nos IFs.
Alguém poderia me ajudar a entender o que está errado?
Muito obrigado!
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados