Answers:
就特权而言,触发器功能的行为与其他功能相同。除少数例外:
要在表上创建触发器,用户必须
TRIGGER
在表上具有特权。用户还必须具有EXECUTE
触发功能的特权。
更新 在评论中反馈之后,我做了一些研究。Postgres Wiki中有一个待办事项:
加强触发权限检查
链接到Postgres黑客上的该线程。当前,EXECUTE
仅在触发器创建时检查触发器功能的特权,而不在运行时检查特权。因此,撤消对触发器功能的执行对创建后的触发器没有影响。您的观察似乎是正确的。
这不会授予任何其他特权来操作对象。如果调用角色缺少执行功能主体(的一部分)所需的特权,则会引发通常的异常。为了铺平道路,您可以使OWNER
该功能成为特权用户并使用
SECURITY DEFINER
条款,如此处的手册中所述。它使该函数在所有者而不是调用者的权限下运行(默认)。
如果所有者是超级用户,则需要格外小心,向谁授予EXECUTE
特权以及该功能可以如何避免滥用。您可能想要
REVOKE ALL ON FUNCTION foo() FROM public;
开始并SET search_path
用于该功能。
请务必阅读“ 安全编写SECURITY DEFINER
函数 ”一章。
在此有关SO的答案中找到一个代码示例。
NOTICE
。我ALL
从PUBLIC
该函数的所有者那里删除了特权。然后,如果我使用对该功能没有任何特权的所有者或任何其他角色,由于缺少特权,我应该期望出现错误,但是一切都会成功运行。
SECURITY DEFINER
,我想要SECURITY INVOKER
。但是似乎(对于触发函数,而不是常规函数)通过使用默认选项(SECURITY INVOKER
),它的行为并非如此。