PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So listen Sie Tabellen auf, die von kaskadierendem Löschen betroffen sind

Verwenden Sie pg_depend . Beispiel:

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' bedeutet:

ABHÄNGIGKEIT NORMAL - Eine normale Beziehung zwischen separat erstellten Objekten. Das abhängige Objekt kann gelöscht werden, ohne das referenzierte Objekt zu beeinflussen. Das referenzierte Objekt kann nur durch Angabe von CASCADE gelöscht werden, dann wird auch das abhängige Objekt gelöscht.

Verwenden Sie pg_get_constraintdef() um Constraint-Definitionen zu erhalten:

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)

Um die vollständige Kette der kaskadierenden Abhängigkeiten zu finden, sollten wir Rekursion verwenden und in den Katalog pg_constraint schauen um id zu erhalten einer abhängigen Tabelle.

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;