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

110

我在PostgreSql中有一个名为"test"的数据库,我想编写SQL语句以获取我的数据库所有者。

7个回答

127
你可以在系统目录中找到这些东西。
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
“your_name”?这是什么意思?我需要传递一些我不知道的东西才能知道某些东西吗? - Daniel Möller
@DanielMöller 你应该知道数据库的名称。你要确定的只是给定数据库的所有者。如果你不知道数据库的名称,那么就省略掉 WHERE 子句。 - ManoDestra
我想说的是上面给定的数据库的“名称”。 - ManoDestra
1
如果您需要动态地查找您所连接的数据库以及您感兴趣的所有者,可以使用 current_database() - Eerik Sven Puudist
您可以删除 where 子句以获取当前集群中所有数据库的所有者。 - Code-Apprentice

95
如果您使用命令行工具psql,则可以直接使用\l命令。

这将返回数据库列表,但不包括数据库的所有者。 - Flimm
5
我不理解你的评论-这将返回服务器上当前用户有权限查看的所有现有数据库列表,并显示每个数据库的所有者。 - gilad905
1
你说得对。我使用的是 pgcli,不知何故会给出不同的结果。 - Flimm
1
这个非常漂亮和简单。只需两个字符即可完成。哈哈 - Tmanok

45
您可以使用 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
current_catalog 是 current_database() 的同义词。 FROM pg_database d JOIN pg_user u ON (d.datdba = u.usesysid) WHERE d.datname = current_catalog;``` - undefined

15

可以使用魔法::regrole将角色OID直接转换为角色所有者的名称:

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

4

这个与由组角色拥有的数据库一起工作:

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_roles而不是pg_authid(就像我之前的版本一样)是有限制的,因为它包含密码(请参阅文档):

由于此目录包含密码,因此不能公开读取。 pg_rolespg_authid 上的可公开读取视图,并且会将密码字段清空。


运行时出现了“关系pg_authid的权限被拒绝”的错误。需要做什么? - Steven Yong
1
@StevenYong,感谢您指出这一点,我已经更新了我的答案。阅读文档后,只需将“pg_authid”替换为“pg_roles”即可。祝您有愉快的一天。 - jlandercy

1
以下查询显示公共模式下所有表的信息:
 select t.table_name, t.table_type, c.relname, c.relowner, u.usename
 from information_schema.tables t
 join pg_catalog.pg_class c on (t.table_name = c.relname)
 join pg_catalog.pg_user u on (c.relowner = u.usesysid)
 where t.table_schema='public';

来源:http://cully.biz/2013/12/11/postgresql-getting-the-owner-of-tables/


0

在SQL中,包括Postgres,在给定的SQL服务器实例中有一个层次结构:目录/数据库 > 模式 > 表

当寻找目录内的权限/元数据时,您要查看information_schema

例如:对于表权限,使用information_schema.role_table_grants

例如:对于序列/模式权限,使用information_schema.role_usage_grants

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 具有所有者角色的名称/字符串


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