PostgreSQL
 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' означава:

НОРМАЛНА ЗАВИСИМОСТ - Нормална връзка между отделно създадени обекти. Зависимият обект може да бъде отхвърлен, без да се засяга реферираният обект. Реферираният обект може да бъде премахнат само чрез задаване на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нулиране на брояча за автоматично увеличение в postgres

  2. Не използвайки NULL в PostgreSQL все още ли използва NULL растерна карта в заглавката?

  3. PHP и Postgres:улавяне на грешки?

  4. Избройте колони с индекси в PostgreSQL

  5. Как да наблюдавате PostgreSQL, работещ вътре в Docker контейнер:Част втора