朋友说遇到了一个奇怪的事,问能访问表,也有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.empORA-01031: 权限不足
-- 3.查看当前session是否有创建视图的权限,结果表明确实有创建视图的权限(CREATE ANY VIEW)SQL> SELECT * FROM SESSION_PRIVS 2 WHERE PRIVILEGE IN ('CREATE ANY VIEW', 'SELECT ANY TABLE');PRIVILEGE----------------------------------------SELECT ANY TABLECREATE 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.empORA-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/tigerConnected 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/reportConnected 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 SELECTEMP DEPT SELECT
--7 显示授予report用户selelct权限后,视图可以成功创建。SQL> CREATE OR REPLACE VIEW sc_emp AS SELECT * FROM scott.emp;View created
SQL>