Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Cobra

Impedir inserção

Recommended Posts

Pessoal,

 

É possível que, dentro de uma trigger (before insert), eu consiga impedir a inserção de um registro caso este atenda a uma certa condição?

Pensei em gerar algum erro e sei que em outros bancos, tais quais o Oracle, por exemplo, isso é possível, mas no MySQL não encontrei nada a respeito...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mamão com açúcar, vamos lá:

 

Criamos uma tabela com uma coluna que não aceita valores NULL:

mysql> create table t2 (id int not null);
Query OK, 0 rows affected (0.03 sec)

Criamos um TRIGGER para conferir o valor antes do INSERT ( BEFORE INSERT ):

mysql> create trigger trg_t2_in
	-> before insert
	-> on t2
	-> for each row
	-> begin
	->   if (new.id < 10) then
	->	  set new.id = null;
	->   end if;
	-> end;
	-> //
Query OK, 0 rows affected (0.00 sec)

Com o TRIGGER acima, pendurado na tabela t2, se o valor enviado por um INSERT para a coluna id for menor que 10, o valor do operador NEW + a coluna id será setado para NULL. Como a coluna tem uma retrição NOT NULL, o valor não será cadastrado.

 

Inserindo dados:

mysql> insert into t2 set id =1//
ERROR 1048 (23000): Column 'id' cannot be null

mysql> insert into t2 set id =100//
Query OK, 1 row affected (0.03 sec)

Ainda podemos, após criar a tabela e o TRIGGER, criar um Stored Procedure para fazer o INSERT e, se for o caso, tratar o erro 23000:

mysql> create procedure sp_t2(id int)
	-> begin
	->   declare exit handler for sqlstate '23000'
	->   begin
	->	select 'Problemas com a inserção!';
	->   end;
	->   insert into t2 set id =id;
	->   select 'Ok!' AS Msg;
	-> end//
Query OK, 0 rows affected (0.00 sec)

Quando o valor for setado, dentro da TRIGGER para NULL, o handler de tratamento de erro será disparado dentro do Stored Procedure, mostrando uma mensagem mais amigável para o usuário.

 

Inserindo os dados, só que agora com o Stored Procedure:

mysql> call sp_t2(1)//
+---------------------------+
| Problemas com a inserção! |
+---------------------------+
| Problemas com a inserção! |
+---------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.02 sec)


mysql> call sp_t2(1000)//
+-----+
| Msg |
+-----+
| Ok! |
+-----+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.05 sec)

Espero ter ajudado!! Grande abraço aos Imaster'ings!!

Happy MySQL'ing!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.