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