2017-01-15 205 views
0
CREATE OR REPLACE TRIGGER delete_pictures 
AFTER DELETE ON "Pictures" 
FOR EACH ROW 
BEGIN 
    DELETE FROM "Photograph" 
    WHERE Photograph.ID_Picture=:old.ID_Picture; 
    DELETE FROM "Painting" 
    WHERE Painting.ID_Picture=:old.ID_Picture; 
END; 

私はこのSQLトリガを持っています。データベースに追加しようとすると、PLS-00049:ブースのOLD変数に不正なバインド変数があります。私はまだSQLで良いことではないし、それがどうして起こるのか、それを修正する方法を本当に知らないのですが、私はこれの他のケースを見ましたが、このケースでは本当に役に立ちませんでした。基本的に私がやっていることは、親要素が削除されている場合でも私は彼の子供を削除したいです。エラーPLS-00049:トリガー内のバインド変数が正しくないため、原因を特定できません。

答えて

0

これは間違った方法で行います。 on delete cascade外部キートリガーを探しています。

alter table photograph 
    add constraint fk_photograph_picture 
     foreign key (picture) references picture(id_picture) on delete cascade; 

alter table painting 
    add constraint fk_painting_picture 
     foreign key (picture) references picture(id_picture) on delete cascade; 

Hereはカスケード削除の理解に関するリソースです。

0

PicturesID_PICTUREという列はありません(大文字の綴りはID_PICTUREではありません)。

Oracleでは小文字の名前を使用することをお奨めします。 Oracleは大文字と小文字を区別します。ただし、SQL文中の引用符で囲まれていない名前は自動的に大文字に変換されます。したがって、実際に表名と列名に小文字を使用する場合は、必ず二重引用符で囲む必要があります。

あなたのトリガーは、おそらく次のようになります。

CREATE OR REPLACE TRIGGER delete_pictures 
AFTER DELETE ON "Pictures" 
FOR EACH ROW 
BEGIN 
    DELETE FROM "Photograph" 
    WHERE "Photograph"."ID_Picture" = :old."ID_Picture"; 
    DELETE FROM "Painting" 
    WHERE "Painting"."ID_Picture" = :old."ID_Picture"; 
END; 

しかし、最初の場所で小文字の名前や二重引用符を使用していないがはるかに容易になるだろう。

関連する問題