これは私のトリガーです。msg varchar(255)を宣言し、255 から 550 に変更しようとしました が、エラー コードの送信を停止しません。
*エラー コード: 1648。条件項目 'MESSAGE_TEXT* のデータが長すぎます
msg 変数はトリガーで宣言されます。トリガーは2つのトリガーのマージです(私はMySQLで作業しており、1つのテーブルで同じアクション時間とイベントに複数のトリガーを使用することはできません)、これが本体です:
-- --------------------------------------------------------------------------------------------------
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$$
-- --------------------------------------------------------------------------------------------------
編集 ::
DECLARE msg varchar(5);
set msg = concat('I');
signal sqlstate '45000' set message_text = msg;