Триггер Firebird перед удалением

У меня есть две таблицы AUTHOR и BOOK, соединенные AUTHORID.

Мне нужно создать триггер, который в случае удаления автора сначала удаляет книги этого автора, а затем удаляет автора. И если кто-то просто попытается обновить поле AUTHORID в AUTHOR, он автоматически обновит AUTHORID в BOOK.
Это вообще выполнимо? :)

set term # ;  
create trigger del for author  
before delete or update as  
  declare variable aut int;  
  declare variable bok int;  
begin  
  if(deleting) then  
  begin  
    delete from book where authorid=:aut;  
    delete from author where authorid=:aut;  
  end  
  if (updating) then  
  begin  
    update book set authorid=new.authorid;  
  end end#  
set term ; # 

person user3112290    schedule 17.12.2013    source источник


Ответы (1)


Для этого не нужен триггер. Для удаления вы можете использовать внешний ключ ON DELETE CASCADE. Это автоматически приведет к каскадному удалению зависимой строки, если цель внешнего ключа будет удалена.

В общем, я бы посоветовал не разрешать людям менять идентификаторы, но если вам это действительно нужно или вы хотите, вы можете использовать ON UPDATE CASCADE. Это автоматически обновит внешний ключ, если цель внешнего ключа изменится.

Так, например (скопировано/изменено из справочника по языку Interbase 6):

CREATE TABLE T1 (P1 INTEGER NOT NULL PRIMARY KEY);
CREATE TABLE T2 (F2 INTEGER REFERENCES T1(P1)
  ON UPDATE CASCADE
  ON DELETE CASCADE);
person Mark Rotteveel    schedule 17.12.2013
comment
ты за ответ, в задании написано, что я должен сделать триггер. Как вы думаете, это можно сделать или это вопрос с подвохом? :D - person user3112290; 17.12.2013
comment
Это можно сделать с помощью триггеров, но это не будет многопользовательским безопасным решением, правильный способ - использовать ограничения. Поскольку это школьное задание(?), я не буду писать за вас триггеры, я только скажу, что вам нужен один триггер before delete и один триггер after update, синтаксис см. firebirdsql.org/file/documentation/reference_manuals/ - person ain; 18.12.2013
comment
@ain Почему триггер небезопасен там, где есть ограничение? На уровне реализации ограничения в Firebird проверяются системным триггером (на таблице с целью внешнего ключа) - person Mark Rotteveel; 18.12.2013
comment
Правильно, это должно быть совершенно безопасно, я думаю, я был сбит с толку, когда публиковал свой предыдущий комментарий... - person ain; 18.12.2013
comment
@user3112290 user3112290 Если вам действительно нужно написать триггер, вам следует обновить вопрос, указав дополнительную информацию (что вы пробовали, что не работает или где вы застряли). Просто сказать «я не знаю» выглядит как призыв к нам сделать вашу домашнюю работу. - person Mark Rotteveel; 18.12.2013
comment
Верно, извини. Я не знаю, как сказать триггеру удалить записи в таблице BOOK, связанные с AUTHOR. если кто-то попытается удалить автора с AUTHORID=1, то как триггер узнает, какие строки в BOOK нужно удалить. Мы занимаемся psql уже 2 недели, а до этого я даже не знал, что можно программировать на firebird. Я уже 2 дня ищу решение этой проблемы и ничего не нашел... - person user3112290; 18.12.2013
comment
Пожалуйста, укажите это в своем вопросе, а не в комментариях. - person Mark Rotteveel; 19.12.2013