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

Izinkan penyisipan hanya dari dalam pemicu

Ya, sangat mungkin.

1. Umumnya larang UPDATE ke A

Saya akan beroperasi dengan hak istimewa:

REVOKE ALL ON TABLE A FROM public;  -- and from anybody else who might have it

Itu meninggalkan pengguna super seperti postgres yang mengabaikan pembatasan rendah ini. Tangkap yang ada di dalam fungsi pemicu Anda di A dengan pg_has_role() :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
END IF;

Dimana postgres adalah pengguna super yang sebenarnya. Catatan:ini juga menangkap pengguna super lain, karena mereka adalah anggota dari setiap peran, bahkan pengguna super lainnya.

Anda dapat menangkap non-pengguna super dengan cara yang sama (alternatif dari REVOKE pendekatan).

2. Izinkan UPDATE untuk peran daemon

Buat peran non-login, yang diizinkan untuk memperbarui A :

CREATE ROLE a_update NOLOGIN;
-- GRANT USAGE ON SCHEMA xyz TO a_update;  -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;

Buat fungsi pemicu pada tabel B dan C , milik oleh peran daemon ini dan dengan SECURITY DEFINER . Detail:

Tambahkan ke fungsi pemicu di A :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
   RETURN NEW;
END IF;

Untuk dependensi sederhana 1:1, Anda juga dapat bekerja dengan batasan kunci asing (sebagai tambahan) menggunakan ON UPDATE CASCADE .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ebean mencari nama urutan yang salah di Play Framework 2

  2. Tidak dapat memilih beberapa baris dengan npgsql pada database Portugis

  3. Cara mendapatkan penjumlahan dengan hitungan lebih besar dari jumlah tertentu

  4. Django + PostgreSQL:membuat database (hak istimewa apa yang diberikan)

  5. Cara memasukkan data CSV ke database PostgreSQL (database jarak jauh)