儘管 dblink 有效,但同一使用者無法“查看”遠端 oracle 數據庫的視圖
我正在執行一個 impdp 作業,我從中提取了 DDL 以確定作業掛起的原因。它始終在使用 dblink 創建的第一個對像上停止。我按照 Oracle 推薦的系統執行 impdp 作業。該作業必須在同一數據庫上的兩個不同的不同實例上執行,每個實例使用一個唯一的轉儲文件。impdp 作業只從轉儲文件中導入一個模式,在這兩種情況下,模式名稱相同。這兩個 impdp 作業相互依賴於 dblink。在作業無限期等待任一 impdp 實例作業時,它無法從指定的 dblink 檢索數據,正如 SQL Developer 上執行的 DDL 提取所確認的那樣。已在每個數據庫實例中成功創建連結並
SELECT * FROM DUAL@DB_LINK
返回一個值,但SELECT * FROM 'view_name'@DB_LINK
返回“ORA-00942:表或視圖不存在”,儘管我已經確認遠端模式中存在該視圖。我研究了通過 dblinks 創建和獲取數據,並了解 dblink 查詢使用者必須被授予對遠端對象的訪問權限。在這種情況下,使用者在兩個數據庫實例上具有相同的密碼。如何將所有架構對象的權限授予單獨實例中的同名使用者,以便 DDL 可以完成?更新:我已授予對 instance1 中所有視圖的訪問權限,以連接使用者 instance2 使用的 dblink,反之亦然。我仍然無法使用來自各個遠端使用者的 dblink 從任一實例中選擇視圖。這是腳本:BEGIN FOR objects IN ( SELECT 'GRANT ALL ON "'||owner||'"."'||object_name||'" TO <DB_LINK_NAME>' grantSQL FROM all_objects WHERE owner = 'OWNER_NAME' AND object_type = 'VIEW' AND object_type IN ( select view_name from sys.dba_views where owner = 'OWNER_NAME' ) ORDER BY object_type, object_name ) LOOP BEGIN EXECUTE IMMEDIATE objects.grantSQL; EXCEPTION WHEN OTHERS THEN --Ignore ORA-04063: view "X.Y" has errors. --(You could potentially workaround this by creating an empty view, -- granting access to it, and then recreat the original view.) IF SQLCODE IN (-4063) THEN NULL; --Raise exception along with the statement that failed. ELSE raise_application_error(-20000, 'Problem with this statement: ' || objects.grantSQL || CHR(10) || SQLERRM); END IF; END; END LOOP; END; /
不要在 SQL 中引用模式或對象名稱。如果在 Oracle 中預設不存在的名稱中強制區分大小寫。即TABLE_NAME 與table_name 相同,但“TABLE_NAME”與table_name 不同。即使您要引用對象名稱以強制區分大小寫,您也應該使用雙引號而不是單引號。
此外,請注意您授予的內容:如果使用者需要做的只是選擇數據,則“GRANT ALL”是不合適的。
SELECT 'GRANT ALL ON "'||owner||'"."'||object_name||'" TO <DB_LINK_NAME>' grantSQL FROM all_objects WHERE owner = 'OWNER_NAME' AND object_type = 'VIEW' AND object_type IN ( select view_name from sys.dba_views where owner = 'OWNER_NAME' ) ORDER BY object_type, object_name
生成如下 SQL 語句:
GRANT ALL ON 'owner'.'object_name' TO DB_LINK_USER_NAME
當你最有可能想要的是:
GRANT SELECT ON owner.object_name TO DB_LINK_USER_NAME
您的查詢似乎也有點令人費解。DBA_VIEWS 為您提供所需的一切,那麼為什麼要加入可能不包含匹配視圖名稱的 ALL_OBJECTS 呢?授予的順序也不重要,那麼為什麼要包含一個 ORDER BY 子句來強制額外的 I/O 對 TEMP 表空間中的結果進行排序呢?
試試這個:
SELECT 'GRANT SELECT ON "||owner||"."||object_name||" TO <DB_LINK_USER_NAME>' grantSQL FROM dba_views WHERE owner = 'OWNER_NAME'