2013-12-17 346 views
4

我有两个表AUTHORBOOKAUTHORID连接。火鸟触发前删除

我需要创建一个触发器,以便在删除作者的情况下,首先删除该作者的书籍,然后删除作者。如果有人试图更新AUTHOR中的AUTHORID字段,它会自动更新AUTHORIDBOOK
那可以吗? :)

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 ; # 

回答

5

你不需要触发器来做到这一点。对于删除,您可以使用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); 
+0

TY答案,分配说,我必须做出一个触发器。你认为它可以完成吗?或者它是一个诡计问题? :D – user3112290

+0

它可以用触发器完成,但它不会是多用户安全的解决方案,正确的方法是使用约束。既然它是一个shool赋值(?),我不会为你写触发器,我只说你需要一个'before delete'和一个'after update'触发器,语法见http://www.firebirdsql.org /file/documentation/reference_manuals/reference_material/html/langrefupd25-ddl-trigger.html – ain

+0

@ain为什么触发器在约束条件下不安全?在一个实现级别上,Firebird中的约束由系统触发器检查(在带有外键目标的表上) –