Oracle-11g-R2

儘管 dblink 有效,但同一使用者無法“查看”遠端 oracle 數據庫的視圖

  • January 12, 2021

我正在執行一個 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'

引用自:https://dba.stackexchange.com/questions/282796