Oracle在线重定义导致其他用户查询权限丢失

 

Oracle在线重定义导致其他用户查询权限丢失

 

最近通过对大表进行在线重定义迁移表空间的时候,发现其他用户对该表的查询权限丢失。

现在模拟下该问题。

版本:11.2.0.4.201020

脚本:

复制代码
create table ZKM.FILE_MS
(
ID            NUMBER NOT NULL primary key ,
SFILE_NAME    VARCHAR2(200)           ,
RFILE_NAME    VARCHAR2(200)           ,
RSTATUS       VARCHAR2(2)             ,
RINFO         VARCHAR2(2000)          ,
MID           VARCHAR2(100)           ,
CREATE_TIME      DATE                  
);

grant select on ZKM.FILE_MS to SCOTT;

create table ZKM.FILE_MS_TMP
(
ID            NUMBER NOT NULL primary key,
SFILE_NAME    VARCHAR2(200)           ,
RFILE_NAME    VARCHAR2(200)           ,
RSTATUS       VARCHAR2(2)             ,
RINFO         VARCHAR2(2000)          ,
MID           VARCHAR2(100)           ,
CREATE_TIME      DATE                  
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month')) 
(    partition part_t01 values less than(to_date('2019-08', 'yyyy-mm')));


EXEC Dbms_Redefinition.can_redef_table('ZKM','FILE_MS');


BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => 'ZKM', 
orig_table => 'FILE_MS',
int_table => 'FILE_MS_TMP');
END;
/


BEGIN
dbms_redefinition.sync_interim_table(
uname => 'ZKM', 
orig_table => 'FILE_MS',
int_table => 'FILE_MS_TMP');
END;
/

BEGIN
dbms_redefinition.finish_redef_table(
uname => 'ZKM',
orig_table => 'FILE_MS',
int_table => 'FILE_MS_TMP');
END;
/

drop table ZKM.FILE_MS_TMP purge;
drop user zkm cascade;
View Code
复制代码

 

 

首先构造表FILE_MS,然后对该表进行在线重定义。

复制代码
09:35:18 SYS@testdb(328)> create table ZKM.FILE_MS
09:35:43   2  (
09:35:43   3  ID            NUMBER NOT NULL primary key ,
09:35:43   4  SFILE_NAME    VARCHAR2(200)           ,
09:35:43   5  RFILE_NAME    VARCHAR2(200)           ,
09:35:43   6  RSTATUS       VARCHAR2(2)             ,
09:35:43   7  RINFO         VARCHAR2(2000)          ,
09:35:43   8  MID           VARCHAR2(100)           ,
09:35:43   9  CREATE_TIME         DATE                  
09:35:43  10  );

Table created.

Elapsed: 00:00:00.01
09:35:45 SYS@testdb(328)> grant select on ZKM.FILE_MS to SCOTT;

Grant succeeded.

Elapsed: 00:00:00.01
09:36:08 SYS@testdb(328)> set line 500
09:36:13 SYS@testdb(328)> select * from dba_tab_privs where grantee='SCOTT';

GRANTEE                   OWNER                     TABLE_NAME                     GRANTOR                   PRIVILEGE                      GRANTABLE HIERARCHY
------------------------- ------------------------- ------------------------------ ------------------------- ------------------------------ --------- ---------
SCOTT                     ZKM                       FILE_MS                        ZKM                       SELECT                         NO        NO

Elapsed: 00:00:00.01
复制代码

 

 之后改造为分区表。

复制代码
09:43:47 SYS@testdb(328)> create table ZKM.FILE_MS_TMP
09:43:49   2  (
09:43:49   3  ID            NUMBER NOT NULL primary key,
09:43:49   4  SFILE_NAME    VARCHAR2(200)           ,
09:43:49   5  RFILE_NAME    VARCHAR2(200)           ,
09:43:49   6  RSTATUS       VARCHAR2(2)             ,
09:43:49   7  RINFO         VARCHAR2(2000)          ,
09:43:49   8  MID           VARCHAR2(100)           ,
09:43:49   9  CREATE_TIME         DATE                  
09:43:49  10  )
09:43:49  11  PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month')) 
09:43:49  12  ( partition part_t01 values less than(to_date('2019-08', 'yyyy-mm')));

Table created.

Elapsed: 00:00:00.02
09:43:50 SYS@testdb(328)> EXEC Dbms_Redefinition.can_redef_table('ZKM','FILE_MS');

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
09:43:54 SYS@testdb(328)> BEGIN
09:43:59   2  DBMS_REDEFINITION.start_redef_table(
09:43:59   3  uname => 'ZKM', 
09:43:59   4  orig_table => 'FILE_MS',
09:43:59   5  int_table => 'FILE_MS_TMP');
09:43:59   6  END;
09:43:59   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.75
09:44:00 SYS@testdb(328)> BEGIN
09:44:03   2  dbms_redefinition.sync_interim_table(
09:44:03   3  uname => 'ZKM', 
09:44:03   4  orig_table => 'FILE_MS',
09:44:03   5  int_table => 'FILE_MS_TMP');
09:44:03   6  END;
09:44:03   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03
09:44:03 SYS@testdb(328)> BEGIN
09:44:07   2  dbms_redefinition.finish_redef_table(
09:44:07   3  uname => 'ZKM',
09:44:07   4  orig_table => 'FILE_MS',
09:44:07   5  int_table => 'FILE_MS_TMP');
09:44:07   6  END;
09:44:07   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.32
09:44:08 SYS@testdb(328)> select * from dba_tab_privs where grantee='SCOTT';

GRANTEE                   OWNER                     TABLE_NAME                     GRANTOR                   PRIVILEGE                      GRANTABLE HIERARCHY
------------------------- ------------------------- ------------------------------ ------------------------- ------------------------------ --------- ---------
SCOTT                     ZKM                       FILE_MS_TMP                    ZKM                       SELECT                         NO        NO

Elapsed: 00:00:00.05
复制代码

 

可以看到,scott用户一开始对FILE_MS有权限,在线重定义后则转变为对FILE_MS_TMP表有查询权限。

可以得知,对表的查询权限和索引,约束类似,转换表定义后是跟着源表来的。

因此,需要在执行dbms_redefinition.finish_redef_table之前对用户scott授权对FILE_MS_TMP的查询权限,这样dbms_redefinition.finish_redef_table转换后FILE_MS_TMP的权限就变为FILE_MS的权限。

 

正规的在线重定义过程就不给出来了,此处简略实验过程能够说明该问题就行了。

 

posted @   PiscesCanon  阅读(226)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示