我在 PostgreSql 中有数据库“测试”。我想编写 sql 来获取我的数据库的所有者。
7 回答
你可以在系统目录中找到这样的东西
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;
如果您使用psql命令行工具,您可以简单地使用\l
您可以通过这种方式使用pg_database
、pg_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());
可以使用魔法::regrole 将角色 OID 转换为所有者的角色名称:
SELECT datdba::regrole FROM pg_database WHERE datname = 'test' ;
这适用于组角色拥有的数据库:
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
用于清除密码字段。
以下查询显示公共架构中所有表的信息:
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/
请记住,在包括 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
具有所有者角色的名称/字符串