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
.