创建其他用户下的物化视图报错权限不足
上一篇 / 下一篇 2008-05-24 23:58:07 / 个人分类:ORACLE
在创建一个其他用户的物化视图时报错,错误信息为:ORA-01031:权限不足。
以前写过几篇文章,介绍物化视图创建所需要的权限:
建立物化视图所需权限(一):http://yangtingkun.itpub.net/post/468/50672
建立物化视图所需权限(二):http://yangtingkun.itpub.net/post/468/50707
建立物化视图所需权限(三):http://yangtingkun.itpub.net/post/468/50838
建立物化视图所需权限(四):http://yangtingkun.itpub.net/post/468/51163
但是目前碰到的问题显然和上面的普通问题有所区别。
下面看看问题的重现:
SQL> CREATE USER MV IDENTIFIED BY MV DEFAULT TABLESPACE USERS;
用户已创建。
SQL> GRANT CONNECT, RESOURCE TO MV;
授权成功。
SQL> GRANT CREATE MATERIALIZED VIEW TO MV;
授权成功。
SQL> CREATE USER USER_DBA IDENTIFIED BY USER_DBA;
用户已创建。
SQL> GRANT DBA TO USER_DBA;
授权成功。
SQL> CONN MV/MV
$l3K2ws6W/N(KY2@7R0已连接。
V PE;a4K V0}Q0SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FASTITPUB个人空间2w[1}{1W$fP
2 AS SELECT * FROM T;
实体化视图已创建。
用户MV创建物化视图并不会报错,下面尝试使用USER_DBA用户来创建MV用户下的物化视图:
SQL> CONN USER_DBA
h_7l`.]sb#G"g
~+N+c0输入口令:ITPUB个人空间&NgprN5S|.u+Bx
已连接。ITPUB个人空间xG5}}/`9T
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
q;Iez&OBos^.h0 2 AS SELECT * FROM MV.T;
实体化视图已创建。
SQL> DROP MATERIALIZED VIEW MV_T;
实体化视图已删除。
SQL> DROP MATERIALIZED VIEW MV.MV_T;
实体化视图已删除。
SQL> CREATE MATERIALIZED VIEW MV.MV_T REFRESH FASTITPUB个人空间Rx#[(K,H;KT|8W
2 AS SELECT * FROM MV.T;
(?F6O M@K0AS SELECT * FROM MV.T
,K7n5S
I7t*j Nm{0 *
4AxED&I{(]J$n0第2行出现错误:ITPUB个人空间3F'B~%[2m
|;f
ORA-01031:权限不足
可以看到,USER_DBA可以在当自己的SCHEMA建立物化视图,但是无法在MV用户下建立物化视图。
由于Oracle报错缺少权限,首先感觉的问题是出在USER_DBA用户上,因为MV用户自己可以建立物化视图。
尝试使用SYS来建立物化视图:
SQL> CONN / AS SYSDBAITPUB个人空间5JV2KF"UC8KC1n
已连接。
t
RiGq'U0SQL> CREATE MATERIALIZED VIEW MV.MV_T REFRESH FAST
D9[u?\zs~r0 2 AS SELECT * FROM MV.T;
实体化视图已创建。
SQL> DROP MATERIALIZED VIEW MV.MV_T;
实体化视图已删除。
SYS用户的创建成功,更加确信问题是出在USER_DBA身上,开始怀疑USER_DBA是缺少了什么权限。
可是USER_DBA已经授予了DBA角色,按道理将,一般不会缺少什么权限,难道权限还需要直接授权,而不能通过角色:
SQL> GRANT CREATE ANY TABLE TO USER_DBA;
授权成功。
SQL> GRANT SELECT ANY TABLE TO USER_DBA;
授权成功。
SQL> GRANT COMMENT ANY TABLE TO USER_DBA;
授权成功。
SQL> GRANT LOCK ANY TABLE TO USER_DBA;
授权成功。
SQL> GRANT SELECT ANY DICTIONARY TO USER_DBA;
授权成功。
SQL> CONN USER_DBA/USER_DBAITPUB个人空间y9@ewfX
已连接。ITPUB个人空间L:NoJy/M&CX
SQL> CREATE MATERIALIZED VIEW MV.MV_T REFRESH FASTITPUB个人空间5fC;g6hM0u0hF*N
2 AS SELECT * FROM MV.T;ITPUB个人空间i0i!M
h4s ]3f5Z
AS SELECT * FROM MV.T
F'@/}d&vv
W_0 *
H8af,JT"U@ Q_ V0第2行出现错误:ITPUB个人空间xusyq4Q9G
ORA-01031:权限不足
将一堆的ANY权限直接授权给USER_DBA,可是创建物化视图视图的时候仍然报错,缺少权限,这就没有什么道理了,难道是个bug。
查询了metalink,并未发现什么类似的描述。看来只好通过trace的方式分析一下错误了:
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
会话已更改。
SQL> CREATE MATERIALIZED VIEW MV.MV_T REFRESH FASTITPUB个人空间T5[({
m
e"Vp
2 AS SELECT * FROM MV.T;
8o|Yj+~Mf0AS SELECT * FROM MV.TITPUB个人空间xG!EB,z
*
,kr~H"y!nG0第2行出现错误:
3H O
DuB!@d
g0ORA-01031:权限不足
ITPUB个人空间~?Xz6m$WIRk
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
会话已更改。
下面查看一下trace中,错误出现在哪里:
SQL> SELECT SPID FROM V$PROCESS P, V$SESSION S
Ld|HS7w/@0 2 WHERE P.ADDR = S.PADDRITPUB个人空间S6c2i#]6e;E
3 AND SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);
SPIDITPUB个人空间.Z,D$} eX'd-[
W
------------ITPUB个人空间(EqJ4k]f]
13940
SQL> HOST
EKx~)u#p!Y_9Al0[oracle@testzone ~]$ more $ORACLE_BASE/admin/testzj/udump/testzj_ora_13940.trc
`5Wl+t@/T(]&c0/opt/ora
d
I)vE }cb0Oracle Database
db;v:gJg)u d0With the Partitioning, OLAP and Data Mining options
qb.uO/zZZh\0ORACLE_HOME = /opt/ora
!o K2} IL]~4w/jI0System name: Linux
F@UE8{~1[!P'g&U0Node name: testzone
^"} s;X1w\0Release: 2.6.18-8.el5xenITPUB个人空间0Rx!hd
EO/b7s
Version: #1 SMP Tue Jun 5 23:53:34 EDT 2007ITPUB个人空间 cUL$tPh*kym
Machine: x86_64
9gHL5[\d0Instance name: testzj
9tY[ Go{(_@8m+}N0Redo thread mounted by this instance: 1
`2g&u_-euj0Oracle process number: 20ITPUB个人空间C#v/Z
XTn[
Unix process pid: 13940, image: oracle@testzone (TNS V1-V3)
*** 2008-05-08 16:05:49.580
8R1Hd7y5n!A7b0*** ACTION NAME:() 2008-05-08 16:05:49.580ITPUB个人空间#dd;C!F IO{L
*** MODULE NAME:(SQL*Plus) 2008-05-08 16:05:49.580ITPUB个人空间&a