2013-12-17 260 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中的約束由系統觸發器檢查(在帶有外鍵目標的表上) –