达梦数据库跨用户授权,和Oracle、MySQL有明显差异

需求:

1.授予cjc0204用户,chen0204用户下所有表的查询权限;
2.授予cjc0204用户,chen0204用户下所有表的查询、DML权限;
3.授予cjc0204用户,chen0204用户下所有表的查询、DML、DDL权限;

创建测试数据:

disql sysdba/******:5238
create user cjc0204 identified by "******";
create user chen0204 identified by "******";
grant resource to cjc0204;
grant resource to chen0204;

两个用户分别创建表:

create table t0204(id int);
insert into t0204 values(1);
commit;

场景1:授予cjc0204用户,chen0204用户下所有表的查询权限

默认没有跨用户读写权限

dmdba@CJC-DB-01:/home/dmdba$disql cjc0204/******:5238
SQL> select * from chen0204.t0204;
select * from chen0204.t0204;
[-5504]:没有[CHEN0204.t0204]对象的查询权限.
已用时间: 0.733(毫秒). 执行号:0.

模式级别授权:
默认不支持模式级别授权

SQL> grant select on schema chen0204 to cjc0204;
grant select on schema chen to cjc;
第1 行附近出现错误[-2201]:无效的数据库对象.
已用时间: 0.516(毫秒). 执行号:0.

需要先修改参数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

再次执行授权:

dmdba@CJC-DB-01:/db/dm8/data/cjc$disql sysdba/******:5238
SQL> grant select on schema chen0204 to cjc0204;

可以查询chen0204模式下的表数据

dmdba@CJC-DB-01:/home/dmdba$disql cjc0204/******:5238
SQL> select * from chen0204.t0204;
行号     id         
---------- -----------
1          1
已用时间: 0.848(毫秒). 执行号:46201.

不支持dml和ddl:

SQL> insert into chen0204.t0204 values(1);
insert into chen0204.t0204 values(1);
[-5501]:没有[CHEN0204.t0204]对象的插入权限.
已用时间: 0.365(毫秒). 执行号:0.
SQL> drop table chen0204.t0204;
drop table chen0204.t0204;
第1 行附近出现错误[-5535]:没有删除表[t0204]权限.
已用时间: 0.284(毫秒). 执行号:0.

场景2:授予cjc0204用户,chen0204用户下所有表的查询、DML权限

先回收 之前的 select on schema chen0204 权限,测试 all privileges 权限:

dmdba@CJC-DB-01:/home/dmdba$disql sysdba/******:5238
SQL> revoke select on schema chen0204 from cjc0204;
SQL> grant all privileges on schema chen0204 to cjc0204;

验证授权:

dmdba@CJC-DB-01:/home/dmdba$disql cjc0204/******:5238
SQL> select * from chen0204.t0204;
行号     id         
---------- -----------
1          1
已用时间: 0.867(毫秒). 执行号:43701.
SQL> insert into chen0204.t0204 values(2);
影响行数 1
已用时间: 0.486(毫秒). 执行号:43702.
SQL> update chen0204.t0204 set id=100 where id=1;
影响行数 1
已用时间: 2.887(毫秒). 执行号:43703.
SQL> delete from chen0204.t0204 where id=100;
影响行数 1
已用时间: 0.844(毫秒). 执行号:43704.
SQL> commit;
操作已执行
已用时间: 2.695(毫秒). 执行号:43705.
SQL> select * from chen0204.t0204;
行号     id         
---------- -----------
1          2
已用时间: 0.298(毫秒). 执行号:43706.

all privileges权限:只有 select 和 DML权限,没有DDL权限:

SQL> create table chen0204.t2(id int);
create table chen0204.t2(id int);
第1 行附近出现错误[-5515]:没有创建表权限.
已用时间: 0.363(毫秒). 执行号:0.

场景3:授予cjc0204用户,chen0204用户下所有表的查询、DML、DDL权限

添加DDL授权:以create table为例:
注意:grant create any table 权限是对所有用户/模式下的create权限,权限较大,谨慎授予,不支持针对某一个用户/模式

dmdba@CJC-DB-01:/home/dmdba$disql sysdba/******:5238
SQL> grant create any table to cjc0204;
grant create any table to cjc0204;
第1 行附近出现错误[-5567]:授权者没有此授权权限.
已用时间: 0.525(毫秒). 执行号:0.

需要先改参数:

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 过程已成功完成
已用时间: 13.923(毫秒). 执行号:43802.
SQL> show parameter ENABLE_DDL_ANY_PRIV
行号     para_name           para_value
---------- ------------------- ----------
1          ENABLE_DDL_ANY_PRIV 1
SQL> grant create any table to cjc0204;
操作已执行
已用时间: 7.144(毫秒). 执行号:44002.
dmdba@CJC-DB-01:/home/dmdba$disql cjc0204/******:5238
服务器[LOCALHOST:5238]:处于主库打开状态
登录使用时间 : 2.269(ms)
disql V8
SQL> create table chen0204.t2(id int);
操作已执行
已用时间: 10.173(毫秒). 执行号:44601.
SQL> insert into chen0204.t2 values(1);
影响行数 1
已用时间: 0.698(毫秒). 执行号:44602.
SQL> commit;
操作已执行
已用时间: 2.701(毫秒). 执行号:44603.
SQL> truncate table chen0204.t2;
truncate table chen0204.t2;
第1 行附近出现错误[-5564]:没有清空表[t2]权限.
已用时间: 0.249(毫秒). 执行号:0.
SQL> drop table chen0204.t2;
drop table chen0204.t2;
第1 行附近出现错误[-5535]:没有删除表[t2]权限.
已用时间: 0.255(毫秒). 执行号:0.
SQL> create table chen.tt0205(id int);
操作已执行
已用时间: 10.469(毫秒). 执行号:44604.


欢迎关注我的公众号《 IT小Chen


请使用浏览器的分享功能分享到微信等