我平时使用数据库很少会有赋权的操作,但是最近有个场景需要给某个用户设置只能操作哪些数据库和表还有序列。我分享一下我的经验,我用的是 PostgreSQL 数据库。

赋权命令语法

PostgreSQL 中的赋权命令是 GRANT 和 REVOKE。

GRANT 命令用于授予某个用户或用户组对某个对象(如表、视图、函数等)的某种权限(如 SELECT、INSERT、UPDATE、DELETE 等)。

语法:

GRANT privilege [, ...] ON object TO {user | group | PUBLIC} [, ...] [WITH GRANT OPTION];

其中,privilege 是一种权限,object 是一个对象,可以是表、视图、函数等,user 或 group 是要授予权限的用户或用户组,PUBLIC 表示所有用户。

例如,授权用户 zhangsan 对表 test 执行 SELECT 和 INSERT 操作:

GRANT SELECT, INSERT ON test TO zhangsan;

REVOKE 命令用于取消某个用户或用户组对某个对象的某种权限。

语法:

REVOKE privilege [, ...] ON object FROM {user | group | PUBLIC} [, ...] [CASCADE | RESTRICT];

其中,privilege、object、user 或 group、PUBLIC 的含义与 GRANT 命令相同。

例如,取消用户 zhangsan 对表 test 的 SELECT 权限:

REVOKE SELECT ON test FROM zhangsan;

需要注意的是,只有超级用户才有赋权和收回权限的权限。

实战

查看所有用户

SELECT * FROM pg_user;

创建用户并设置密码

CREATE USER zhangsan WITH PASSWORD’123456′;

删除用户

DROP USERzhangsan;

创建数据库

CREATE DATABASEtest;

删除数据库

DROPDATABASE IFEXISTS test;

移除用户对”test”数据库的权限

REVOKE ALL privileges ON DATABASE”test” FROM zhangsan;

赋予用户操作”test”数据库的权限

GRANT CONNECT, CREATE, TEMPORARYON DATABASE “test” TO zhangsan;

赋予用户操作”test”数据库的表的权限

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA PUBLIC
TO zhangsan;

赋予用户操作”test”数据库的序列的权限

序列的权限定义

官方文档中可以看到序列的所有权限为rwU,分别对应SELECT、UPDATE、USAGE;

对于序列,SELECT权限允许使用 currval 函数

对于序列,UPDATE权限允许使用 nextval 和 setval 函数

对于序列,USAGE权限允许使用 currval 和 nextval 函数

如果需要有修改序列的权限可以直接赋权ALL,如下

GRANT SELECT, UPDATE, USAGE ON ALL SEQUENCES INSCHEME PUBLIC TO zhangsan;

如果只是使用序列不需要修改可以赋权USAGE

GRANTUSAGE ON ALL SEQUENCES INSCHEME PUBLIC TO zhangsan;