2017-01-15 4 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

Скорее всего, столбец ID_PICTURE не указан в таблице Pictures (не прописная буква 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; 

Но было бы гораздо проще, чтобы не использовать имена в нижнем регистре и двойные кавычки, в первую очередь.