Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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...
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
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
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