This is my trigger, i've declared msg varchar(255) and i've tried to change it from 255 to 550 but it doesn't stop to send me that error code:
*Error Code: 1648. Data too long for condition item 'MESSAGE_TEXT*
The msg variable is declared in a trigger; the trigger is a merge of 2 triggers (i'm working by MySQL and i can't use multiple triggers for the same action time and event on one table) and this is the body:
-- --------------------------------------------------------------------------------------------------
CREATE TRIGGER BEFORE_INSERT_ON_SENTIERO__HA__TAPPA
BEFORE INSERT ON SENTIERO__HA__TAPPA
FOR EACH ROW
BEGIN
/* TRIGGER controlla_MaxCARDINALITA_INSERT */
-- variables for controlla_MaxCARDINALITA_INSERT
DECLARE max_cardinalita INTEGER;
DECLARE msg varchar(255);
-- variables for controlla_corrispondenzaTappaFineInizio_INSERT
DECLARE temp_tappaOLD INTEGER;
DECLARE temp_posizione_tappaOLD INTEGER;
DECLARE temp_inizio_tappaNEW VARCHAR(45);
DECLARE temp_fine_tappaOLD VARCHAR(45);
SELECT COUNT(*) into max_cardinalita
FROM SENTIERO__HA__TAPPA
WHERE IDsentiero=NEW.IDsentiero;
IF max_cardinalita>=10 THEN
set msg = 'INSERT: Il sentiero ha già il massimo numero di tappe consentito ';
signal sqlstate '45000' set message_text = msg;
END IF;
/* TRIGGER controlla_corrispondenzaTappaFineInizio_INSERT */
IF EXISTS ( SELECT IDsentiero, IDtappa
FROM SENTIERO__HA__TAPPA as sht
WHERE NEW.IDsentiero=sht.IDsentiero and NEW.IDtappa=sht.IDtappa) THEN
set msg = 'INSERT: La tappa inserita è già presente nel sentiero; non è possibile inserirla 2 volte ';
signal sqlstate '45000' set message_text = msg;
END IF;
SELECT IDtappa into temp_tappaOLD
FROM SENTIERO__HA__TAPPA as sht1
WHERE NEW.IDsentiero=sht1.IDsentiero and posizione_tappa>=ALL ( SELECT posizione_tappa
FROM SENTIERO__HA__TAPPA as sht2
WHERE NEW.IDsentiero=sht2.IDsentiero );
SELECT posizione_tappa into temp_posizione_tappaOLD
FROM SENTIERO__HA__TAPPA as sht
WHERE NEW.IDsentiero=sht.IDsentiero and temp_tappaOLD=sht.IDtappa;
IF NEW.posizione_tappa<>temp_posizione_tappaOLD THEN
set msg = 'INSERT: La posizione della tappa inserita deve essere consecutiva alla posizione dell ultima tappa di quel sentiero: le tappe devono essere consecutive ';
signal sqlstate '45000' set message_text = msg;
END IF;
SELECT inizio into temp_inizio_tappaNEW
FROM TAPPA
WHERE NEW.IDtappa=TAPPA.IDtappa;
SELECT fine into temp_fine_tappaOLD
FROM TAPPA
WHERE temp_tappaOLD=TAPPA.IDtappa;
IF temp_inizio_tappaNEW<>temp_fine_tappaOLD THEN
set msg = 'INSERT: La fine della tappa precedente non corrisponde con l inizio di questa tappa: le tappe devono essere consecutive ';
signal sqlstate '45000' set message_text = msg;
END IF;
END$$
-- --------------------------------------------------------------------------------------------------
EDIT ::
DECLARE msg varchar(5);
set msg = concat('I');
signal sqlstate '45000' set message_text = msg;
MESSAGE_TEXT
is, in MySQL, VARCHAR(128)
. Some of your messages, you are trying to assign there, are longer than that.
I guess one can not simply redefine MESSAGE_TEXT so you have to come up with a shorter message. See https://dev.mysql.com/doc/refman/5.5/en/signal.html#signal-condition-information-items.
I think you can't modify the definition of the condition item (see this). The definition for MESSAGE_TEXT
is VARCHAR(128)
; I tried to change this, but couldn't.
But, you can use MariaDB (works like MySQL). In MariaDB the condition item MESSAGE_TEXT
has the definition VARCHAR(512)
. So, you can't change this, but it can contain more now. This works only for MariaDB in version 10.3.6 an up.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With