【问题标题】:grants for views in OracleOracle 中视图的授权
【发布时间】:2019-08-06 17:41:10
【问题描述】:

我正在使用 Oracle 12C,并在我们的其中一个模式 (x) 中创建了一个视图。此视图从表(t1,t2,t3,t4 ...)中提取数据,所有这些表都位于另一个模式(y)中。我想为用户授予此视图的选择权限,但是即使在授予此权限后,用户也是无法访问视图。

我还将表上的 select with grant 选项提供给 schema(x),然后为用户提供了对视图的 select 访问权限,但仍然不起作用。

【问题讨论】:

  • 包含实际的错误消息而不是说某事“不起作用”会很有帮助。理想情况下,使用可重现的测试用例来证明问题。根据您的描述,这应该可以正常工作,因此可能还有其他事情发生。
  • 您好!如果您想更明确地了解如何编写问题以增加及时有用的反馈,请考虑阅读以下内容:stackoverflow.com/help/how-to-ask 否则,很难充分理解问题以回答。

标签: sql oracle12c


【解决方案1】:

这是一个例子。

创建一个全新的用户(以避免之前可能授予的权限):

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 连接,我将创建一个视图(作为其EMPDEPT 表的连接)并将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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多