1. 达梦数据库跨用户授权概述
在数据库管理系统中,跨用户授权是一个常见且重要的功能需求。作为一名长期从事数据库管理的DBA,我发现达梦数据库在跨用户授权机制上与Oracle、MySQL等主流数据库存在显著差异。这些差异主要体现在授权粒度、参数配置和权限控制方式上。
达梦数据库作为国产数据库的代表产品,其权限管理体系具有自身特色。在实际工作中,我们需要特别注意以下几点:
- 默认情况下不支持模式级别的授权
- 需要修改特定参数才能开启高级授权功能
- 不同级别的权限需要分别配置
- DDL权限控制尤为严格
这些特性使得达梦数据库在安全性方面表现突出,但也给管理员带来了新的学习成本。下面我将通过三个典型场景,详细解析达梦数据库的跨用户授权机制。
2. 环境准备与测试数据创建
2.1 创建测试用户
在开始授权测试前,我们需要先准备好测试环境。以下是创建测试用户的SQL语句:
disql sysdba/******:5238 create user cjc0204 identified by "******"; create user chen0204 identified by "******"; grant resource to cjc0204; grant resource to chen0204;这里创建了两个用户cjc0204和chen0204,并为他们授予了RESOURCE角色。RESOURCE角色在达梦数据库中包含了创建表、视图等基本对象权限。
注意:达梦数据库中的用户密码需要使用双引号包裹,这与Oracle的语法有所不同。
2.2 创建测试表
接下来,我们分别在两个用户下创建测试表:
-- 以cjc0204用户登录 disql cjc0204/******:5238 create table t0204(id int); insert into t0204 values(1); commit; -- 以chen0204用户登录 disql chen0204/******:5238 create table t0204(id int); insert into t0204 values(1); commit;这样我们就有了基本的测试数据。现在,cjc0204用户尝试查询chen0204用户的表时,会收到权限错误:
dmdba@CJC-DB-01:/home/dmdba$disql cjc0204/******:5238 SQL> select * from chen0204.t0204; [-5504]:没有[CHEN0204.t0204]对象的查询权限.这个错误表明,在达梦数据库中,默认情况下用户无法访问其他用户的对象,这与Oracle的"同义词"机制和MySQL的"库级别"授权都有明显区别。
3. 场景1:授予查询权限
3.1 模式级别授权的问题
在Oracle中,我们可以直接授予用户对另一个用户模式的查询权限。但在达梦数据库中,尝试执行类似的授权语句会失败:
SQL> grant select on schema chen0204 to cjc0204; [-2201]:无效的数据库对象.这个错误表明达梦默认不支持模式级别的授权。要实现这个功能,我们需要修改数据库参数。
3.2 修改GRANT_SCHEMA参数
查看当前参数设置:
SQL> select para_name,DEFAULT_VALUE,PARA_VALUE,PARA_TYPE,DESCRIPTION from v$dm_ini where para_name='GRANT_SCHEMA'; 行号 para_name DEFAULT_VALUE PARA_VALUE PARA_TYPE DESCRIPTION ---------- ------------ ------------- ---------- --------- ----------------------------------- 1 GRANT_SCHEMA 0 0 IN FILE Whether to allow to grant to schema将参数值从0改为1:
vi dm.ini GRANT_SCHEMA = 1 #Whether to allow to grant to schema这是一个静态参数,修改后需要重启数据库实例才能生效。
3.3 执行授权并验证
参数生效后,重新尝试授权:
SQL> grant select on schema chen0204 to cjc0204;现在cjc0204用户可以查询chen0204的表了:
SQL> select * from chen0204.t0204; 行号 id ---------- ----------- 1 1但是尝试执行DML操作仍然会被拒绝:
SQL> insert into chen0204.t0204 values(1); [-5501]:没有[CHEN0204.t0204]对象的插入权限.经验分享:达梦的模式级别授权非常精细,即使开启了GRANT_SCHEMA参数,默认也只授予查询权限,不会连带授予DML权限。这与Oracle的授权方式有很大不同,需要特别注意。
4. 场景2:授予查询和DML权限
4.1 使用ALL PRIVILEGES授权
要实现查询+DML权限,我们需要使用ALL PRIVILEGES授权:
SQL> revoke select on schema chen0204 from cjc0204; SQL> grant all privileges on schema chen0204 to cjc0204;4.2 验证DML权限
授权后,cjc0204用户可以执行各种DML操作:
SQL> insert into chen0204.t0204 values(2); 影响行数 1 SQL> update chen0204.t0204 set id=100 where id=1; 影响行数 1 SQL> delete from chen0204.t0204 where id=100; 影响行数 1 SQL> commit;但是尝试执行DDL操作仍然会被拒绝:
SQL> create table chen0204.t2(id int); [-5515]:没有创建表权限.注意事项:达梦的ALL PRIVILEGES并不包含DDL权限,这与Oracle的行为不同。在Oracle中,ALL PRIVILEGES通常包含DDL权限,但达梦出于安全考虑将其分开管理。
5. 场景3:授予查询、DML和DDL权限
5.1 授予CREATE ANY TABLE权限
要授予DDL权限,我们需要使用专门的系统权限。首先尝试:
SQL> grant create any table to cjc0204; [-5567]:授权者没有此授权权限.这个错误表明默认情况下不允许授予这类高级权限。我们需要修改另一个参数:
5.2 修改ENABLE_DDL_ANY_PRIV参数
查看当前参数值:
SQL> show parameter ENABLE_DDL_ANY_PRIV 行号 para_name para_value ---------- ------------------- ---------- 1 ENABLE_DDL_ANY_PRIV 0修改参数值:
SQL> sp_set_para_value(1,'ENABLE_DDL_ANY_PRIV',1); DMSQL 过程已成功完成现在可以成功授予DDL权限了:
SQL> grant create any table to cjc0204;5.3 验证DDL权限
cjc0204用户现在可以创建表了:
SQL> create table chen0204.t2(id int); 操作已执行 SQL> insert into chen0204.t2 values(1); 影响行数 1但是TRUNCATE和DROP TABLE操作仍然被拒绝:
SQL> truncate table chen0204.t2; [-5564]:没有清空表[t2]权限. SQL> drop table chen0204.t2; [-5535]:没有删除表[t2]权限.重要提示:CREATE ANY TABLE是一个强大的权限,它会允许用户在任意模式下创建表,包括系统模式。在生产环境中授予此权限需要特别谨慎。
6. 达梦与Oracle、MySQL的授权差异
6.1 与Oracle的差异
- 授权粒度:Oracle支持更细粒度的对象级别授权,而达梦更倾向于模式级别
- 参数控制:达梦需要修改参数才能开启某些高级授权功能
- ALL PRIVILEGES范围:达梦的ALL PRIVILEGES不包含DDL权限
- 同义词机制:Oracle的同义词可以简化跨用户访问,达梦没有完全相同的机制
6.2 与MySQL的差异
- 授权级别:MySQL主要在库级别授权,达梦在模式/用户级别
- 权限继承:MySQL的权限可以继承,达梦的权限更独立
- DDL控制:达梦对DDL权限的控制更加严格
- 参数依赖:达梦的某些授权功能需要参数支持,MySQL没有这种限制
7. 最佳实践与注意事项
7.1 授权策略建议
- 最小权限原则:只授予必要的权限
- 参数调整谨慎:修改GRANT_SCHEMA等参数前评估风险
- 权限审计:定期检查用户权限分配
- 文档记录:记录所有参数变更和授权操作
7.2 常见问题排查
- 授权不生效:检查参数是否已修改并重启
- 权限不足:确认授予的权限是否包含所需操作
- 语法错误:注意达梦特有的授权语法
- 对象不存在:确认对象名称和模式名称��确
7.3 性能考虑
- 权限验证会增加少量开销
- 大量细粒度授权可能影响性能
- 频繁的权限变更可能导致锁争用
在实际工作中,我发现达梦数据库的授权机制虽然学习曲线较陡,但提供了很好的安全性和灵活性。特别是在金融、政务等对安全性要求高的场景中,这种严格的权限控制机制非常有用。