引言
完成数据库、表、索引这些核心对象的运作之后,"用户与权限控制"就成了保障 KingbaseES 数据安全的重点所在。经由细致的用户运作和权限分配,可以规避未授权访问以及误操作之类的风险,比如普通用户就无权删除核心表。本文针对"ksql 命令行操作用户与权限"展开论述,覆盖从"创建用户 - 查看用户 - 修改用户 - 授权/回收权限 - 删除用户"这样完整的流程,并结合真实的业务场景来分解具体的执行步骤。
金仓数据库 ksql 用户与权限管理涵盖创建、查看、修改及删除用户的完整流程。核心在于理解数据库、模式、表的层级权限关系,遵循最小权限原则。通过 CREATE USER 创建账户,利用 ALTER USER 调整属性,使用 GRANT 和 REVOKE 控制对象访问权限。删除用户需谨慎处理依赖对象,建议配合 IF EXISTS 和 CASCADE 参数避免报错。定期审计用户权限可保障数据安全,防止未授权访问。

完成数据库、表、索引这些核心对象的运作之后,"用户与权限控制"就成了保障 KingbaseES 数据安全的重点所在。经由细致的用户运作和权限分配,可以规避未授权访问以及误操作之类的风险,比如普通用户就无权删除核心表。本文针对"ksql 命令行操作用户与权限"展开论述,覆盖从"创建用户 - 查看用户 - 修改用户 - 授权/回收权限 - 删除用户"这样完整的流程,并结合真实的业务场景来分解具体的执行步骤。

用户与权限运作属于"高危运作",要保证运作环境具备如下条件(结合前面内容,防止因为权限不够或者环境有误致使运作出现故障)
管理员用户(比如预设的 system)具备创建,更改,删除其他用户的相关权限,普通用户并不具有这些权限,要经由 ksql 以管理员的身份去关联本地数据库
# 连接默认数据库 kingbase,用户为 system
ksql -d kingbase -U system

连接创建之后,提示符变为 kingbase=#,其中,管理员的提示符是 #,普通用户的是 >,经由提示符能够立即识别出权限等级
后续权限示例将基于前文创建的对象:
kingbase(默认数据库)、test(前文创建的测试库);test_schema(前文创建的模式);test_schema.sys_user(前文创建的用户表);确保这些对象存在(可通过 \l 查数据库、\dn 查模式、\dt test_schema.* 查表),若不存在可参考前文重新创建,避免示例执行失败。

新手要先领会 KingbaseES 权限的"层级特性",即权限按"数据库 → 模式 → 表"由高到低分级,只有得到上层权限才可操作下层对象(若无数据库关联权限,则无法操作库中的表)。
KingbaseES 隐含的权限层级如下:

KingbaseES 存在隐含的权限层级,后面的全部权限操作都会环绕这三个层级来执行,以此保证权限分配达到"最小化"效果(也就是仅仅给予用户所需的权限,防止出现过度授权的情况)。
创建用户属于权限管理的起始部分,要给出用户名,密码以及一些基本属性,比如默认数据库,密码有效期限等,接下来会阐述 CREATE USER 的关键语法,并且依照安全方面的良好做法来给出例子
CREATE USER 用户名 WITH PASSWORD '密码' [选项];
下面这些"选项"的解释(适合初学者了解):
PASSWORD '密码':用户登录密码(建议包含大小写、数字、特殊字符,避免弱密码);DEFAULT DATABASE 数据库名:指的是用户登录时默认关联的数据库,比如 kingbase。DEFAULT SCHEMA:是指用户默认会用的模式,比如 test_schema。CREATEDB:允许用户创建数据库(前文提到的建库权限,仅管理员可授予);INHERIT:用户自动继承所属角色的权限(默认开启,无需手动指定)。test(仅用于访问数据,无建库权限)CREATE USER test WITH PASSWORD '123456'

CREATE ROLE(KingbaseES 中 "用户" 本质是特殊角色,故返回 CREATE ROLE),表示用户创建成功。123456 等弱密码;CREATE USER 会报错 "role already exists",需先删除旧用户或改用 ALTER USER 修改。创建好用户之后,要利用 ksql 命令来查看用户的详细信息,包含权限,默认属性以及所属角色等方面的内容,建议采用 \du 这一系列的命令,这属于一种最为直观的查看用户信息的方式。
执行 \du 可列出当前数据库中所有用户的核心信息,快速了解用户列表:
\du
执行结果示例(关键信息筛选):

若需查看某一用户的详细权限(如 test),执行 \du 用户名:
\du test
执行结果示例:

若需更精细地查看用户对某类对象(如表、模式)的权限,可使用 \dp 命令:
查看表权限:\dp 表名(如查看 sys_user 表的权限);
\dp test_schema.sys_user
业务需求发生改变的时候,要对用户属性做一些调整,比如重置密码或者增减创建数据库的权限,ALTER USER 这个核心语法包含一些常见的操作
当用户忘了密码或者是到了规定的时间得要换密码时,管理员可以运行如下命令(拿 test 来举例):
-- 语法:ALTER USER 用户名 WITH PASSWORD '新密码';
ALTER USER test WITH PASSWORD 'User1@New2024';

ksql -d kingbase -U user1 命令),然后输入新的密码来验证是否有效如果想要给 test 授予创建数据库的权限(之前没有这个权限)
-- 语法:ALTER USER 用户名 权限属性;
ALTER USER test CREATEDB;

\du test 这条命令,在 Attributes 栏里能看到 创建 DB 这个选项,这就表明权限已经被添加了若 test 不再需要建库权限,可收回:
-- 语法:ALTER USER 用户名 NO 权限属性;
ALTER USER test NOCREATEDB;

\du test,Attributes 中的 Create DB 会消失。将 user1 的默认数据库从 kingbase 改为 test(需确保 test_db 已存在):
ALTER USER test SET DEFAULT DATABASE test;
test 下次登录的时候,只要用 ksql -U user1 这个命令,系统就会自动帮它连接到 test 这个数据库,不需要手动加上 -d test 这样的参数。权限控制处于用户运作的核心地位,要依照"数据库→模式→表"这样的层级来执行权限的赋予或者收回,从而保证用户只能对自身业务范畴之内的对象实施操作,有关 GRANT(即赋予)和 REVOKE(即收回)的语法,下面将针对不同情形展开详细阐述
向 test 赋予连接 kingbase 数据库的权限
-- 语法:GRANT 权限类型 ON DATABASE 数据库名 TO 用户名;
GRANT CONNECT ON DATABASE kingbase TO test;
作用:如果没有这项权限,那么 test 就无法与 kingbase 数据库建立联系,系统将会显示错误信息"permission denied to connect to database kingbase"。

给 test 授予访问 test_schema 模式的权限:
-- 语法:GRANT 权限类型 ON SCHEMA 模式名 TO 用户名;
GRANT USAGE ON SCHEMA test_schema TO test;

USAGE 权限是访问模式的基础,无此权限,test 无法查看 test_schema 下的表。给 test 授予 test_schema.sys_user 表的 SELECT(查询)和 INSERT(插入)权限:
-- 语法:GRANT 权限类型 ON 表名 TO 用户名;
GRANT SELECT, INSERT ON test_schema.sys_user TO test;
验证:执行 \dp test_schema.sys_user,可看到 test 拥有的权限。

进阶:授予所有权限(谨慎!生产环境不推荐):
GRANT ALL PRIVILEGES ON test_schema.sys_user TO test;
当用户不再需要某类权限时(如 test 无需插入数据),需及时回收,避免数据风险:
test 对 sys_user 表的 INSERT 权限-- 语法:REVOKE 权限类型 ON 表名 FROM 用户名;
REVOKE INSERT ON test_schema.sys_user FROM test;

\dp test_schema.sys_user,test 的权限会只剩 SELECT;用户被移除时,其本人及其相关权限将会被彻底移除,但是所创建的对象(诸如表,视图等)不会遭到删除,而在执行此类操作之前,一定要确保该用户与核心业务没有联系,其具体的执行步骤包含如下几点:
DROP USER IF EXISTS 用户名;
IF EXISTS:若用户不存在,仅提示警告(NOTICE: role "用户名" does not exist, skipping),不报错,避免中断后续操作。用户 test 已创建表,比如 test_schema.user2_table,如果直接删除,会出现错误提示:"role 'test' 无法被删除,因为存在对象依賴于此角色",此时应当加上 CASCADE 参数执行级联删除以解决依赖问题(不过这只会删除与该用户相关的权限,并不会删除由该用户创建的各类对象)。
-- 语法:DROP USER IF EXISTS 用户名 CASCADE;
DROP USER IF EXISTS test CASCADE;
SELECT pid, usename FROM pg_stat_activity WHERE usename = 'user1';,若有结果,先终止会话(SELECT pg_terminate_backend(pid););\du user1,确认用户无 Superuser 等关键权限;SELECT tablename FROM pg_tables WHERE tableowner = 'user1';,确认用户无创建的表。报错信息:
ERROR: permission denied to connect to database "kingbase"
原因:用户无该数据库的 CONNECT 权限(如 user1 未被授予连接 kingbase 的权限)。
解决方案:管理员授予 CONNECT 权限:
GRANT CONNECT ON DATABASE kingbase TO user1;
报错信息:
ERROR: permission denied for schema test_schema
原因:用户无该模式的 USAGE 权限,无法访问模式下的表。
解决方案:授予模式访问权限:
GRANT USAGE ON SCHEMA test_schema TO user1;
报错信息:
ERROR: role "user1" cannot be dropped because some objects depend on it
原因:用户有创建的对象(如表、视图)或被授予了其他对象的权限。
解决方案:加 CASCADE 级联删除依赖:
DROP USER IF EXISTS user1 CASCADE;
DROP TABLE test_schema.user1_table;)。本文完整覆盖了用户 "创建→查看→修改→权限→删除" 的全流程,核心原则可总结为:
SELECT 权限,不必授予 DROP 权限。\du 和 \dp 命令定时检查用户权限,并及时收回多余权限,防止出现权限泄露情况
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online