Jordano Cherobim Postado Julho 25, 2015 Denunciar Share Postado Julho 25, 2015 Olá, estou com o seguinte problema... Tenho uma trigger que verifica alguns campos do banco antes da inserção. Antes de inserir verifica se tal campo é maior e se isso for falso ele não pode deixar inserir.Como fazer isso? Obrigado. Link para o comentário Compartilhar em outros sites More sharing options...
0 DavilX Postado Julho 25, 2015 Denunciar Share Postado Julho 25, 2015 Olá jordano. É só você inserir o método break; que o loop para. Mas você tem que criar uma condição para ele parar quando identificar. Entendo que sua busca é no mysql, mas que linguagem você está usando para fazer isso? Se não consegui deixa o código aqui para eu consultar, uma parte dele apenas. Bye Bye! Link para o comentário Compartilhar em outros sites More sharing options...
0 Jordano Cherobim Postado Julho 27, 2015 Autor Denunciar Share Postado Julho 27, 2015 Estou inserindo uma venda, mas só pode ocorrer se meu estoque for maior que a quantidade solicitada. Eu já fiz a condição, porém quando executo preciso que se ele não entrar no IF, não deixe a venda ser inserida. DELIMITER $$ create trigger `insereSaidaLamina` BEFORE INSERT on `fardoLamina` for each row BEGIN DECLARE message CONDITION FOR sqlstate '45000'; IF (qtd >= NEW.consumoTora) THEN UPDATE prod SET quantidade = quantidade - NEW.quanti .......; ELSE signal sqlstate '45000'; SET message = 'Estoque de toras insuficiente'; END IF; END; $$ DELIMITER ; Porém este não está funcionando.. Link para o comentário Compartilhar em outros sites More sharing options...
0 DavilX Postado Julho 27, 2015 Denunciar Share Postado Julho 27, 2015 Sinceramente isso pode sobrecarregar o servidor. Por que você não usa um meio de buscar primeiro a quantia do item que você deseja para depois fazer a requisição ou não criando uma comparação, ao invés de fazer isso no sql. Faz uma busca simples e compara antes de todo o processo geral. Você não tem como fazer isso por fora não sendo por sql?? As vezes nem tudo dá pra fazer no sql. Tenho uma redesocial e muitos códigos grotescos tem limite no Mysql que eu uso o PHP antes de tudo. Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 27, 2015 Denunciar Share Postado Julho 27, 2015 Em vez de fazer por trigger faça por storage procedure. É mais prático, seguro, mais controlável, pode emitir mensagem de retorno e, ao contrário do que o DavilX falou no tópico anterior, controles de regras de negócio, não sobrecarregam o servidor. Link para o comentário Compartilhar em outros sites More sharing options...
0 Jordano Cherobim Postado Julho 28, 2015 Autor Denunciar Share Postado Julho 28, 2015 Certo. Mas dentro da trigger, como eu poderia parar a sua execução? E como eu poderia fazer isso com storage procedure? Obrigado. Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 28, 2015 Denunciar Share Postado Julho 28, 2015 Para forçar um erro em um trigger basta atribuir NULL a um campo NOT NULL. Segue abaixo um exemplo de como eu executo CUD(Create, Update, Delete) /* Criação tabela exemplo */ CREATE TABLE exemplo( idExemplo INT UNSIGNED NOT NULL AUTO_INCREMENT, dsExemplo VARCHAR(50) NOT NULL, PRIMARY KEY (idExemplo) )ENGINE InnoDB; DELIMITER $$; DROP PROCEDURE IF EXISTS `meuBancoDeDados`.`exemploCUD`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `exemploCUD`(IN Acao CHAR(1), IN pidExemplo INTEGER, IN pdsExemplo VARCHAR(50)) BEGIN DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; /* faça aqui a verificação de suas regras de negocio para gravação desta tabela*/ IF pdsExemplo = "" OR (Acao <> "I" AND pidExemplo = 0) THEN SET msg = "Erro na passagem de parametros"; ELSE START TRANSACTION; /*Inclusao*/ IF Acao = "I" AND excecao = 0 THEN INSERT INTO exemplo(dsExemplo) VALUES (pdsExemplo); IF excecao = 1 THEN SET msg = "Erro ao inserir na tabela exemplo"; ROLLBACK; END IF; END IF; IF Acao <> "I" AND excecao = 0 THEN SET @idExemplo = pidExemplo; END IF; /*Alteracao*/ IF Acao = "A" and excecao = 0 THEN UPDATE exemplo SET dsExemplo = pdsExemplo WHERE idExemplo = @idExemplo; IF excecao = 1 THEN SET msg = "Erro ao atualizar"; ROLLBACK; END IF; END IF; /*Exclusao*/ IF Acao = "E" and excecao = 0 THEN DELETE FROM exemplo WHERE idExemplo = @idExemplo; IF excecao = 1 THEN SET msg = "Erro ao excluir"; ROLLBACK; END IF; END IF; /*Se tudo deu certo, então finaliza confirmando a gravação.*/ IF excecao = 0 THEN COMMIT; IF Acao = "I" THEN SET msg = "Incluido com sucesso"; ELSE IF Acao = "A" THEN SET msg = "Alterado com sucesso"; ELSE SET msg = "Excluido com sucesso"; END IF; END IF; END IF; END IF; SELECT msg AS msg; END$$ DELIMITER ;$$ Link para o comentário Compartilhar em outros sites More sharing options...
0 Jordano Cherobim Postado Julho 30, 2015 Autor Denunciar Share Postado Julho 30, 2015 Obrigado pelas respostas. Me ajudaram bastante.Problema resolvido.! Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Jordano Cherobim
Olá, estou com o seguinte problema...
Tenho uma trigger que verifica alguns campos do banco antes da inserção.
Antes de inserir verifica se tal campo é maior e se isso for falso ele não pode deixar inserir.
Como fazer isso?
Obrigado.
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados