Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, ainda bem :D

 

Beleza, qualquer problema estamos aí à disposição. Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.