SET ROLE
SET ROLE — 设置当前会话的当前用户标识符
语法
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
描述
这个命令把当前 SQL 会话的当前用户标识符设置为 role_name。角色名可以写成一个标识符或者一个字符串。在 SET ROLE之后,对 SQL 命令的权限检查时就好像该角色就是原先登录的角色一样。
当前会话用户必须是指定的角色role_name 的一个成员(如果会话用户是一个超级用户,则可以选择任何角色)。
SESSION和LOCAL修饰符发挥的作用和常规的SET命令一样。
NONE和RESET形式把当前用户标识符重置为当前会话用户标识符。这些形式可以由任何用户执行。
注解
使用这个命令可以增加特权或者限制特权。如果会话用户角色具有 INHERITS属性,则它会自动具有它能 SET ROLE到的所有角色的全部特权。在这种情况下 SET ROLE实际会删除所有直接分配给会话用户的特权以及分配给会话用户作为其成员的其他角色的特权,只留下所提及角色可用的特权。换句话说,如果会话用户没有 NOINHERITS属性,SET ROLE会删除直接分配给会话用户的特权而得到所提及角色可用的特权。
特别地,当一个超级用户选择SET ROLE到一个非超级用户角色时,它们会丢失其超级用户特权。
SET ROLE的效果堪比 SET SESSION AUTHORIZATION,但是涉及的特权检查完全不同。还有,SET SESSION AUTHORIZATION决定后来的SET ROLE命令可以使用哪些角色, 不过用 SET ROLE更改角色并不会改变后续 SET ROLE能够使用的角色集。
SET ROLE不会处理角色的ALTER ROLE 设置指定的会话变量。这只在登录期间发生。
SET ROLE不能在一个 SECURITY DEFINER函数中使用。
示例
查看当前会话的原用户,和当前用户
postgres=#SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+--------------
postgres | postgres
修改当前会话的用户为TEST
SET ROLE 'test';
postgres=#SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+--------------
postgres | test
重置为当前会话原来的用户
postgres=# RESET ROLE;
RESET
postgres=# SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+--------------
postgres | postgres
DROP SCHEMA
DROP SCHEMA — 移除一个模式
语法
DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
描述
DROP SCHEMA从数据库中移除模式。
一个模式只能由其拥有者或一个超级用户删除。注意即使拥有者不拥有该模式中的某些对象,也能删除该模式(以及所有含有的对象)。
参数
IF EXISTS
如果该模式不存在则不要抛出一个错误,而是发出一个提示。
name
一个模式的名称。
CASCADE
自动删除包含在该模式中的对象(表、函数等),然后删除所有依赖于那些对象的对象(见第 5.13 节)。
RESTRICT
如果该模式含有任何对象,则拒绝删除它。这是默认值。
注解
使用CASCADE选项可能会使这条命令移除除指定模式之外其他模式中的对象。
示例
要从数据库中移除模式test及其中所包含的对象:
postgres=# DROP SCHEMA test CASCADE;
DROP SCHEMA
DROP ROLE
DROP ROLE — 移除一个数据库角色
语法
DROP ROLE [ IF EXISTS ] name [, ...]
描述
DROP ROLE移除指定的角色。要删除一个超级用户角色,你必须自己就是一个超级用户。要删除一个非超级用户角色,你必须具有CREATEROLE特权。
如果一个角色仍然被集簇中任何数据库中引用,它就不能被移除。如果尝试移除将会抛出一个错误。在删除该角色前,你必须删除(或者重新授予所有权)它所拥有的所有对象并且收回该已经授予给该角色的在其他对象上的特权。REASSIGN OWNED和DROP OWNED 命令可以用于这个目的。
不过,没有必要移除涉及该角色的角色成员关系。 DROP ROLE会自动收回目标角色在其他角色中的成员关系,以及其他角色在目标角色中的成员关系。其他角色不会被删除也不会被影响。
参数
IF EXISTS
如果该角色不存在则不要抛出一个错误,而是发出一个提示。
name
要移除的角色的名称。
注解
PostgreSQL包括一个程序dropuser具有和这个命令完全相同的功能(事实上它会调用这个命令),但是该程序可以从 shell 运行。
示例
要删除一个角色:
postgres=# DROP ROLE demo;
DROP ROLE
DROP DATABASE
DROP DATABASE — 移除一个数据库
语法
DROP DATABASE [ IF EXISTS ] name
描述
DROP DATABASE移除一个数据库。它会移除该数据库的系统目录项并且删除包含数据的文件目录。它只能由数据库拥有者执行。还有,当你或者任何其他人已经连接到目标数据库时,它不能被执行(连接到postgres或者任何其他数据库来发出这个命令)。
DROP DATABASE不能被撤销。请小心使用!
参数
IF EXISTS
如果该数据库不存在则不要抛出一个错误,而是发出一个提示。
name
要移除的数据库的名称。
注解
DROP DATABASE不能在一个事务块内执行。
示例
postgres=# DROP DATABASE demo;
DROP DATABASE
dropdb
dropdb — 移除一个PostgreSQL数据库
语法
dropdb [connection-option...] [option...] dbname
描述
dropdb毁掉一个现有的PostgreSQL数据库。执行这个命令的用户必须是一个数据库超级用户或该数据库的拥有者。
dropdb是SQL命令DROP DATABASE的一个包装器。在通过这个工具和其他方法访问服务器来删除数据库之间没有实质性的区别。
选项
dropdb接受下列命令行参数:
dbname
指定要被移除的数据库的名字。
-e
--echo
回显dropdb生成并发送给服务器的命令。
-i
--interactive
在做任何破坏性的工作之前发出一个验证提示。
-V
--version
打印dropdb版本并退出。
--if-exists
如果数据库不存在也不抛出一个错误。在这种情况下会发出一个提醒。
-?
--help
显示有关dropdb命令行参数的帮助并退出。
dropdb也接受下列命令行参数作为连接参数:
-h host
--host=host
指定运行服务器的机器的主机名。如果该值以一个斜线开始,它被用作 Unix 域套接字的目录。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展。
-U username
--username=username
要作为哪个用户连接。
-w
--no-password
从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那儿连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制dropdb在连接到一个数据库之前提示要求一个口令。
这个选项不是必不可少的,因为如果服务器要求口令认证,dropdb将自动提示要求一个口令。但是,dropdb将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下值得用-W来避免额外的连接尝试。
–maintenance-db=dbname
指定要连接到来发现哪些其他数据库应该被删除的数据库名。如果没有指定,将使用postgres数据库。而如果它也不存在,将使用template1。
环境
PGHOST
PGPORT
PGUSER
默认连接参数
和大部分其他PostgreSQL工具相似,这个工具也使用libpq支持的环境变量。
示例
要在默认数据库服务器上毁掉数据库demo:
$ dropdb demo
要使用在主机eden、端口 5000 上的服务器中毁掉数据库demo,并带有验证和回显:
$ dropdb -p 5000 -h eden -i -e demo
Database "demo" will be permanently deleted.
Are you sure? (y/n) y
DROP DATABASE demo;




