PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara membuat daftar tabel yang terpengaruh oleh penghapusan berjenjang

Gunakan pg_depend . Contoh:

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

DEPENDENCY NORMAL - Hubungan normal antara objek yang dibuat secara terpisah. Objek dependen dapat dijatuhkan tanpa mempengaruhi objek yang direferensikan. Objek yang direferensikan hanya dapat dijatuhkan dengan menentukan CASCADE, dalam hal ini objek yang bergantung juga dijatuhkan.

Gunakan pg_get_constraintdef() untuk mendapatkan definisi kendala:

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)

Untuk menemukan rantai penuh dependensi berjenjang, kita harus menggunakan rekursi dan melihat ke katalog pg_constraint untuk mendapatkan id dari tabel dependen.

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. Terjadi kesalahan saat membuat basis data spasial. GALAT:tidak dapat memuat perpustakaan /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  2. Cara Menjeda Eksekusi Pernyataan di PostgreSQL

  3. org.postgresql.util.PSQLException:Objek Besar tidak boleh digunakan dalam mode komit otomatis

  4. Tidak ada operator yang cocok dengan nama dan tipe argumen yang diberikan. Anda mungkin perlu menambahkan gips tipe eksplisit. -- Netbeans, Postgresql 8.4 dan Glassfish

  5. Apa urutan default dari daftar yang dikembalikan dari panggilan filter Django?