朋友说遇到了一个奇怪的事,问能访问表,也有CREATE ANY VIEW的权限,为什么不能基于被访问的表创建视图?
而且是同一用户中有的表可以建视图,有的表不能建视图。
创建视图有两个条件要满足:
1.有创建视图的权限
2.当前用户有被表的所有者显示授予访问表的权限(即权限不能是通过角色继承过来的)
下面模拟一下解决过程:
-- 1.有访问表scott.emp的权限(此权限不是被显示授予的,是通过角色继承过来的。所以创建视图失败)
SQL> SELECT COUNT(1) FROM scott.emp;
COUNT(1)
----------
13
-- 2. 创建视图失败
SQL> CREATE VIEW emp AS SELECT * FROM scott.emp;
CREATE VIEW emp AS SELECT * FROM scott.emp
ORA-01031: 权限不足
-- 3.查看当前session是否有创建视图的权限,结果表明确实有创建视图的权限(CREATE ANY VIEW)
SQL> SELECT * FROM SESSION_PRIVS
2 WHERE PRIVILEGE IN ('CREATE ANY VIEW', 'SELECT ANY TABLE');
PRIVILEGE
----------------------------------------
SELECT ANY TABLE
CREATE ANY VIEW
-- 4. 基于其他表可以创建视图,为什么呢?
SQL> CREATE OR REPLACE VIEW s_dept AS SELECT * FROM scott.dept;
View created
SQL> CREATE OR REPLACE VIEW s_emp AS SELECT * FROM scott.emp;
CREATE OR REPLACE VIEW s_emp AS SELECT * FROM scott.emp
ORA-01031: 权限不足
--5 查看当前用户拥有的对象权限,发现DEPT表被显示的授予了select的权限,而emp表没有。
为什么没有授予select权限,还能访问scott.emp表呢?
因为当前用户拥有DBA权限。dba角色中包含了select any table的权限。
SQL> SELECT GRANTOR, TABLE_NAME, PRIVILEGE
2 FROM USER_TAB_PRIVS
3 WHERE GRANTOR = 'SCOTT';
GRANTOR TABLE_NAME PRIVILEGE
--------------- --------------- ---------------
SCOTT DEPT SELECT
--6. 知道了问题的原因,让scott用户显示授权给report用户selelct 表EMP的权限即可。
SQL> conn scott/tiger
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> grant select on emp to report;
Grant succeeded
SQL> conn report/report
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as report
SQL> SELECT GRANTOR, TABLE_NAME, PRIVILEGE
2 FROM USER_TAB_PRIVS
3 WHERE GRANTOR = 'SCOTT';
GRANTOR TABLE_NAME PRIVILEGE
--------------- --------------- ---------------
SCOTT DEPT SELECT
EMP DEPT SELECT
--7 显示授予report用户selelct权限后,视图可以成功创建。
SQL> CREATE OR REPLACE VIEW sc_emp AS SELECT * FROM scott.emp;
View created