在PostgreSql中获取数据库所有者的名称


73

我在PostgreSql中有数据库“测试”。我想编写sql以获取数据库的所有者。

Answers:


76

您可以在系统目录中找到此类内容

SELECT d.datname as "Name",
pg_catalog.pg_get_userbyid(d.datdba) as "Owner"
FROM pg_catalog.pg_database d
WHERE d.datname = 'database_name'
ORDER BY 1;

1
'你的名字'??这是什么?我需要传递我不知道的东西才能知道一些东西?
丹尼尔·莫勒(DanielMöller)

@DanielMöller您会知道数据库名称。您只是要确定的给定数据库的所有者。如果您不知道数据库名称,则只需忽略该WHERE子句。
ManoDestra

我的意思是说上面给定数据库的“名称”。
ManoDestra

52

如果使用psql命令行工具,则只需使用\l


这将返回数据库列表,但返回数据库的所有者。
Flimm

2
@Flimm我不理解您的评论-这将返回服务器上所有现有数据库的列表(该当前用户有权查看),并带有每个数据库的所有者。
吉拉德·马亚尼

你是对的。我正在使用pgcli它,由于某种原因会给出不同的结果。
Flimm

这应该是公认的答案
qichao_he

41

您可以通过以下方式使用pg_databasepg_users系统表和current_database()功能的组合:

 SELECT u.usename 
 FROM pg_database d
  JOIN pg_user u ON (d.datdba = u.usesysid)
 WHERE d.datname = (SELECT current_database());

如果数据库是角色(一组用户)而非用户所有,则此方法将无效。
JC Boggio

2

可以与组角色拥有的数据库一起使用:

SELECT
    U.rolname
   ,D.datname
FROM
    pg_roles AS U JOIN pg_database AS D ON (D.datdba = U.oid)
WHERE
    D.datname = current_database();

pg_authid代替pg_rolesSuperUser来使用(就像我在先前版本中所做的那样),因为它拥有密码(请参阅文档),因此它仅限于SuperUser :

由于该目录包含密码,因此不得公开读取。pg_roles是一个公开可读的视图,pg_authid它使密码字段无效。


运行此命令时,它拒绝了关系pg_authid的权限。需要什么?
史蒂芬·雍

1
@StevenYong,谢谢您指出这一点,我已经更新了答案。阅读该文档,用替换就足够pg_authidpg_roles。祝你今天愉快。
jlandercy

1

可以使用magic :: regrole强制转换角色OID以提供所有者的角色名称:

SELECT datdba::regrole FROM pg_database WHERE datname = 'test' ;


0

请记住,在包括postgres的SQL中,您在给定的sql服务器实例中具有一个层次结构: catalog/db > schema > tables

当寻找烫发/元数据中的一个目录,你想看看information_schema

示例: information_schema.role_table_grants用于表烫发

示例: information_schema.role_usage_grants对于SEQUENCE /模式烫发

https://www.postgresql.org/docs/current/information-schema.html

对于商品目录/数据库级别的配置/元,您需要在中查找另一个级别pg_catalog

https://www.postgresql.org/docs/current/catalogs.html

例:

SELECT dbs.datname, roles.rolname
  FROM pg_catalog.pg_database dbs, pg_catalog.pg_roles roles
 WHERE dbs.datdba = roles.oid;

pg_catalog.pg_database.datdba 具有所有者角色的ID。

pg_catalog.pg_roles.oid 具有所有者角色的ID(加入)

pg_catalog.pg_roles.rolname 具有所有者角色的名称/字符串

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.