这是一个例子。
创建一个全新的用户(以避免之前可能授予的权限):
SQL> create user mike identified by lion default tablespace users temporary tablespace temp quota unlimited on users;
User created.
SQL> grant create session to mike;
Grant succeeded.
以SCOTT 连接,我将创建一个视图(作为其EMP 和DEPT 表的连接)并将select 权限授予新创建的用户MIKE:
SQL> connect scott/tiger
Connected.
SQL> create view v_emp_dept as
2 select d.dname, e.ename, e.job, e.sal
3 from emp e join dept d on e.deptno = d.deptno;
View created.
SQL> grant select on v_emp_dept to mike;
Grant succeeded.
现在,以mike 连接并从 Scott 的视图中选择:
SQL> connect mike/lion
Connected.
SQL> select * from scott.v_emp_dept;
DNAME ENAME JOB SAL
-------------- ---------- --------- ----------
RESEARCH SMITH CLERK 800
SALES ALLEN SALESMAN 1600
SALES WARD SALESMAN 1250
RESEARCH JONES MANAGER 2975
SALES MARTIN SALESMAN 1250
SALES BLAKE MANAGER 2850
ACCOUNTING CLARK MANAGER 2450
RESEARCH SCOTT ANALYST 3000
ACCOUNTING KING PRESIDENT 5000
SALES TURNER SALESMAN 1500
RESEARCH ADAMS CLERK 1100
SALES JAMES CLERK 950
RESEARCH FORD ANALYST 3000
ACCOUNTING MILLER CLERK 1300
14 rows selected.
SQL>
工作正常,对吧?那么,你做错了什么?您可能忘记指定视图所有者的名称,即
select * from scott.v_emp_dept;
^^^^^^
This!
如果您想避免这种情况,请创建同义词:首先获得该权限,然后根据需要命名同义词(可以,但不必与原始视图具有相同的名称):
SQL> connect sys as sysdba
Enter password:
Connected.
SQL> grant create synonym to mike;
Grant succeeded.
SQL> connect mike/lion
Connected.
SQL> create synonym my_emp_dept for scott.v_emp_dept;
Synonym created.
SQL> select * from my_emp_dept where rownum = 1;
DNAME ENAME JOB SAL
-------------- ---------- --------- ----------
ACCOUNTING CLARK MANAGER 2450
SQL>