在PostgreSQL 8.4中执行触发功能需要哪些特权?


11

在PostgreSQL 8.4中执行触发功能需要哪些特权?

似乎为角色设置的特权与执行触发功能无关紧要。我想我已经看到有一天执行触发器功能所需的特权是EXECUTE特权,但对于表的所有者而言,而不是执行触发触发器的触发器的实际角色。

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

Answers:


10

就特权而言,触发器功能的行为与其他功能相同。除少数例外:

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

更新 在评论中反馈之后,我做了一些研究。Postgres Wiki中有一个待办事项:

加强触发权限检查

链接到Postgres黑客上的该线程。当前,EXECUTE仅在触发器创建时检查触发器功能的特权,而不在运行时检查特权。因此,撤消对触发器功能的执行对创建后的触发器没有影响。您的观察似乎是正确的。

这不会授予任何其他特权来操作对象。如果调用角色缺少执行功能主体(的一部分)所需的特权,则会引发通常的异常。为了铺平道路,您可以使OWNER该功能成为特权用户并使用

SECURITY DEFINER

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

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

REVOKE ALL ON FUNCTION foo() FROM public;

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

在此有关SO的答案中找到一个代码示例。


不,我不要SECURITY DEFINER,我想要SECURITY INVOKER。但是似乎(对于触发函数,而不是常规函数)通过​​使用默认选项(SECURITY INVOKER),它的行为并非如此。

1
@EtienneRouxel:就特权而言,触发器功能与其他功能一样。是什么让您另想呢?
Erwin Brandstetter

@EtienneRouxel:我在手册中添加了引号,以记录次要异常。
Erwin Brandstetter

1
测试:我创建了一个简单的触发函数,引发了NOTICE。我ALLPUBLIC该函数的所有者那里删除了特权。然后,如果我使用对该功能没有任何特权的所有者或任何其他角色,由于缺少特权,我应该期望出现错误,但是一切都会成功运行。

2
@EtienneRouxel:有趣。我也测试过。如果您没有触发器功能的执行特权,则无法创建触发器。但是您仍然可以在创建触发器后撤销该执行特权,并且触发器不会停止工作。我做了一些研究。添加到问题的链接...
欧文·布兰德斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.