Ir para conteúdo
Fórum Script Brasil

felipekraemer

Membros
  • Total de itens

    2
  • Registro em

  • Última visita

Sobre felipekraemer

felipekraemer's Achievements

0

Reputação

  1. 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 ;
  2. 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? Muito obrigado!
×
×
  • Criar Novo...