sql >> Database >  >> RDS >> PostgreSQL

Tabellen weergeven die zijn beïnvloed door trapsgewijze verwijderen

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;


  1. Hoe een externe sleutelbeperking op meerdere kolommen in SQL Server te maken - SQL Server / TSQL-zelfstudie, deel 67

  2. Hoe TRY_CAST() werkt in SQL Server

  3. Tabellen kopiëren van de ene database naar de andere in SQL Server

  4. Gegevenswijzigingen onder Read Committed Snapshot Isolation