Триггеры в Oracle SQL Developer - PullRequest
1 голос
/ 31 марта 2020

Мне нужно установить trigger, чтобы изменить чью-либо оценку в таблице «GRADE» с null на «D», если они удалены из таблицы «STUDENT». Пока у меня есть:

create or replace trigger delete_from_student
after delete on student 

for each row
begin

update grades
set grade = 'D'
where grade = ''

end delete_from_student;

Я знаю, что это не может быть правильно, потому что я получаю красное подчеркивание на «конце». Я также считаю, что должен быть кто-то, кто должен быть уверен, что только ученик, который был удален из таблицы «СТУДЕНТ», должен был изменить свою оценку на D. До сих пор мы сделали только то, что, если вы добавите кого-то в таблицу А, тогда они автоматически помещается в таблицу B, так что я запутался в том, как использовать UPDATE вместо INSERT с триггером, и чтобы убедиться, что он влияет только на одну строку в таблице "GRADES". Спасибо за вашу помощь!

Редактировать: Я читал больше страниц и наконец-то понял синтаксис срабатывания триггера:

create or replace trigger delete_from_student
after delete on student 

for each row
begin

update grades set
grade = 'D'
where grade is null;

end delete_from_student;

Теперь моя проблема в том, что как я боялся, это влияет на каждую строку в таблице «GRADES», а не только на студента, который был удален. Итак, теперь мой вопрос: как я могу убедиться, что я влияю только на строку для студента, которого я удалил?

Второе редактирование: цель упражнения - просто научить нас, как работают триггеры, а не создать функциональную БД. Профессор предвосхитил это, сказав, что вы не сделаете этого в реальном мире по причинам, указанным другими людьми, но он просто учит нас о триггерах.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Один вопрос: ПОЧЕМУ ты вообще это делаешь? Это делает абсолютно нет с тех пор. Как ясно видно, GRADES - это дочерняя таблица STUDENT, и в ней должен быть FK от Grades до Student. Если этот FK не существует, вы готовы принять строки с потерянными оценками; это то, над чем ты так усердно работаешь. Если этот FK существует, то есть 3 варианта для предложения ON Delete.

  1. Каскад . В этом случае только что обновленные Гранд-строки будут удалены. Так какой смысл его обновлять?
  2. Restrict (по умолчанию, если удаление не указано). В этом случае должно быть выдано исключение «ORA-02292: ограничение целостности ...». Это отменяет как обновление оценок, так и удаление учащегося.
  3. Set Null . В этом случае вы только что создали осиротевшую строку, как если бы FK не существовало.

Таким образом, в конце процесса у вас возникла исключительная ситуация или осиротевшая строка GRADES, которую вы не можете определить учеником. принадлежал, потому что строка СТУДЕНТ больше не существует. Если это так, то у вас явно нарушена модель данных.

0 голосов
/ 31 марта 2020

Используйте столбец student_id, если он существует в вашей таблице, и используйте триггер перед удалением. Здесь: old.student_id - это значение столбца в удаленной строке.

  create or replace trigger delete_from_student
  before delete on student 

   for each row
   begin

   update grades set
   grade = 'D'
   where grade is null
   and student_id=:old.student_id;

 end delete_from_student;
...