Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com Trigger


felipekraemer

Pergunta

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:

  1. 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.
  2. 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?

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Alterei a lógica da trigger, dizendo a mesma coisa de forma diferente, e funcionou:

DELIMITER $$
DROP TRIGGER IF EXISTS updateParticipantes;
$$
DELIMITER //
CREATE TRIGGER updateParticipantes AFTER UPDATE ON programa_semanal 
FOR EACH ROW
BEGIN
        IF OLD.presidente IS NULL THEN
            IF NEW.presidente IS NOT NULL THEN
            
				INSERT INTO participacao (codigo_pessoa, semana, tipo_participacao) VALUES (NEW.presidente, OLD.semana, 'P');
                
		   END IF;
		ELSE             
		    IF NEW.presidente IS NOT NULL THEN
            
				UPDATE participacao SET codigo_pessoa = NEW.presidente WHERE participacao.semana = OLD.semana AND participacao.tipo_participacao = 'P';
                
            END IF;
        END IF;
        
        
        IF OLD.orador IS NULL THEN
            IF NEW.orador IS NOT NULL THEN
            
				INSERT INTO participacao (codigo_pessoa, semana, tipo_participacao) VALUES (NEW.orador, OLD.semana, 'O');
                
		   END IF;
		ELSE             
		    IF NEW.orador IS NOT NULL THEN
				
                UPDATE participacao SET codigo_pessoa = NEW.orador WHERE participacao.semana = OLD.semana AND participacao.tipo_participacao = 'O';
                
            END IF;
        END IF;

END$$
DELIMITER ;

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...