Các chức năng kích hoạt hoạt động giống như các chức năng khác khi có liên quan đến các đặc quyền. Với một ngoại lệ nhỏ:
Để tạo một kích hoạt trên một bảng, người dùng phải có TRIGGER
đặc quyền trên bảng. Người dùng cũng phải có EXECUTE
đặc quyền về chức năng kích hoạt.
CẬP NHẬT
Sau khi phản hồi trong các ý kiến tôi đã làm một số nghiên cứu. Có một mục TODO mở trong Wiki Postgres:
Thắt chặt kiểm tra quyền kích hoạt
Liên kết với chủ đề này trên tin tặc Postgres . Hiện tại, các EXECUTE
đặc quyền trên một chức năng kích hoạt chỉ được kiểm tra tại thời điểm tạo kích hoạt , nhưng không phải trong thời gian chạy. Vì vậy, việc thu hồi EXECUTE trên chức năng kích hoạt không có tác dụng đối với trình kích hoạt một khi được tạo. Quan sát của bạn có vẻ đúng.
Điều này không cấp bất kỳ đặc quyền bổ sung để thao túng các đối tượng. Nếu vai trò gọi thiếu các đặc quyền cần thiết để thực thi (các phần của) thân hàm, ngoại lệ thông thường được nêu ra. Để mở đường, bạn có thể tạo một người dùng đặc quyền OWNER
của hàm và sử dụng
SECURITY DEFINER
mệnh đề, như được ghi trong tài liệu hướng dẫn ở đây . Nó làm cho chức năng được chạy với sự cho phép của chủ sở hữu thay vì invoker (mặc định).
Nếu chủ sở hữu là siêu người dùng, bạn cần hết sức cẩn thận, người bạn cấp EXECUTE
đặc quyền và chức năng có thể làm gì để tránh lạm dụng. Bạn có thể muốn
REVOKE ALL ON FUNCTION foo() FROM public;
để bắt đầu và sử dụng SET search_path
cho chức năng.
Hãy chắc chắn đọc chương về Chức năng viết một cách SECURITY DEFINER
an toàn .
Tìm một ví dụ mã trong câu trả lời liên quan này trên SO.
SECURITY DEFINER
, tôi muốn aSECURITY INVOKER
. Nhưng dường như (đối với chức năng kích hoạt, không phải cho chức năng thông thường) rằng bằng cách sử dụng tùy chọn mặc định (SECURITY INVOKER
), nó không hoạt động như vậy.