ฟังก์ชั่นทริกเกอร์ทำงานเหมือนกับฟังก์ชั่นอื่น ๆ ที่เกี่ยวข้องกับสิทธิ์ ด้วยข้อยกเว้นเล็กน้อย:
ในการสร้างทริกเกอร์บนโต๊ะผู้ใช้จะต้องมีTRIGGER
เอกสิทธิ์ในตาราง ผู้ใช้จะต้องมีEXECUTE
สิทธิ์ในฟังก์ชั่นทริกเกอร์
อัพเดท
หลังจากข้อเสนอแนะในความคิดเห็นที่ฉันได้ทำการวิจัยบางอย่าง มีรายการสิ่งที่ต้องทำเปิดใน Postgres Wiki:
ตรวจสอบการอนุญาตให้ทริกเกอร์กระชับ
เชื่อมโยงกับหัวข้อนี้ในแฮกเกอร์ Postgres ปัจจุบันEXECUTE
สิทธิพิเศษของฟังก์ชั่นทริกเกอร์จะถูกตรวจสอบเมื่อสร้างเวลาทริกเกอร์เท่านั้น ดังนั้นการเพิกถอน EXECUTE บนฟังก์ชั่นทริกเกอร์จึงไม่มีผลต่อทริกเกอร์เมื่อสร้างขึ้น การสังเกตของคุณดูเหมือนจะถูกต้อง
สิ่งนี้ไม่ได้ให้สิทธิพิเศษเพิ่มเติมในการจัดการกับวัตถุ หากบทบาทการเรียกไม่มีสิทธิ์ที่จำเป็นในการดำเนินการ (ส่วนต่าง ๆ ) ส่วนของฟังก์ชั่นจะมีการยกข้อยกเว้นตามปกติ เพื่อปูทางคุณสามารถสร้างผู้ใช้ที่มีสิทธิ์OWNER
ของฟังก์ชันและใช้
SECURITY DEFINER
ข้อเช่นการบันทึกไว้ในคู่มือการใช้งานที่นี่ มันทำให้ฟังก์ชั่นที่จะทำงานด้วยสิทธิ์ของเจ้าของแทนผู้เรียก (ค่าเริ่มต้น)
หากเจ้าของเป็น superuser คุณต้องระวังเป็นพิเศษในการที่คุณให้EXECUTE
สิทธิ์และสิ่งที่ฟังก์ชั่นสามารถทำได้เพื่อหลีกเลี่ยงการใช้ในทางที่ผิด คุณอาจต้องการ
REVOKE ALL ON FUNCTION foo() FROM public;
เพื่อเริ่มต้นด้วยและใช้SET search_path
สำหรับฟังก์ชั่น
ให้แน่ใจว่าได้อ่านบทที่เกี่ยวกับการเขียนSECURITY DEFINER
ฟังก์ชั่นได้อย่างปลอดภัย
ค้นหาตัวอย่างรหัสในคำตอบที่เกี่ยวข้องนี้ใน SO
SECURITY DEFINER
SECURITY INVOKER
แต่ดูเหมือนว่า (สำหรับฟังก์ชั่นทริกเกอร์ไม่ใช่สำหรับฟังก์ชั่นปกติ) โดยการใช้ตัวเลือกเริ่มต้น (SECURITY INVOKER
) มันไม่ได้ทำอย่างนั้น