角色
创建角色
bash
CRAETE ROLE {角色名} [LOGIN] [SUPERUSER] [CREATEDB] [CREATEROLE] [REPLICATION] [INHERIT] [WITH ENCRYPTED PASSWORD '密码']
LOGIN
:允许登录SUPERUSER
:拥有超级用户权限CREATEDB
:允许创建databaseCREATEROLE
:允许创建角色REPLICATION
:允许备份INHERIT
:是否继承权限,权限来是其它角色,通过GRANT
将其它角色赋予该角色PASSWORD
:指定密码
删除角色
bash
DROP ROLE [角色名];
删除时如果提示
ERROR: role "角色名" cannot be dropped because some objects depend on it
DETAIL: privileges for database 数据库名
表示在删除角色 时存在依赖关系,导致无法删除该角色。
由于这些依赖关系,必须先解除这些依赖,才能成功删除角色。以下是解决这个问题的步骤:
首先,需要将数据库 “halo” 的所有者更改为其他角色。你可以使用以下命令来更改数据库所有者:
01ALTER DATABASE [角色名] OWNER TO new_owner;
将 “new_owner” 替换为你希望成为数据库所有者的角色的名称。
接下来,需要将命名空间schema的所有者更改为其他角色。使用以下命令来更改模式所有者:
01ALTER SCHEMA {命名空间} OWNER TO new_owner;
替换 “new_owner” 为你希望成为模式所有者的角色的名称。
最后,需要将表的所有者更改为其他角色。使用以下命令来更改表所有者:
ALTER TABLE {表名} OWNER TO new_owner;
将 “new_owner” 替换为你希望成为表所有者的角色的名称。
查询已有角色
bash
0102SELECT * from pg_roles;
或
\du
查询当前登录用户
sql
select current_user;
默认角色
下面这些角色是预创建的,相当于一堆权限集合,可以将其赋予我们的角色,达到快速授权的目的。
| Role | Allowed Access |
| ————————- | ———————————————————— |
| pg_read_all_settings | Read all configuration variables, even those normally visible only to superusers. |
| pg_read_all_stats | Read all pg_stat_* views and use various statistics related extensions, even those normally visible only to superusers. |
| pg_stat_scan_tables | Execute monitoring functions that may take ACCESS SHARE
locks on tables, potentially for a long time. |
| pg_monitor | Read/execute various monitoring views and functions. This role is a member of pg_read_all_settings, pg_read_all_stats and pg_stat_scan_tables. |
| pg_signal_backend | Signal another backend to cancel a query or terminate its session. |
| pg_read_server_files | Allow reading files from any location the database can access on the server with COPY and other file-access functions. |
| pg_write_server_files | Allow writing to files in any location the database can access on the server with COPY and other file-access functions. |
| pg_execute_server_program | Allow executing programs on the database server as the user the database runs as with COPY and other functions which allow executing a server-side program. |
权限
指定权限
GRANT ALL PRIVILEGES ON DATABASE your_database_name TO your_role_name;
修改所有者
sql
ALTER SCHEMA your_schema_name OWNER TO new_owner_name;
数据库
创建数据库
sql
01020304050607080910CREATE DATABASE database_name
[ [ WITH ]
[ OWNER = role_name ]
[ TEMPLATE = template ]
[ ENCODING = encoding ]
[ LC_COLLATE = collate ]
[ LC_CTYPE = ctype ]
[ TABLESPACE = tablespace_name ]
[ CONNECTION LIMIT = max_concurrent_connections ]
[ ... ]
];
删除数据库
sql
drop database {数据库名};
如果提示
ERROR: database "`{数据库名}`" is being accessed by other users
DETAIL: There is 1 other session using the database.
说明改数据库还有会话未断开
首先,确认是否有其他用户或应用程序正在使用该数据库。你可以通过执行以下 SQL 查询来检查当前连接到数据库的会话:
sql
01SELECT * FROM pg_stat_activity WHERE datname = '{数据库名}';
如果查询结果中显示了除你自己之外的任何会话,请确定这些会话是否可以关闭。
如果你确定其他会话是由你自己的应用程序创建的,可以关闭与数据库的连接,然后再尝试删除数据库。你可以使用以下命令终止会话:
sql
01SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '{数据库名}';
请注意,这将终止掉与数据库 “halo” 相关的所有会话和连接。
如果你不确定哪个会话在使用该数据库,或者无法关闭其他会话,你可以尝试在单用户模式下连接到 PostgreSQL,并在该模式下删除数据库。在单用户模式下,只有一个会话可以连接到数据库。
在命令行中执行以下命令以连接到单用户模式:
sql
01pg_ctl -D /path/to/postgres/data -m fast -o "-c shared_preload_libraries=''"
注意将
/path/to/postgres/data
替换为你的 PostgreSQL 数据目录的路径。连接到单用户模式后,使用以下 SQL 命令删除数据库:
sql
01DROP DATABASE {数据库名};
删除完成后,使用 Ctrl + D(或输入
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'halo';
)退出单用户模式。
查询数据库
sql
select * from pg_database;
查询所有者
sql
0102SELECT datname, pg_catalog.pg_get_userbyid(datdba) AS owner
FROM pg_catalog.pg_database
WHERE datname = 'your_database_name';
命名空间
创建命名空间
sql
CREATE schema {命名空间};
在当前数据库创建所有者为当前用户的命名空间
\c 数据库 和\c - 角色 可以切换
删除命名空间
drop schema {命名空间};
查询命名空间
当前数据库
SELECT nspname FROM pg_catalog.pg_namespace;
查询命名空间所有者
SELECT nspname, pg_catalog.pg_get_userbyid(nspowner) AS owner FROM pg_catalog.pg_namespace WHERE nspname = '命名空间';