3

我对 oracle 非常陌生,并试图授予我创建的一些物化视图的权利。

我所做的(全部来自 sqlplus 命令行):

sqlplus "/ 作为 sysdba

>create tablespace tablespace_test datafile 'g:\tables\tablespace_test.dbf' size 20M autoextend on;

>create materialized view test_mv_1 tablespace tablespace_test parallel build immediate refresh complete on demand as select cm.* from yyy.jjj$project@externaldb p, yyy.jjj$mgmt@externaldb cm where (p.project_nbr = cm.project_nbr);

>create user dummy profile default identified by password default tablespace tablespace_test account unlock;

>grant connect to dummy;

>grant select on test_mv_1 to dummy;

>select * from test_mv_1;   <---***this works, data is there

>connect dummy

>select * from test_mv_1;
ERROR at line 1:
ORA-00942: table or view does not exist

不知道如何解决这个问题,我确定我做错了一些事情。任何帮助是极大的赞赏。

4

1 回答 1

4

如果物化视图的所有者是SYS(这是一个非常糟糕的主意——你永远不应该在SYS模式 中创建对象SYS。这是特殊的。它是为 Oracle 保留的。它的行为经常与数据库中的所有其他模式不同。)和没有为物化视图创建同义词,您需要在发出查询时指定完全限定名称为dummy. 那是

SQL> connect dummy/password
SQL> select * from sys.test_mv_1;

不过,您真的,真的真的想在不同的模式中创建物化视图。假设您在mv_owner架构中创建物化视图,查询将更改为

select *
  from mv_owner.test_mv_1

如果要避免使用完全限定名称,可以创建同义词。如果您创建公共同义词

CREATE PUBLIC SYNONYM test_mv_1
   FOR mv_owner.test_mv_1

dummy或者如果您在架构中创建私有同义词

CREATE SYNONYM test_mv_1
   FOR mv_owner.test_mv_1

然后dummy将能够指定一个不合格的对象名称

SELECT *
  FROM test_mv_1
于 2012-08-31T09:42:13.117 回答