Fungsi pemicu berperilaku seperti fungsi lainnya sejauh menyangkut hak istimewa. Dengan pengecualian kecil:
Untuk membuat pemicu di atas meja, pengguna harus memiliki TRIGGER
hak istimewa di atas meja. Pengguna juga harus memiliki EXECUTE
hak istimewa pada fungsi pemicu.
UPDATE
Setelah umpan balik dalam komentar saya melakukan riset. Ada item TODO terbuka di Postgres Wiki:
Kencangkan cek izin pemicu
Ditautkan ke utas ini di peretas Postgres . Saat ini, EXECUTE
hak istimewa pada fungsi pemicu hanya diperiksa pada pemicu membuat waktu, tapi tidak pada saat runtime. Jadi mencabut EXECUTE pada fungsi pemicu tidak berpengaruh pada pemicu yang pernah dibuat. Pengamatan Anda tampaknya benar.
Ini tidak memberikan hak tambahan apa pun untuk memanipulasi objek. Jika peran panggilan tidak memiliki hak istimewa yang diperlukan untuk mengeksekusi (bagian dari) badan fungsi, pengecualian biasa dinaikkan. Untuk membuka jalan, Anda dapat membuat pengguna OWNER
fungsi yang istimewa dan menggunakan
SECURITY DEFINER
klausa, seperti yang didokumentasikan dalam manual di sini . Ini menyebabkan fungsi dijalankan dengan izin pemilik dan bukan penyerang (default).
Jika pemiliknya adalah pengguna super, Anda harus ekstra hati-hati dengan siapa Anda memberikan EXECUTE
hak istimewa dan apa fungsi yang dapat dilakukan untuk menghindari penyalahgunaan. Anda mungkin mau
REVOKE ALL ON FUNCTION foo() FROM public;
untuk memulai dan menggunakan SET search_path
untuk fungsi.
Pastikan untuk membaca bab tentang Fungsi Menulis dengan SECURITY DEFINER
Aman .
Temukan contoh kode dalam jawaban terkait ini di SO.
SECURITY DEFINER
, saya inginSECURITY INVOKER
. Tetapi tampaknya (untuk fungsi pemicu, bukan untuk fungsi biasa) bahwa dengan menggunakan opsi default (SECURITY INVOKER
), ia tidak bertindak seperti itu.NOTICE
. Saya menghapusALL
hak istimewa dariPUBLIC
dan dari pemilik fungsi. Kemudian, jika saya menggunakan pemilik atau peran lain yang tidak memiliki hak istimewa pada fungsi itu, saya harus mengharapkan kesalahan karena kurangnya hak istimewa tetapi semuanya berjalan dengan sukses.