我在PostgreSql中有一个名为"test"的数据库,我想编写SQL语句以获取我的数据库所有者。
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;
\l
命令。pgcli
,不知何故会给出不同的结果。 - Flimmpg_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());
FROM pg_database d
JOIN pg_user u ON (d.datdba = u.usesysid)
WHERE d.datname = current_catalog;```
- undefined可以使用魔法::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_roles
而不是pg_authid
(就像我之前的版本一样)是有限制的,因为它包含密码(请参阅文档):
由于此目录包含密码,因此不能公开读取。
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/
在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
具有所有者角色的名称/字符串
current_database()
。 - Eerik Sven Puudistwhere
子句以获取当前集群中所有数据库的所有者。 - Code-Apprentice