90

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

4

7 回答 7

99

你可以在系统目录中找到这样的东西

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;
于 2013-06-18T09:38:46.340 回答
70

如果您使用psql命令行工具,您可以简单地使用\l

于 2016-08-19T09:04:54.290 回答
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());
于 2013-06-18T09:41:02.273 回答
7

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

SELECT datdba::regrole FROM pg_database WHERE datname = 'test' ;
于 2020-11-17T09:39:11.790 回答
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_roles仅限于 SuperUser 因为它保存密码(请参阅文档):

由于此目录包含密码,因此不得公开阅读。pg_roles是一个可公开阅读的视图,pg_authid用于清除密码字段。

于 2017-08-04T13:13:29.787 回答
0

以下查询显示公共架构中所有表的信息:

 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/

于 2018-07-03T09:19:01.350 回答
0

请记住,在包括 postgres 在内的 SQL 中,您在给定的 sql server 实例中有一个层次结构: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

对于目录/db-level config/meta,您需要在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具有所有者角色的名称/字符串

于 2019-10-05T10:33:28.763 回答