场景:给 fanruan 用户授予 datacenter 模式表只读权限,新建表自动继承查询权限
一、方案说明
达梦 DM8 提供GRANT ... ON SCHEMA模式级一键授权语法。授权成功后,该模式下已有表 + 后续新建的表,用户自动获得 SELECT 查询权限,无需重复执行授权 SQL。
⚠️ 重要前提:该语法依赖 INI 静态参数
GRANT_SCHEMA,默认关闭;修改静态参数需要重启数据库实例。 如果业务窗口不允许重启数据库,请使用【备选方案:逐表批量授权】,无需重启,缺点是新增表不会自动授权。
引用官方文档
- DM8 安全管理手册 - 3.3.4 模式权限的分配与回收 自主访问控制 | 达梦技术文档
原文要点:
<对象> 为 SCHEMA 时,须提前设置 INI 参数 GRANT_SCHEMA=1 或 2,即开启授予和回收模式权限功能。授予模式权限后,用户对该模式下已存在的对象拥有指定权限,对该模式下后续新建的同类型对象自动拥有该权限。
- DM8 SQL 语言使用手册 附录 3 系统存储过程 SP_SET_PARA_VALUE 附录 | 达梦技术文档
SP_SET_PARA_VALUE 用于修改 dm.ini 整型参数;scope=2 代表仅写入 ini 文件,静态参数修改后必须重启实例加载生效。
- DM8 SQL 语言使用手册 3.2.1 用户定义语句 CREATE USER 数据定义语句 | 达梦技术文档
CREATE USER 创建数据库用户,创建用户后必须授予 CREATE SESSION 系统权限,用户才可以登录数据库。
二、前置条件
- 数据库版本:DM8 ≥ 8.1.3.15,低版本不支持
ON SCHEMA语法 - 执行账号:SYSDBA(三权分立)/ DB_OBJECT_ADMIN(四权分立)
- 停机窗口:需要数据库重启操作,业务低峰期执行
三、完整操作步骤
步骤 1:检查当前 GRANT_SCHEMA 参数
SELECT PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='GRANT_SCHEMA';- 返回
PARA_VALUE=0:默认关闭,需要修改参数并重启 - 返回
PARA_VALUE=1:参数已开启,直接跳转到步骤 4,无需修改参数、无需重启
步骤 2:开启 GRANT_SCHEMA 参数(参数为 0 才执行)
-- scope=2:仅写入dm.ini磁盘文件,静态参数,内存不生效,修改后必须重启实例 SP_SET_PARA_VALUE(2,'GRANT_SCHEMA',1);步骤 3:重启达梦实例,验证参数生效
Linux dmdba 用户执行重启命令:
systemctl restart DmServiceDMSERVER重启完成,再次校验参数:
SELECT PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='GRANT_SCHEMA';查询结果必须为 1,否则
GRANT SELECT ON SCHEMA会报语法错误
步骤 4:创建 fanruan 用户(用户不存在才执行,已存在跳过)
CREATE USER fanruan IDENTIFIED BY "Fanruan@2026";密码按现场密码安全策略自行修改
步骤 5:授予用户登录会话权限(必选,否则无法连接数据库)
GRANT CREATE SESSION TO fanruan;步骤 6:核心授权语句,授予 datacenter 模式只读权限
-- 授予 fanruan 访问 datacenter 模式所有表(已有表+未来新建表自动拥有select) GRANT SELECT ON SCHEMA datacenter TO fanruan;不添加
WITH ADMIN OPTION,代表 fanruan 不能把该权限转授其他账号,生产环境推荐不加。
步骤 7:SYSDBA 校验模式级授权信息
SELECT GRANTEE,PRIVILEGE,SCHEMA_NAME FROM DBA_SCHEMA_PRIVS WHERE GRANTEE='FANRUAN';步骤 8:业务侧验证,fanruan 账号登录测试
fanruan 账号连接数据库后执行测试查询:
-- 测试查询datacenter模式表,取前10行验证 SELECT * FROM datacenter.ods_table WHERE ROWNUM <=10;注意:已经建立的旧会话不会自动加载新权限,fanruan 账号需要重新连接数据库,新会话权限立即生效。
四、权限回收脚本(后期需要撤销只读权限)
REVOKE SELECT ON SCHEMA datacenter FROM fanruan;执行回收后,已有表和未来新建表的自动 SELECT 权限全部取消。
五、重要限制 & 坑点(必看)
- 仅对 TABLE 表生效!视图、存储过程、序列不会自动授权datacenter 模式下新建视图,fanruan 访问视图需要单独授权:
GRANT SELECT ON datacenter.v_test TO fanruan;GRANT_SCHEMA是实例全局静态参数,开启后实例内所有 DBA 均可使用 ON SCHEMA 模式批量授权,扩大权限管控面,存在一定安全风险。- 误区提醒:修改参数 + 重启≠自动授权。参数只是开启语法开关,必须手动执行 GRANT 语句,fanruan 账号才会获得权限。
- 仅作用于 datacenter 单个模式,不会赋予其他模式的访问权限,区别于
SELECT ANY TABLE全局查表权限。
六、备选方案:业务不能停机、不允许重启数据库(推荐很多生产使用)
不开启 GRANT_SCHEMA,批量生成 datacenter 模式下所有表的 SELECT 授权 SQL,全程无需重启数据库。
-- 批量生成授权语句,复制输出结果执行即可 SELECT 'GRANT SELECT ON datacenter.'||TABLE_NAME||' TO fanruan;' FROM DBA_TABLES WHERE OWNER='DATACENTER';缺点:datacenter 后续新建表,不会自动授权,需要定期重新执行脚本新增授权。
七、两种方案对比
表格
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| GRANT SELECT ON SCHEMA 模式一键授权 | 一次授权,后续新建表自动拥有查询权限 | 需要修改静态参数 + 重启实例;全局开启 GRANT_SCHEMA 参数 | 可以申请停机窗口,模式内表频繁新增 |
| 逐表批量授权 | 无需重启数据库,无全局参数改动 | 新增表需要重新跑脚本授权 | 业务不允许停机,表新增频率低 |