Gebruik pg_depend
. Voorbeeld:
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'
betekent:
DEPENDENCY NORMAL - Een normale relatie tussen afzonderlijk gemaakte objecten. Het afhankelijke object kan worden verwijderd zonder het desbetreffende object te beïnvloeden. Het object waarnaar wordt verwezen kan alleen worden verwijderd door CASCADE op te geven, in welk geval het afhankelijke object ook wordt verwijderd.
Gebruik pg_get_constraintdef()
om beperkingsdefinities te krijgen:
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)
Om de volledige keten van trapsgewijze afhankelijkheden te vinden, moeten we recursie gebruiken en in de catalogus pg_constraint
kijken om id
. te krijgen van een afhankelijke tabel.
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;