在Postgres中查询授予序列的GRANTS

17

要查询授予给表的GRANTS,可以使用以下查询:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

(请查看我之前的问题:在PostgreSQL中查询表的授权

但我如何查询授予序列的GRANTS?

2个回答

18

我已经查看了源代码,但无法在information_schema表中找到公开序列ACL的任何位置。(虽然我可能错过了什么。)

然而,在系统目录pg_class中,PostgreSQL确实公开了序列的ACL。

SELECT relname, relacl
FROM pg_class
WHERE relkind = 'S'
  AND relacl is not null
  AND relnamespace IN (
      SELECT oid
      FROM pg_namespace
      WHERE nspname NOT LIKE 'pg_%'
        AND nspname != 'information_schema'
);

就 information_schema 和标准 SQL 序列而言,PostgreSQL 不支持它们。

select feature_name, is_supported 
from information_schema.sql_features
where feature_name = 'Sequence generator support';

在这方面,PostgreSQL是不符合标准的,因为它将information_schema.sequences暴露出来,但没有返回“Sequence generator support”的“YES”(这只是对PostgreSQL的观察,而不是批评)。

不过,话虽如此,在2003年的SQL标准中,我也没找到任何暴露这些权限的内容。在ROLE_TABLE_GRANTS视图的定义中很容易找到PRIVILEGE_TYPE,但就我所知,在标准中并没有类似于序列的内容。


谢谢你的答案,但那并不是我所需要的。 - markus
你所需要的可能不存在。information_schema表在最早的SQL标准中被定义。但是,序列直到2003年才成为SQL标准的一部分。大多数支持序列的DBMS在标准发布之前就已经具有了这种支持,并且它们中的大多数都不完全符合标准行为或语法。 - Mike Sherrill 'Cat Recall'
我刚刚添加了一些信息,使得你想要的东西看起来更加不可能。如果你想自己查看,可以在网上找到 SQL 2003 标准的最新草案。 - Mike Sherrill 'Cat Recall'
2
除了@MikeSherrill'CatRecall'所解释的内容之外,您还可以使用他发布的pg_class查询来推断授予序列的权限,其中包含relacl列的内容。 第一组(在第一个逗号之前)将是序列所有者权限:owner=rwU/owner,其中r表示读取权限(currval),w表示写入权限(nextvalsetval),U表示使用权限(currvalnextval)。 由于通常只授予使用和选择权限,因此其他acl看起来像grantee=rU/owner - mimidatabase
2
我在其他帖子中找到了这个,它对我有用:select * from information_schema.role_usage_grants - enesaltinok

-3

1
这不是在查询序列上的授权,而是在设置它们。 - karatedog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接