在PostgreSQL中,一个用户必须有 LOGIN权限才能登录数据库。然而,必须分配明确的权限来执行数据库操作,包括选择表、列和记录。
PostgreSQL的GRANT查询允许你修改用户在数据库对象上的权限,如表、列、视图、函数、架构等等。
本教程将指导你使用PostgreSQL GRANT命令来修改各种数据库对象的权限。
基本用法
GRANT命令的基本语法是
GRANT privilege(s) ON object(s) TO user
复制代码
在上面的语法中,你可以指定一个或多个权限来授予用户在指定对象上的权限。
要设置一个对象上的所有权限,可以使用ALL关键字。
你可以指定在一个对象上授予的一些权限包括。
- SELECT
- INSERT
- 更新
- DELETE
- 创建
- 连接
- 触发器
- TRUNCATE
- 引用
- 执行
接下来,你要指定数据库对象和用户来授予这组权限。
授予语句示例
让我们看一下如何在PostgreSQL数据库中使用GRANT查询的几个例子。
首先,创建一个没有权限的本地用户。要做到这一点,请确保你以管理员用户的身份登录。
psql -U postgres
CREATE ROLE mods LOGIN PASSWORD 'hello';
复制代码
在下一步,创建一个样本数据库和表,我们将用它来说明PostgreSQL的权限。
下面是一个示例查询。
DROP DATABASE IF EXISTS privs;
CREATE DATABASE privs;
\c privs;
CREATE TABLE modify (id SERIAL, username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, amount INT, PRIMARY KEY(id));
复制代码
最后,退出Postgres用户,以我们上面刚创建的用户身份登录。在上面的例子中,使用以下命令。
psql -U mods -d privs;
复制代码
例1
如果你试图从privs数据库的modify表中选择数值,你会得到一个权限拒绝的错误。
比如说
privs=> select * from modify;
ERROR: permission denied for table modify
复制代码
你可以通过授予mods用户所有权限或增加选择权限来解决这个错误。
要做到这一点,请以Postgres用户的身份登录。
psql -U postgres -d privs;
GRANT SELECT ON modify TO mods;
复制代码
这允许mods用户从privs数据库的modify表中选择项目。
一旦你运行select语句,你应该得到如下结果。
privs=# SELECT * FROM modify;
id | username | email | amount
----+----------+-------+--------
(0 rows)
复制代码
例2
你也可以一次指定多个权限。例如,要指定SELECT、INSERT、DELETE和TRUNCATE的权限,使用命令。
GRANT SELECT, INSERT, DELETE, TRUNCATE ON modify TO mods;
复制代码
例3
要授予一个用户所有权限,请将权限设置为ALL,如下面的命令示例所示。
GRANT ALL ON modify TO mods;
复制代码
例4
在上面的所有例子中,我们只在一个特定的表上给一个用户分配了权限。如果要对指定模式的所有表授予权限,我们可以使用命令。
GRANT SELECT, INSERT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA "privs" TO mods;
复制代码
例5
你也可以将一个连接权限GRANT给一个特定的用户,让他进入一个特定的数据库。查询方式是
GRANT CONNECT ON DATABASE privs TO mods;
复制代码
要撤销授予一个用户的所有权限,可以使用REVOKE查询。
REVOKE SELECT, INSERT, DELETE, TRUNCATE ON modify FROM mods;
复制代码
结束
正如本指南所显示的,PostgreSQL允许你使用GRANT和REVOKE命令来修改数据库对象上的用户权限。