角色

创建角色

bash

CRAETE ROLE {角色名} [LOGIN] [SUPERUSER] [CREATEDB] [CREATEROLE] [REPLICATION] [INHERIT] [WITH ENCRYPTED PASSWORD '密码']
  • LOGIN:允许登录
  • SUPERUSER:拥有超级用户权限
  • CREATEDB:允许创建database
  • CREATEROLE:允许创建角色
  • REPLICATION:允许备份
  • INHERIT:是否继承权限,权限来是其它角色,通过GRANT将其它角色赋予该角色
  • PASSWORD:指定密码

删除角色

bash

DROP ROLE [角色名];

删除时如果提示

ERROR: role "角色名" cannot be dropped because some objects depend on it
DETAIL: privileges for database 数据库名

表示在删除角色 时存在依赖关系,导致无法删除该角色。

由于这些依赖关系,必须先解除这些依赖,才能成功删除角色。以下是解决这个问题的步骤:

  1. 首先,需要将数据库 “halo” 的所有者更改为其他角色。你可以使用以下命令来更改数据库所有者:

    01ALTER DATABASE [角色名] OWNER TO new_owner;
    

    将 “new_owner” 替换为你希望成为数据库所有者的角色的名称。

  2. 接下来,需要将命名空间schema的所有者更改为其他角色。使用以下命令来更改模式所有者:

    01ALTER SCHEMA {命名空间} OWNER TO new_owner;
    

    替换 “new_owner” 为你希望成为模式所有者的角色的名称。

  3. 最后,需要将表的所有者更改为其他角色。使用以下命令来更改表所有者:

    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.

说明改数据库还有会话未断开

  1. 首先,确认是否有其他用户或应用程序正在使用该数据库。你可以通过执行以下 SQL 查询来检查当前连接到数据库的会话:

    sql

    01SELECT * FROM pg_stat_activity WHERE datname = '{数据库名}';
    

    如果查询结果中显示了除你自己之外的任何会话,请确定这些会话是否可以关闭。

  2. 如果你确定其他会话是由你自己的应用程序创建的,可以关闭与数据库的连接,然后再尝试删除数据库。你可以使用以下命令终止会话:

    sql

    01SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '{数据库名}';
    

    请注意,这将终止掉与数据库 “halo” 相关的所有会话和连接。

  3. 如果你不确定哪个会话在使用该数据库,或者无法关闭其他会话,你可以尝试在单用户模式下连接到 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 = '命名空间';