在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

11 postgresql trigger stored-procedures permissions postgresql-8.4

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。

我找不到解释这一点的文档部分,有什么帮助吗?

Erw*_*ter 10

就特权而言,触发器函数的行为与其他函数一样。除了一个小例外:

要在表上创建触发器,用户必须具有TRIGGER 该表的权限。用户还必须具有EXECUTE触发功能的权限。

更新 在评论中反馈后,我做了一些研究。Postgres Wiki 中有一个开放的 TODO 项目:

加强触发器权限检查

链接到Postgres 黑客上的这个线程。目前,EXECUTE触发器函数的权限只在触发器创建时检查,而不是在运行时检查。因此,在触发器函数上撤销 EXECUTE 对创建的触发器没有影响。你的观察似乎是正确的。

这不会授予任何额外的权限来操作对象。如果调用角色缺乏执行(部分)函数体所需的权限,则会引发通常的异常。为了铺平道路,您可以创建OWNER该功能的特权用户并使用

SECURITY DEFINER
Run Code Online (Sandbox Code Playgroud)

条款,如此处的手册中所述。它导致函数以所有者的权限而不是调用者的权限运行(默认)。

如果所有者是超级用户,则需要格外小心授予谁EXECUTE特权以及该功能可以做什么来避免滥用。你可能想要

REVOKE ALL ON FUNCTION foo() FROM public;
Run Code Online (Sandbox Code Playgroud)

开始并SET search_path用于该功能。
请务必阅读安全编写SECURITY DEFINER函数一章。

在 SO 上的相关答案中查找代码示例。

  • @EtienneRouxel:有趣。我也测试过。如果您没有触发器函数的执行权限,则无法创建触发器。但是您仍然可以在创建触发器后撤销该执行权限,并且触发器不会停止工作。我做了一些研究。添加问题的链接... (2认同)