PostgreSQL 教程: DROP ROLE 删除角色

九月 14, 2023

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

PostgreSQL DROP ROLE 语句简介

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

DROP ROLE [IF EXISTS] target_role;

在这个语法中:

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

要删除超级用户角色,您需要成为超级用户。要删除非超级用户角色,您需要拥有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的表。
  • 然后,我们将逐步向您展示如何从 PostgreSQL 数据库服务器中删除角色alice

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

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

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

psql -U postgres

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

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

第三步,给alice角色授予createdb权限:

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:  role "alice" cannot be dropped because some objects depend on it
DETAIL:  2 objects in database sales

角色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 OWNEDDROP OWNED语句删除该角色的依赖对象,然后再执行DROP ROLE语句。