KingbaseES用户角色与最小权限控制实践
KingbaseES 用户、角色与最小权限控制实践让账号只做该做的事本文是本系列第 15 篇。上一篇完成了逻辑备份和恢复演练本文进入权限治理讲解如何创建用户、角色并按最小权限访问kb_shop。引言上一篇文章强调了数据保护通过备份恢复确保数据出问题时能找回来。但数据安全不只靠备份还要靠权限控制。一个账号如果拥有过大的权限即使不是恶意操作也可能因为误删、误改造成事故。数据库权限管理的核心原则是最小权限也就是说一个账号只应该拥有完成工作所需的权限。报表用户只读报表业务写入用户只能写业务表管理员权限不要随意下放。本文会在kb_shop中创建两个角色角色用途kb_shop_readonly只读报表和查询kb_shop_writer允许写入业务表文章目录KingbaseES 用户、角色与最小权限控制实践让账号只做该做的事引言用户和角色的关系一、连接 kb_shop二、创建角色三、给只读角色授权四、创建报表用户五、给写入角色授权六、创建业务写入用户七、回收权限八、权限模型设计建议九、常见问题排查问题 1明明给了 SELECT仍提示无权限问题 2用户加入角色后仍提示模式权限不足问题 3插入 SERIAL 表失败问题 4不知道用户有什么角色问题 5创建角色或用户时提示已经存在十、本文小结用户和角色的关系在数据库中用户和角色都和权限有关。可以简单理解为用户用于登录 角色用于承载权限 用户加入角色后获得对应权限这样做的好处是权限可以复用。比如有 5 个报表账号不需要给每个账号逐条授权只要把它们加入kb_shop_readonly角色即可。这也是企业级数据库权限治理中比较常见的设计方式。电科金仓 KingbaseES 面向关键业务场景数据库账号往往会服务于应用系统、报表平台、运维脚本和人工管理等不同入口。如果所有入口都直接使用管理员账号后续很难判断某次变更由谁发起也很难控制误操作范围。用“用户负责登录、角色承载权限”的方式可以把登录身份和权限集合拆开让权限边界更清晰。从截图可以看到本文并不是只停留在授权语句本身而是通过\du、只读查询、写入失败、写入用户插入成功等结果验证了权限模型是否真正生效。投稿文章中建议保留这些执行结果因为权限控制最重要的不是“执行过 GRANT”而是能证明普通账号只能做被允许的操作。一、连接 kb_shopcd /d D:\Tools\Kingbase\ES\Server\bin ksql -U system -d kb_shop -h localhost -p 54321查看当前用户SELECTcurrent_database(),current_user;权限管理建议使用管理员用户执行避免中途因为权限不足失败。这里一定要确认当前数据库是kb_shop。如果上一篇恢复演练后还停留在kb_shop_restore#需要先退出再重新连接kb_shop\qksql -U system -d kb_shop -h localhost -p 54321模式、表和视图权限都是数据库内对象权限。在kb_shop_restore中执行的授权不会自动作用到kb_shop。二、创建角色CREATEROLE kb_shop_readonly;CREATEROLE kb_shop_writer;查看角色\du角色本身不一定用于登录它更像权限集合。三、给只读角色授权允许连接数据库GRANTCONNECTONDATABASEkb_shopTOkb_shop_readonly;允许访问模式GRANTUSAGEONSCHEMAsalesTOkb_shop_readonly;GRANTUSAGEONSCHEMAinventoryTOkb_shop_readonly;GRANTUSAGEONSCHEMAreportTOkb_shop_readonly;允许查询表和视图GRANTSELECTONALLTABLESINSCHEMAsalesTOkb_shop_readonly;GRANTSELECTONALLTABLESINSCHEMAinventoryTOkb_shop_readonly;GRANTSELECTONALLTABLESINSCHEMAreportTOkb_shop_readonly;这里的授权分两层先允许进入模式再允许查询模式下对象。只给表授权但不给模式USAGE访问时仍可能失败。这一步是很多初学者容易漏掉的地方。KingbaseES 和 PostgreSQL 风格数据库一样模式本身也是权限边界。访问report.v_order_list时用户既要有report模式的使用权限也要有视图对象的查询权限。把这两个层次分开理解后续排查“表有权限但仍然提示 schema 权限不足”会容易很多。四、创建报表用户CREATEUSERreport_userWITHPASSWORDReport123456;GRANTkb_shop_readonlyTOreport_user;如果report_user已经存在可以改为执行ALTERUSERreport_userWITHPASSWORDReport123456;GRANTkb_shop_readonlyTOreport_user;其中SELECT current_database();应返回kb_shop。测试连接ksql -U report_user -d kb_shop -h localhost -p 54321查询报表视图SELECT*FROMreport.v_order_listORDERBYcreated_atDESC;尝试写入客户表INSERTINTOsales.customer(customer_name,phone,customer_level)VALUES(只读测试,13900000001,normal);如果权限控制正确这条写入应该失败。这个失败是好事说明只读用户被限制住了。截图中的失败结果正好说明最小权限原则生效report_user能完成报表查询但不能直接向sales.customer写入数据。对真实系统来说这种失败不是异常而是安全边界的一部分。报表系统、BI 工具或临时查询账号应尽量只访问经过整理的视图或必要表避免因为报表端误操作影响交易数据。五、给写入角色授权测试完report_user后先退出当前连接\q后续授权和创建用户需要切回管理员用户执行ksql -U system -d kb_shop -h localhost -p 54321业务写入角色需要对基础表有增删改查权限GRANTCONNECTONDATABASEkb_shopTOkb_shop_writer;GRANTUSAGEONSCHEMAsalesTOkb_shop_writer;GRANTUSAGEONSCHEMAinventoryTOkb_shop_writer;GRANTSELECT,INSERT,UPDATE,DELETEONALLTABLESINSCHEMAsalesTOkb_shop_writer;GRANTSELECT,INSERT,UPDATEONALLTABLESINSCHEMAinventoryTOkb_shop_writer;如果表中使用了SERIAL还需要序列权限GRANTUSAGE,SELECTONALLSEQUENCESINSCHEMAsalesTOkb_shop_writer;GRANTUSAGE,SELECTONALLSEQUENCESINSCHEMAinventoryTOkb_shop_writer;序列权限容易被忽略。如果没有序列权限插入自增主键表时可能失败。业务写入角色和只读角色的差别不只在于INSERT、UPDATE、DELETE。如果表使用自增字段写入动作还会依赖序列对象。因此授权时要把表权限、模式权限和序列权限一起检查。截图中后续app_user能完成插入说明写入链路里的对象权限已经比较完整。六、创建业务写入用户CREATEUSERapp_userWITHPASSWORDApp123456;GRANTkb_shop_writerTOapp_user;如果app_user已经存在可以补执行ALTERUSERapp_userWITHPASSWORDApp123456;GRANTkb_shop_writerTOapp_user;退出管理员连接使用app_user重新连接后测试插入\qksql -U app_user -d kb_shop -h localhost -p 54321INSERTINTOsales.customer(customer_name,phone,customer_level)VALUES(应用用户测试,13900000002,normal);查询SELECTcustomer_id,customer_name,phoneFROMsales.customerWHEREphone13900000002;七、回收权限测试完app_user后如果要继续演示权限回收需要再次切回system管理员连接\qksql -U system -d kb_shop -h localhost -p 54321权限回收和授权一样重要。人员岗位变化、系统下线、临时账号过期都需要及时回收权限。这里先把回收操作作为演示语句说明不建议在当前学习环境中直接执行。原因是权限治理章节前后会反复使用report_user做只读验证如果马上回收角色读者后续回看本文查询报表视图时还需要重新授权。如果不再允许报表用户访问库存表可以执行REVOKESELECTONALLTABLESINSCHEMAinventoryFROMkb_shop_readonly;如果要撤销用户角色可以执行REVOKEkb_shop_readonlyFROMreport_user;如果你只是跟着专栏连续学习建议先不要执行上面两条REVOKE。否则后续再使用report_user复查报表只读权限时需要重新执行前面的授权语句。八、权限模型设计建议做权限设计的时候其实最好别围着某一个具体的人去搞而是得围着某一类职责去弄。那为什么要这样搞呢原因很简单。因为如果人变了的话你往往仅仅只需要去调一下用户和角色的对应关系就行了。也就不用去重写一大堆授权的语句了那样真的很麻烦。那么在咱们这个kb_shop里面的话通常来说是可以弄出这么一个权限模型出来的report_user - kb_shop_readonly - 查询 report / sales / inventory app_user - kb_shop_writer - 写入 sales / inventory system - 管理员 - 管理对象和权限这种设计到底好在哪呢其实也就是权限的边界搞得特别清楚。也就是说做报表的用户他没法去改数据应用层面的用户呢也不需要什么管理员权限。还有那个管理员账号你也千万别让应用程序一直长期去用着它这很不安全。那如果后续咱们还要增加审计用户的情况其实是可以接着去创建的就像这样CREATEROLE kb_shop_auditor;建好之后呢再去给他配上一些必须要有的查询权限就行了。权限模型这东西它应该是跟着业务角色去慢慢扩展的。你千万别把所有的权限都瞎堆在某一个账号上面这是一个大坑。九、常见问题排查问题 1明明给了 SELECT仍提示无权限遇到这种情况的话你得去查一查是不是忘了给模式的USAGE权限了。也就是说你得执行一下这个GRANTUSAGEONSCHEMAsalesTOkb_shop_readonly;问题 2用户加入角色后仍提示模式权限不足如果说你已经执行了下面这个把角色给用户的语句GRANTkb_shop_readonlyTOreport_user;但是呢你用report_user去查report.v_order_list的时候它还是给你报错说ERROR: 对模式 report 权限不够这是一个问题。那为什么会这样呢这时候你得先去检查一下你的授权语句到底是不是在那个正确的数据库里面执行的。你可以用管理员用户连上去然后跑一下这个看看SELECTcurrent_database();要是它返回的是kb_shop_restore的话那就说明你这时候还停留在上一篇那个恢复测试库里面没出来呢。那你得先退出来接着重新去连咱们的kb_shop像这样ksql -U system -d kb_shop -h localhost -p 54321进对了库之后再去kb_shop里面把这些授权的语句重新跑一遍GRANTUSAGEONSCHEMAreportTOkb_shop_readonly;GRANTSELECTONALLTABLESINSCHEMAreportTOkb_shop_readonly;GRANTkb_shop_readonlyTOreport_user;这里面有个常识大家得知道。模式、表还有视图的权限它往往仅仅只是对你当前连着的这个数据库里的东西才管用。你在kb_shop_restore里面去做授权那是没法让report_user拿到kb_shop.report这个模式的权限的。那么改好之后呢你得把report_user现在的连接给退了重新登进去再测一下才行ksql -U report_user -d kb_shop -h localhost -p 54321问题 3插入 SERIAL 表失败往那种带 SERIAL 类型的表里插数据如果失败了的话你得去看看序列的权限给没给GRANTUSAGE,SELECTONALLSEQUENCESINSCHEMAsalesTOkb_shop_writer;问题 4不知道用户有什么角色如果你搞不清楚某个用户到底有哪些角色的话直接去执行这个命令就行\du或者说是你去查一下系统表里的信息也是可以的。问题 5创建角色或用户时提示已经存在遇到这个提示那就说明你之前肯定已经跑过这篇文章里的那个建角色语句了。你可以先去用\du看看现在都有哪些角色和用户。要是kb_shop_readonly、kb_shop_writer、report_user或者app_user这些已经存在了的话那就别再去重复创建了。你直接接着往下走去跑后面的授权或者测试步骤就行了。十、本文小结本文承接第十四篇备份恢复从数据保护进入访问控制。我们创建了只读角色、写入角色、报表用户和应用用户并通过授权和回收体现最小权限原则。本文掌握了CREATE ROLE CREATE USER GRANT CONNECT GRANT USAGE ON SCHEMA GRANT SELECT / INSERT / UPDATE / DELETE GRANT SEQUENCE 权限 REVOKE 最小权限原则下一篇会继续安全主题进一步讨论账号安全、密码管理、敏感操作控制和日常安全检查让数据库不仅能用还要尽量安全地用。

相关新闻

字符串匹配

字符串匹配

主字符串:s,模式字符串t,字符串匹配就是找出字符串t首次出现在s的下标位置1,BF算法(暴力算法)概述:根据平时的经验,将模式字符串从头开始一个个与主字符串比对,需要两层循…

2026/10/3 20:02:45 阅读更多 →
深入pdfcn Registry机制:shadcn CLI如何用一条命令安装PDF组件

深入pdfcn Registry机制:shadcn CLI如何用一条命令安装PDF组件

深入pdfcn Registry机制:shadcn CLI如何用一条命令安装PDF组件 【免费下载链接】pdfcn Beautiful pdf components, built on Takumi and Forme. 100% Free, Zero config, one command setup. 项目地址: https://gitcode.com/gh_mirrors/pd/pdfcn pdfcn 是一款…

2026/10/3 20:02:45 阅读更多 →
Adobe 软件安装提示msvcp110.dll 缺失怎么办?手把手教你搞定

Adobe 软件安装提示msvcp110.dll 缺失怎么办?手把手教你搞定

正文先说结论:双击 Adobe 弹「无法启动此程序,因为计算机中丢失 msvcp110.dll」,软件本身没坏,缺的是它启动时要调用的 Visual C 2012 运行库。这个 dll 缺失问题十分钟内能修好,前提是走对路。报错里的 dll 对应哪个运…

2026/10/3 20:02:44 阅读更多 →

最新新闻

DeepSeek Harness 开源贡献手记:从零到合入主线

DeepSeek Harness 开源贡献手记:从零到合入主线

1. 引言:为什么参与开源贡献 本文记录我参与 DeepSeek Harness 开源项目的完整过程,从发现问题、定位源码、编写补丁到最终合入主线的真实经历,希望能为同样想参与开源贡献的开发者提供一份可参考的路线图。 2. 项目背景与初步调研 在动手…

2026/10/3 20:40:42 阅读更多 →
面试官:MySQL中的 distinct 和 group by 哪个效率更高?

面试官:MySQL中的 distinct 和 group by 哪个效率更高?

一、开篇:一道高频面试题背后的问题在 MySQL 相关的面试中,有一道题经常被面试官问到:distinct 和 group by 都能去重,它们哪个效率更高?很多候选人听到这个问题后会下意识地回答「distinct 更快,因为它的语…

2026/10/3 20:40:42 阅读更多 →
面试官:BIO、NIO、AIO 的区别是什么?

面试官:BIO、NIO、AIO 的区别是什么?

一、开篇:从一个面试场景说起面试官经常会抛出一个看似简单、实则非常考察底层功底的题目:「说说 BIO、NIO、AIO 的区别」。很多同学能背出「BIO 是阻塞、NIO 是非阻塞、AIO 是异步非阻塞」,但如果继续追问「为什么 NIO 是非阻塞的」「底层分…

2026/10/3 20:40:41 阅读更多 →
Python实现绘制同切圆

Python实现绘制同切圆

程序源码:# 绘制同切圆 import turtle as t # 导入turtle绘图库,取别名t t.pensize(3) # 设置画笔粗细为3像素 t.circle(10) # 画半径为10的圆 t.circle(20) # 画半径为20的圆 t.circle(40) …

2026/10/3 20:39:41 阅读更多 →
数据管理与论文写作并行:按阶段推进的研究节奏怎么排

数据管理与论文写作并行:按阶段推进的研究节奏怎么排

数据工作和论文写作挤在同一段时间里,几乎是每位研究生都会遇到的排期难题。多数人卡住的不是不会写,而是两条线的节拍没有对齐。我们在梳理用户反馈时发现,把研究数据与论文写作按成熟度切成四段、给每段设定明确的两线配比,返工…

2026/10/3 20:39:41 阅读更多 →
双向分流FIN标记、TCB服务逻辑与TCP断开连接流程介绍

双向分流FIN标记、TCB服务逻辑与TCP断开连接流程介绍

文章目录 一、TCP双向分流里的FIN 1.FIN信息 1.1放置FIN 1.1.1处前预剩发 1.1.2处后被遗漏 1.2发送FIN 1.2.1剩余已发完 1.2.2独立仍接收 1.3接收FIN 1.3.1现在已收完 1.3.2独立仍在发 二、数据的需求与TCB的服务 1.数据需求TCB的发收服务 1.1需本端TCB可靠发送 …

2026/10/3 20:39:40 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →