2016-12-12 10 views
1

外部キーのON DELETE制約にいくつかのロジックを実行できるようにします。ロジックに応じて、私はCASCADEまたはRESTRICTのいずれかにします。ON DELETE外部キー参照の条件付きロジック

マイテーブル:私の(非常に基本的な)で

CREATE TABLE users (
    user_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY 
); 

CREATE TABLE teams (
    team_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY 
); 

CREATE TABLE documents (
    document_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY 
    user_id uuid REFERENCES users ON DELETE /*do logic here*/, 
    team_id uuid REFERENCES teams ON DELETE /*do logic here*/, 
    content text 
); 

テーブルdocumentuserおよび/またはteamが所有することができます。

についてdocumentsについては、誰かがドキュメントのユーザーを削除し、そのドキュメントのteam_idがNULLの場合は、削除をドキュメントにCASCADE(またはその逆、user_idおよびteam_id)します。

他の人がドキュメントのユーザーを削除し、そのドキュメントのteam_idがIS NOT NULLの場合は、ユーザーの削除を制限します(user_idとteam_idの場合はその逆)。

ドキュメントでこれを達成する方法はありませんでした。データベースではなくサーバーコードでこのロジックを実行する必要がありますか?私は、データの整合性の余分な層が欲しいです。

答えて

2

これは可能ですが直接的ではありません。トリガーが必要です。まず、チームのテーブルに対して同じことを行うそして、ユーザテーブル用

CREATE OR REPLACE FUNCTION user_delete() 
RETURNS TRIGGER AS $$ 
BEGIN 
    DELETE FROM documents WHERE team_id IS NULL and user_id = OLD.user_id; 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER user_delete_trigger BEFORE DELETE ON users FOR EACH ROW  EXECUTE PROCEDURE user_delete(); 

をトリガ機能とトリガを作成

CREATE TABLE documents (
    document_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY, 
    user_id uuid REFERENCES users ON DELETE RESTRICT, 
    team_id uuid REFERENCES teams ON DELETE RESTRICT, 
    content text 
); 

をRESTRICTする外部キーを設定します。

CREATE OR REPLACE FUNCTION team_delete() 
RETURNS TRIGGER AS $$ 
BEGIN 
    DELETE FROM documents WHERE user_id IS NULL and team_id = OLD.team_id; 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER team_delete_trigger BEFORE DELETE ON users FOR EACH ROW  EXECUTE PROCEDURE team_delete(); 

これは私があなたが探しているものを正確に信じています。

関連する問題