如何在 PostgreSQL 中默认撤销函数的执行权限

Posted

技术标签:

【中文标题】如何在 PostgreSQL 中默认撤销函数的执行权限【英文标题】:How to Revoke Execute Privileges on Functions in PostgreSQL by Default 【发布时间】:2016-10-27 21:59:03 【问题描述】:

我正在尝试使用命令ALTER DEFAULT PRIVILEGES... 在 PostgreSQL 9.5.4 中设置默认权限。这在尝试授予权限时有效,但我不知道默认情况下如何撤销函数的执行权限。我试过了:

ALTER DEFAULT PRIVILEGES FOR USER myAdmin IN SCHEMA public
    REVOKE EXECUTE ON FUNCTIONS FROM public;

这似乎对\ddp 的输出没有影响。有没有办法防止功能被所有者以外的用户执行,除非另有授权?谢谢。

【问题讨论】:

public 目前属于什么角色? @Nicarus 我对 PostgreSQL 角色相当陌生,因此不明白你的问题。我尝试了相同的命令,但用特定用户名替换了最终的 public 标识符。这对\ddp 的输出也没有影响。 运行这个:SELECT * FROM pg_roles WHERE rolename = 'public'; 你应该可以看到权限。以及该角色的角色。例如,角色是 superuser,因此您更改 privs 不会产生影响。 @Nicarus 该选择语句(我必须将 rolename 更改为 rolname)返回 0 行。据我了解,“public”是一个内置关键字,表示所有用户。这不正确吗? 奇怪...没有IN SCHEMA public 似乎也可以工作,虽然我不知道有什么区别... 【参考方案1】:

如果您指定IN SCHEMAALTER DEFAULT PRIVILEGES,您只能授予 权限,而不能撤销这些权限。

The documentation 说:

为每个模式指定的默认权限被添加到特定对象类型的全局默认权限中。

因此,您必须将命令更改为:

ALTER DEFAULT PRIVILEGES FOR USER myAdmin
    REVOKE EXECUTE ON FUNCTIONS FROM public;

【讨论】:

以上是关于如何在 PostgreSQL 中默认撤销函数的执行权限的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中撤销另一个用户授予的权限

9——对象的创建和撤销,构造函数和析构函数

如何在postgresql中识别函数是不是正在执行

如何启用 PostgreSQL 函数分析器?

如何撤销一个已经执行的更新SQL语句

如何在 PostgreSQL 8.3 中执行窗口函数