0

トリガーがあります:

CREATE TRIGGER BEFORE_DELETE_ON_SENTIERO__HA__TAPPA
BEFORE DELETE ON SENTIERO__HA__TAPPA
FOR EACH ROW 
BEGIN

DECLARE temp_prima_tappa INTEGER;
DECLARE temp_ultima_tappa INTEGER;

-- NOW THIS QUERY WILL FAIL;   it checks if the record that has to be deleted is in the table
IF NOT EXISTS ( SELECT *
                FROM SENTIERO__HA__TAPPA as sht
                WHERE OLD.IDsentiero=sht.IDsentiero and OLD.IDtappa=sht.IDtappa) THEN

                        SIGNAL SQLSTATE '45000'
                        SET MESSAGE_TEXT = 'DELETE: La tappa indicata non è nel sentiero; impossibile elimnarla';

END IF;

IDsentieroとIDtappaは、それらの相対テーブルのPKです。SENTIEROの場合はIDsentiero、TAPPAの場合はIDtappaです。

問題は、DELETEQUERYがそのエラーメッセージで私に応答しないことです。そのレコードがテーブルに存在しないため、 何も削除できませんが、単にDELETEQUERYを実行します。

問題はそのクエリです..確かですが、バグを見つけることができません。

4

2 に答える 2

0

このようなものが機能するはずです:

declare recsexist int;
set recsexist = 0;  

SELECT 1 INTO recsexist 
FROM SENTIERO__HA__TAPPA as sht
WHERE OLD.IDsentiero=sht.IDsentiero and OLD.IDtappa=sht.IDtappa;

IF (recsexist > 0) THEN
     ...

END IF; 
于 2013-02-09T19:30:12.167 に答える
0

削除トリガーは実際に削除された行でのみ実行されるため、トリガーが実行されるまでに、その行が存在している必要があります。トリガーを使用して、効果のない削除ステートメントを見つけることはできません。

于 2013-02-09T20:30:34.487 に答える