Din păcate, răspunsul oferit de @RuiDC nu funcționează în versiunile MySQL înainte de 5.5 deoarece nu există o implementare a SIGNAL pentru procedurile stocate.
Soluția pe care am găsită este pentru a simula un semnal care aruncă o eroare table_name nu există
, împingând un mesaj de eroare personalizat în table_name
.
Hack-ul ar putea fi implementat folosind declanșatoare sau utilizând o procedură stocată. Am descrie ambele opțiuni de mai jos, urmând exemplul utilizat de @RuiDC.
Utilizând declanșatoarele
DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
BEFORE INSERT ON test FOR EACH ROW
BEGIN
-- condition to check
IF NEW.id < 0 THEN
-- hack to solve absence of SIGNAL/prepared statements in triggers
UPDATE `Error: invalid_id_test` SET x=1;
END IF;
END$$
DELIMITER ;
Utilizarea unei proceduri stocate
Procedurile stocate vă permit să utilizați sql dinamic, ceea ce face posibilă încapsularea funcției de generare a erorilor într-o singură procedură. Contrapunctul este că trebuie să controlam metodele de inserare / actualizare a aplicațiilor, astfel încât să utilizeze doar procedura noastră stocată (neacordând privilegii directe la INSERT / UPDATE).
DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END$$
CREATE PROCEDURE insert_test(p_id INT)
BEGIN
IF NEW.id < 0 THEN
CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
ELSE
INSERT INTO test (id) VALUES (p_id);
END IF;
END$$
DELIMITER ;