Użyj pg_depend
. Przykład:
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'
oznacza:
ZALEŻNOŚĆ NORMALNA — normalna relacja między oddzielnie tworzonymi obiektami. Obiekt zależny można usunąć bez wpływu na obiekt, do którego istnieje odwołanie. Obiekt, do którego się odwołuje, może zostać usunięty tylko przez określenie CASCADE, w którym to przypadku również obiekt zależny jest usuwany.
Użyj pg_get_constraintdef()
aby uzyskać definicje ograniczeń:
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)
Aby znaleźć pełny łańcuch zależności kaskadowych, powinniśmy użyć rekurencji i zajrzeć do katalogu pg_constraint
aby uzyskać id
tabeli zależnej.
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;