【发布时间】:2021-08-16 19:14:54
【问题描述】:
有一个到远程数据库的 DBLink 和一个包 MY_PACKAGE(在本地模式中)通过 MY_VIEW 间接依赖于它。
当 DBLink 无效(无论出于何种原因,即连接丢失或远程凭据被更改)时,包将变为无效。但是让它工作会很棒,因为这个包除了通过这个 DBLink 进行协商之外还有其他职责。总的来说,我不认为模式对象的有效性取决于网络连接等不稳定部分。
我在遗留代码中发现了这种情况(参见MY_PACKAGE.doSomething()),我什至不确定这是否是正确的设计。您能对此发表您的看法吗?
即使某些 DBLink 不可用,将包保持在 VALID 状态的正确方法是什么?
例如,使用引用MY_VIEW 的动态游标是否正确,仅当DBLink 不正常时(即MY_PACKAGE.doSomethingAgain())才无法打开。当然,也许有一个更自然的方法来解决这个问题。我很高兴听到所有适合在 Oracle 中安全使用 DBLinks 的选项。
代码:
-- DBLink --------------------------------------------------------------
CREATE DATABASE LINK "MY_LINK"
CONNECT TO "MY_USER" IDENTIFIED BY VALUES ':1' USING 'WHATEVER';
------------------------------------------------------------------------
-- Synonym -------------------------------------------------------------
CREATE OR REPLACE EDITIONABLE SYNONYM "MY_SYNONYM"
FOR "MY_REMOTE_SCHEMA"."MY_REMOTE_VIEW"@"MY_LINK";
------------------------------------------------------------------------
-- View ----------------------------------------------------------------
CREATE OR REPLACE VIEW "MY_VIEW" AS
SELECT a,b,c FROM "MY_SYNONYM";
> Compiler Error
> ORA-02063: preceding 2 lines from MY_LINK
> ORA-01017: invalid username/password; logon denied
> [Oracle][ODBC SQL Server Wire Protocol driver][SQL Server]
> Login failed for user 'MY_USER'. {28000,NativeErr = 18456}
------------------------------------------------------------------------
.
-- Package body --------------------------------------------------------
CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS
PROCEDURE doSomething()
IS
i NUMBER := 0;
BEGIN
FOR rec IN (SELECT * FROM "MY_VIEW")
LOOP
i := i + 1;
END LOOP;
END;
PROCEDURE doSomethingAgain()
IS
i NUMBER := 0;
my_cur SYS_REFCURSOR;
BEGIN
OPEN my_cur FOR 'SELECT * FROM MY_VIEW';
LOOP
FETCH my_cur -- ...
-- etc ...
i := i + 1;
END LOOP;
END;
END MY_PACKAGE;
> Compiler Error
> 7/4 PL/SQL: SQL Statement ignored
> 7/35 PL/SQL: ORA-04063: view "MY_VIEW" has errors
------------------------------------------------------------------------
【问题讨论】:
标签: oracle plsql database-design dblink