【问题标题】:Which tables and columns are altered for both REVOKE/GRANT ALL ON FUNCTIONREVOKE/GRANT ALL ON FUNCTION 更改了哪些表和列
【发布时间】:2018-07-03 09:20:24
【问题描述】:

针对以下查询更改了哪些表/列:

REVOKE ALL PRIVILEGES ON FUNCTION "..."() FROM PUBLIC CASCADE;
-- function_owner can still update the function

GRANT ALL PRIVILEGES ON FUNCTION "..."() TO function_owner CASCADE;


REVOKE ALL PRIVILEGES ON FUNCTION "..."() FROM function_owner CASCADE;
-- function_owner can't update the function. 

GRANT ALL PRIVILEGES ON FUNCTION "..."() TO function_owner CASCADE;
-- function_owner can now update the function.

我知道pg_catalog.pg_proc.proacl 已更改。还有其他表和列吗?

【问题讨论】:

    标签: postgresql privileges


    【解决方案1】:

    pg_proc.proacl 确实是唯一一个在您拥有GRANTREVOKE 函数权限时被修改的列。

    有两点需要牢记:

    1. 创建函数时,它具有默认权限(PUBLIC 和所有者可以EXECUTE 它),proacl 列为 NULL(这表示默认权限)。

      这就是为什么该列一开始是空的,并且在你REVOKEPUBLIC 的权限之后包含一个值。

    2. 如果您REVOKE 以前没有授予过特权,则不会发生任何事情。同样,如果您GRANT 一个已被授予的权限,则不会发生任何事情。

      你的GRANT就是这样一个空操作,因为所有者默认拥有EXECUTE权限。在使用 REVOKE 更改默认权限之前,您只是看不到它。

    【讨论】:

    • 只是出于好奇,您是如何了解到这一切的?只是通过阅读文档?还是您也阅读了源代码?
    • 阅读文档,使用软件,阅读和破解源代码。
    • 关于为新创建的数据库设置(或更改)默认值的任何推荐读物?还是 PG 文档几乎涵盖了所有内容?
    • 我不喜欢PUBLIC默认有执行权限,所以我用ALTER DEFAULT PRIVILEGES来改变它。
    • 好的。所以我想我终于弄明白了:proacl_aclitem 类型。它以 NULL 开头(在任何 REVOKE/GRANT/DEFAULT PRIVILEGES 之前)。 REVOKE ... FROM PUBLIC 将其设置为 {function_owner=X/function_owner}REVOKE ... FROM function_owner 将其设置为“空”值:{}。而GRANT ... function_owner 将其设置回{function_owner=X/function_owner}。所以你是对的:proacl 列是唯一使用 3 个不同值更新的列:NULL、空 _aclitiem、{role=privileges}。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多