我在Oracle中有3个架构。在第三个架构中有一个物化视图,我需要从第一个架构中刷新。
以下是要求的详细说明:
uv1
(第一模式)-> db链接到nwdb2
(第二模式)-> nwdb3
(第三模式)-> emp_de_mv
(MV)
我需要从emp_de_mv
中刷新uv1
。
我已经在SELECT
上对MV执行uv1
声明,如下所示,该声明已成功运行:
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
中创建新的数据库链接。
答案 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
必须使用数据库链接,因为它不是任何一个模式的本地链接。