Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

Marisa Lima

Trigger em mysql

Recommended Posts

Bom dia,

o select vai retornar mais de uma linha.

A questão é que por exemplo 7 dessas linhas vão ter o mesmo id_momento_avaliacao_colaborador, porque um colaborador tem N competencias funcionais.

Testei o trigger que você me passou mas está dando o seguinte erro:

Erro no MySQL: Subquery returns more than 1 row

Deve ser por estar a retornar mais de uma linha!

Share this post


Link to post
Share on other sites

Bom dia,

 

Ok, e como você espera pegar apenas uma dessas N linhas? Mais condições? Ou você pretende inserir N vezes?

 

Se for N vezes, cursor de novo.

Share this post


Link to post
Share on other sites

Eu pretendo que essas N linhas sejam inseridas na nova tabela com o id_momento_avaliacao_colaborador igual e só altera quando for uma nova competencia_funcional para um novo colaborador!

tentei implementar assim:

BEGIN

 

DECLARE varIdfuncao int;

 

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT id FROM competencia_funcional WHERE activo='0' AND id_colaborador=new.id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

 

REPEAT

FETCH cursorExemplo INTO varIdfuncao ;

 

 

INSERT INTO avaliacao_competencia_funcional_momento(id_momento_avaliacao_colaborador,id_competencia_funcional) VALUES (new.id,varIdfuncao);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

 

 

END

Mas dá não insere o id_competencia_funcional!

Share this post


Link to post
Share on other sites

Eu pretendo que essas N linhas sejam inseridas na nova tabela com o id_momento_avaliacao_colaborador igual e só altera quando for uma nova competencia_funcional para um novo colaborador!

Ok... Como assim um novo colaborador? Não era apenas o colaborador igual ao registro que está sendo inserido? id_colaborador = NEW.id_colaborador ?

 

tentei implementar assim:

BEGIN

 

DECLARE varIdfuncao int;

 

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT id FROM competencia_funcional WHERE activo='0' AND id_colaborador=new.id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

 

REPEAT

FETCH cursorExemplo INTO varIdfuncao ;

 

 

INSERT INTO avaliacao_competencia_funcional_momento(id_momento_avaliacao_colaborador,id_competencia_funcional) VALUES (new.id_momento_avaliacao,varIdfuncao);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

 

 

END

Mas dá o seguinte erro:

Erro no MySQL: Cannot add or update a child row: a foreign key constraint fails (`avaliacao_colaborador`.`avaliacao_competencia_funcional_momento`, CONSTRAINT `FK4` FOREIGN KEY (`id_momento_avaliacao_colaborador`) REFERENCES `momento_avaliacao_colaborador` (`id`))

Este erro deu porque você tentou inserir no campo de chave estrangeira um valor que não existe na tabela pai.

 

Notei no seu SELECT do Cursor que você colocou a condição AND id_colaborador=NEW.id, não seria AND id_colaborador = NEW.id_colaborador ?

 

No aguardo, abraço.

Share this post


Link to post
Share on other sites

Ok... Como assim um novo colaborador? Não era apenas o colaborador igual ao registro que está sendo inserido? id_colaborador = NEW.id_colaborador ?

 

 

Este erro deu porque você tentou inserir no campo de chave estrangeira um valor que não existe na tabela pai.

 

Notei no seu SELECT do Cursor que você colocou a condição AND id_colaborador=NEW.id, não seria AND id_colaborador = NEW.id_colaborador ?

 

No aguardo, abraço.

 

Tinha razão o meu select estava mal, é new.id_colaborador.

Neste momento está a funcionar e parece estar correcto, preciso de ter os dados todos inseridos para ter a certeza.

Assim que realizar os testes aviso!

Muito obrigada, para já o problema está resolvido!

Share this post


Link to post
Share on other sites

Voltei!

Eu preciso criar mais duas triggers do mesmo genero para inserir em duas outras tabelas, mas infelizmente o mysql não aceita multiplas triggers numa unica tabela. Então em pensei criar stored procedures e invoca-las em php, mas ao invocar acontece um warnnig dizem que faltam os parametros, mas a minhas procedures não tem parametros!

 

$smt=mysqli_prepare($mysql,"call insert_avaliacao_competencia_departamental_momento()");

$stmt=mysqli_prepare($mysql,"call insert_avaliacao_competencia_transversal_momento()");

mysqli_stmt_execute($stmt);

mysqli_stmt_execute($smt);

 

Como é que resolvo o problema!

Share this post


Link to post
Share on other sites

Opa =]

 

Olha, você podia criar as Stored Procedures e chamar elas de dentro da tua Trigger não? Ou eu não entendi direito onde elas são executadas.

 

Posta o erro que dá e o código das Procedures pra vermos. Abraço.

Share this post


Link to post
Share on other sites

Olá!

 

Fiz como você disse, criei procedures e invoqueias numa trigger, mas está acontecendo o seguinte erro:

 

Ocorreu um erro ao executar a Query MySQL: INSERT INTO momento_avaliacao(ano,status,descricao) Value('2012','1','sdsdfsd')

 

Erro no MySQL: Unknown column 'New.id_colaborador' in 'where clause'

As procedures podem usar o NEw.id?

Share this post


Link to post
Share on other sites

Bom dia,

 

Só se você passar por parâmetro. Mas lá dentro delas não podem ser usados os termos NEW nem OLD, isso só nas Triggers. Passe os valores da Triggers que quer por parâmetro pra Procedure.

Share this post


Link to post
Share on other sites

Eu tenho a trigger que insere na tabela momento_avaliacao_colaborador que tem os valores que preciso de passar as store procedures que são invocadas em seguida noutra trigger.

Como é que eu faço para passar os parametros da trigger para a procedure?

Trigger(momento_avaliacao_colaborador)

BEGIN

DECLARE varIdcolaborador int;

 

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT colaborador.id FROM colaborador WHERE activo='0';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

REPEAT

FETCH cursorExemplo INTO varIdcolaborador ;

 

INSERT INTO momento_avaliacao_colaborador (id_colaborador,id_momento_avaliacao) VALUES (varIdcolaborador,NEW.id);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

END

 

Stored Procedure

BEGIN

DECLARE varIdfuncao int;

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT competencia_funcional.id FROM competencia_funcional WHERE activo='0' AND id_colaborador=New.id_colaborador;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

 

REPEAT

FETCH cursorExemplo INTO varIdfuncao ;

 

 

INSERT INTO avaliacao_competencia_funcional_momento(id_momento_avaliacao_colaborador,id_competencia_funcional) VALUES (new.id_colaborador,varIdfuncao);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

END

Share this post


Link to post
Share on other sites

Cria N parâmetros na Procedure, e quando você chamar ela de dentro da Trigger, você passa os N valores que quiser (o NEW.campo por exemplo) no(s) parâmetro(s) correspondente(s).

 

Um artigo aqui do iMasters sobre Procedures com Parâmetros: http://imasters.com.br/artigo/7556/mysql/stored-procedures-no-mysql

 

Dúvidas estamos a disposição, abraço.

Share this post


Link to post
Share on other sites

Cria N parâmetros na Procedure, e quando você chamar ela de dentro da Trigger, você passa os N valores que quiser (o NEW.campo por exemplo) no(s) parâmetro(s) correspondente(s).

 

Um artigo aqui do iMasters sobre Procedures com Parâmetros: http://imasters.com.br/artigo/7556/mysql/stored-procedures-no-mysql

 

Dúvidas estamos a disposição, abraço.

 

Vi o link que me indicou e criei as procedures com passagem de parametros e na trigger invoco da seguinte forma:

BEGIN

CAll insert_competencia_departamental_avaliacao(new.id_colaborador);

call insert_competencia_transversal_momento(new.id_colaborador);

call inser_competencia_funcional_momento(new.id_colaborador);

 

END

 

Mas dá-me o seguinte erro:

Ocorreu um erro ao executar a Query MySQL: INSERT INTO momento_avaliacao(ano,status,descricao) Value('2012','1','dsfdsfdsf')

 

Erro no MySQL: Cannot add or update a child row: a foreign key constraint fails (`avaliacao_colaborador`.`avaliacao_competencia_departamental_momento`, CONSTRAINT `FK6` FOREIGN KEY (`id_momento_avaliacao_colaborador`) REFERENCES `momento_avaliacao_colaborador` (`id`))

 

Uma das minhas procedures está assim: (as outras são identicas)

BEGIN

DECLARE varIddepart int;

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT competencia_departamental_colaborador.id_competencia_departamental FROM competencia_departamental_colaborador WHERE activo='0' AND id_colaborador=param1;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

 

REPEAT

FETCH cursorExemplo INTO varIddepart ;

 

 

INSERT INTO avaliacao_competencia_departamental_momento(id_momento_avaliacao_colaborador,id_competencia_departamental) VALUES (param1,varIddepart);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

 

 

END

 

Não sei onde está o erro!

Share this post


Link to post
Share on other sites

Está tentando inserir um registro sem informar OU informando incorretamente uma das chaves estrangeiras.

 

Verifique os valores que estão sendo inseridos nessas chaves e veja se existem nas tabelas pais.

Share this post


Link to post
Share on other sites

Já resolvi o problema estava passando mal os parâmetros, só existe uma que não funciona direito, mas vou tentar descobrir o que é primeiro, pois não dá nenhum erro. Se precisar eu volto a incomodar.

Obrigada!

Share this post


Link to post
Share on other sites

Estive a testar com os dados todos na bd e as procedures não funcionam correctamente, apenas me inserem dois dos id_momento_avaliacao_colaborador, sendo que cada colaborador tem um id_momento_avaliacao_colaborador diferente e N competencias, mas apenas me atribui o id 1 e 2 a todos os colaboradores. No código parece-me tudo bem.

O que poderá ser?

Share this post


Link to post
Share on other sites

Bom dia,

 

Posta uma das Procedures com problema e tudo que envolve ela (tabelas que ainda não foram postadas ou triggers). Se estiver usando Cursor verifique o que ele está retornando, quantidade de linhas.

Share this post


Link to post
Share on other sites

Por exemplo nesta procedure eu tenho a certeza que cada id_momento_avaliacao_colaborador vai ter de inserido 7 vezes para cada colaborador, cada colaborador tem 7 competencias_transversais.

BEGIN

DECLARE varIdtrans int;

DECLARE f int DEFAULT 0;

DECLARE cursorExemplo CURSOR FOR SELECT competencia_transversal_colaborador.id_competencia_transversal FROM competencia_transversal_colaborador WHERE activo='0' AND id_colaborador=id_colaborador;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET f = 1;

 

OPEN cursorExemplo ;

 

REPEAT

FETCH cursorExemplo INTO varIdtrans ;

 

 

INSERT INTO avaliacao_competencia_transversal_momento(id_momento_avaliacao_colaborador,id_competencia_transversal) VALUES (id_momento_avaliacao_colaborador,varIdtrans);

UNTIL (f = 1) END REPEAT ;

 

CLOSE cursorExemplo ;

END

 

 

Trigger onde invoco:

BEGIN

CAll insert_competencia_departamental_avaliacao(new.id_colaborador,new.id);

call insert_competencia_transversal_momento(new.id_colaborador,new.id);

call inser_competencia_funcional_momento(new.id_colaborador,new.id);

 

END

Tentei fazer tudo na mesma trigger, não dá erro mas continua a não bater certo.

 

Estiver a analisar o numero de linhas returnadas pelo cursor e pode acontecer de em algum momento returnar linhas vazias será esse o problema?

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.