如何使用Oracle中的数据库链接刷新实例化视图

时间:2019-07-17 07:17:37

标签: oracle distributed-computing materialized-views

我在Oracle中有3个架构。在第三个架构中有一个物化视图,我需要从第一个架构中刷新。

以下是要求的详细说明:

uv1(第一模式)-> db链接到nwdb2(第二模式)-> nwdb3(第三模式)-> emp_de_mv(MV)

我需要从emp_de_mv中刷新uv1

我已经在SELECT上对MV执行uv1声明,如下所示,该声明已成功运行:

SELECT * FROM nwdb3.emp_de_mv@nwdb2;

我尝试按照建议的hereuv1刷新MV。

EXEC DBMS_MVIEW.refresh('nwdb3.emp_de_mv@nwdb2', 'C');

但是它给了我以下错误:

Error starting at line : 25 in command -
EXEC DBMS_MVIEW.refresh('nwdb3.emp_de_mv@nwdb2', 'C')
Error report -
ORA-20000: ORA-00979: illegal reference to remote database
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2994
ORA-06512: at line 1
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
           was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
           the application administrator or DBA for more information.

有人可以帮助我解决上述要求吗?

请注意,由于安全原因,我将无法在uv1中创建新的数据库链接。

1 个答案:

答案 0 :(得分:1)

  

ORA-20000: ORA-00979: illegal reference to remote database

您收到此错误消息是因为,以the documentation for refresh() states开头:

  

“这些实例化视图可以位于不同的架构中,并且具有不同的主表或主实例化视图。但是,所有列出的实例化视图必须位于本地数据库中。”

解决方案是通过在数据库链接上调用DBMS_MVIEW来在远程数据库上执行刷新:

EXEC DBMS_MVIEW.refresh@nwdb2('nwdb3.emp_de_mv', 'C'); 

  

我如何能在没有DB链接的情况下直接从nwdb2访问nwdb3?为什么我不能在没有DB链接的情况下从uv1直接访问nwdb2?

这是您的环境,所以我-不能-了解架构。您将nwdb2描述为架构,但也将其描述为数据库链接。我猜您有一个名为nwdb2的数据库链接,该链接连接到一个也称为nwdb2的模式,该模式对远程数据库服务器中的另一个模式nwdb3具有特权。在远程服务器上,nwdb2可以引用nwdb3模式中的对象,而无需数据库链接,因为这些模式彼此之间是本地的。但是nwdb1必须使用数据库链接,因为它不是任何一个模式的本地链接。