sql >> データベース >  >> RDS >> PostgreSQL

カスケード削除の影響を受けるテーブルを一覧表示する方法

    pg_dependを使用する 。例:

    create table master (id int primary key);
    create table detail_1 (id int, master_id int references master(id) on delete restrict);
    create table detail_2 (id int, master_id int references master(id) on delete cascade);
    
    select pg_describe_object(classid, objid, objsubid)
    from pg_depend 
    where refobjid = 'master'::regclass and deptype = 'n';
    
                      pg_describe_object
    ------------------------------------------------------
     constraint detail_1_master_id_fkey on table detail_1
     constraint detail_2_master_id_fkey on table detail_2
    (2 rows)
    

    deptype = 'n' 意味:

    DEPENDENCYNORMAL-個別に作成されたオブジェクト間の通常の関係。依存オブジェクトは、参照オブジェクトに影響を与えることなくドロップできます。参照されるオブジェクトは、CASCADEを指定することによってのみ削除できます。この場合、依存オブジェクトも削除されます。

    pg_get_constraintdef()を使用します 制約定義を取得するには:

    select 
        pg_describe_object(classid, objid, objsubid), 
        pg_get_constraintdef(objid)
    from pg_depend 
    where refobjid = 'master'::regclass and deptype = 'n';
    
    
                      pg_describe_object                  |                       pg_get_constraintdef
    ------------------------------------------------------+------------------------------------------------------------------
     constraint detail_1_master_id_fkey on table detail_1 | FOREIGN KEY (master_id) REFERENCES master(id) ON DELETE RESTRICT
     constraint detail_2_master_id_fkey on table detail_2 | FOREIGN KEY (master_id) REFERENCES master(id) ON DELETE CASCADE
    (2 rows)
    

    カスケード依存関係の完全なチェーンを見つけるには、再帰を使用してカタログpg_constraintを調べる必要があります。 idを取得するには 従属テーブルの。

    with recursive chain as (
        select classid, objid, objsubid, conrelid
        from pg_depend d
        join pg_constraint c on c.oid = objid
        where refobjid = 'the_table'::regclass and deptype = 'n'
    union all
        select d.classid, d.objid, d.objsubid, c.conrelid
        from pg_depend d
        join pg_constraint c on c.oid = objid
        join chain on d.refobjid = chain.conrelid and d.deptype = 'n'
        )
    select pg_describe_object(classid, objid, objsubid), pg_get_constraintdef(objid)
    from chain;
    


    1. TSQL-BEGIN .. ENDブロック内でGOを使用する方法は?

    2. コレーションがわかりませんか? (Mysql、RDBMS、文字セット)

    3. SQL Developerでストアドプロシージャを実行しますか?

    4. データベーステストとは何ですか?それを実行する方法は?