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;
首先构造表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的权限。
正规的在线重定义过程就不给出来了,此处简略实验过程能够说明该问题就行了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?