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
.