gpt4 book ai didi

postgresql - 查明用户是否有权在 PostgreSQL 中选择/更新/...表/函数/...

转载 作者:行者123 更新时间:2023-11-29 11:14:28 26 4
gpt4 key购买 nike

在 PostgreSQL 中确定用户是否对某个类(例如表或函数)具有特定权限(例如选择或执行)的推荐方法是什么?

此刻我得到了类似的东西

aclcontains(
someColumnWithAclitemArray,
makeaclitem(userOid,grantorOid,someRight,false))

但这很糟糕,因为我必须检查每个可能的 grantorOid 以及用户可能属于的每个 userOid

相关说明:您可以测试哪些可能的权限?我没有找到任何文档,但我猜是在阅读源代码:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

似乎还有一个 CREATE TEMP 正确,但我无法找出在 makeaclitem 函数中使用的正确文本。

最佳答案

我发现一个更好的方法(我似乎记得这是从 psql 中内置的一些查询中获取的,或者可能是 information_schema View )是使用 has_*_privilege 函数,并且只需将它们应用于一组所有可能的用户和对象组合。这也将考虑通过某些组角色访问对象。

例如,这将显示哪些用户对非目录表和 View 具有哪些访问权限:

select usename, nspname || '.' || relname as relation,
case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
pg_user,
(values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

可能的权限在 has_*_privilege 函数的描述中有详细说明 http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' 是数据库级别的特权:它允许用户使用 pg_temp_* 模式。可以使用 has_database_privilege(useroid, datoid, 'TEMP') 进行测试。

关于postgresql - 查明用户是否有权在 PostgreSQL 中选择/更新/...表/函数/...,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com