PostgreSQL 删除角色

在本教程中,您将学习如何使用 PostgreSQL DROP ROLE 语句删除角色。

摘要:在本教程中,您将学习如何使用 PostgreSQL DROP ROLE 语句删除角色。

PostgreSQL DROP ROLE 语句介绍

要删除指定的角色,请使用以下 DROP ROLE 语句:

DROP ROLE [IF EXISTS] target_role;

在这个语法中:

  • 在 DROP ROLE 关键字后指定要删除的角色的名称。
  • IF EXISTS 如果您希望 PostgreSQL 在删除不存在的角色时发出通知而不是错误,请使用该选项。

要删除超级用户角色,您需要是超级用户。要删除非超级用户角色,您需要具有 CREATEROLE 权限。

当您删除任何数据库中引用的角色时,PostgreSQL 将引发错误。在这种情况下,您必须采取两个步骤:

  • 首先,要么使用该 DROP OWNED 语句删除角色拥有的数据库对象,要么将数据库对象的所有权重新分配给另一个角色 REASSIGN OWNED 。
  • 其次,撤销授予该角色的任何权限。

该 REASSIGN OWNED 语句将一个目标角色的所有依赖对象的所有权重新分配给另一个角色。因为该 REASSIGN OWNED 语句只能访问当前数据库中的对象,所以需要在每个包含目标角色拥有的对象的数据库中执行该语句。

将对象的所有权转移到另一个角色后,您需要通过 DROP OWNED 在每个包含目标角色拥有的对象的数据库中执行语句来删除目标角色拥有的任何剩余对象。

换句话说,您应该按顺序执行以下语句来删除角色:

-- execute these statements in the database that contains
-- the object owned by the target role
REASSIGN OWNED BY target_role TO another_role;
DROP OWNED BY target_role;

-- drop the role
DROP ROLE target_role;

让我们看看下面的例子。

PostgreSQL DROP ROLE 示例

在这个例子中:

  • 首先,我们将创建一个名为 alice 的新角色,并使用该角色创建一个名为 customers 的表 。
  • 然后,我们将逐步向您展示如何 alice 从 PostgreSQL 数据库服务器中删除角色。

我们将使用 psql 工具。但是,您可以使用您选择的任何客户端工具。

步骤 1. 设置新角色和数据库

首先,使用 postgres 角色登录 PostgreSQL :

psql -U postgres

其次,创建一个名为 的新角色 alice :

postgres=# create role alice with login password 'Abcd1234';

第三,授予 createdb 特权 alice :

postgres=# alter role alice createdb;

第四,创建一个名为的新数据库 sales :

postgres=# create database sales;

退出当前会话:

postgres=# \q

步骤 2. 使用新角色创建数据库对象

首先,使用 alice 角色登录 PostgreSQL 数据库服务器:

psql -U alice -W sales

二、在数据库中新建一个表 sales :

create table customers(
    customer_id int generated always as identity,
    customer_name varchar(150) not null,
    primary key(customer_id)
);

三,显示表列表中的 sales 数据库:

sales=> \dt
        List of relations
Schema |   Name    | Type  | Owner
--------+-----------+-------+-------
public | customers | table | alice
(1 row)

最后,退出当前会话:

postgres=# \q

步骤 3. 删除角色 alice

首先,使用 postgres 角色登录 PostgreSQL 数据库服务器:

psql -U postgres

其次,尝试删除角色 alice :

postgres=# drop role alice;

PostgreSQL 发出以下错误:

Error:

ERROR:  role "alice" cannot be dropped because some objects depend on it
DETAIL:  2 objects in database sales

alice alice` 无法删除角色,因为它具有依赖对象。

三、切换到 sales 数据库:

postgres=# \c sales

第四,将拥有的对象重新分配 alice 给 postgres :

sales=# reassign owned by alice to postgres;

第五,通过 alice 以下方式删除拥有的对象:

sales=# drop owned by alice;

六、删除角色 alice :

sales=# drop role alice;

七、列出当前角色:

sales=#\du

您将看到该角色 alice 已被删除。

最后,退出当前会话:

sales=#\q

概括

  • 使用 PostgreSQL DROP ROLE 语句删除指定的角色。
  • 如果角色有依赖对象,则在执行该语句之前,依次使用 REASSIGN OWNED 和 DROP OWNED 语句删除角色的依赖对象 DROP ROLE 。