如何在 Oracle 中使用 DB link 刷新物化视图

How to refresh Materialized View using DB link in Oracle

我在 Oracle 中有 3 个模式。第三个模式中有一个实体化视图,我需要从第一个模式刷新它。

需求说明如下:

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

我需要刷新 uv1emp_de_mv

我已经在 uv1 的 MV 上执行了一个 SELECT 语句,如下所示,它正在成功运行:

SELECT * FROM nwdb3.emp_de_mv@nwdb2;

我尝试按照建议here刷新uv1的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 中创建新数据库 link。

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

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

"These materialized views can be located in different schemas and have different master tables or master materialized views. However, all of the listed materialized views must be in your local database."

解决方案是在远程数据库上执行刷新,通过跨数据库调用 DBMS_MVIEW link:

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

how am I able to access nwdb3 from nwdb2 directly, without DB link & why can't I access nwdb2 directly from uv1, without DB link?

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