12

現在、ストアド プロシージャ内でリンクされたデータベースのテーブルを参照できないという問題があります。エラーメッセージが表示されます:

ORA-00942: 表またはビューが存在しません

ホスト マシン (Oracle 10g を実行) でリモート データベース (Oracle 11g を実行) へのデータベース リンクを設定するために実行した手順を次に示します。手順は正確ですが、一部の名前は変更されていますが、一貫性は保たれています。

  1. 新しいエントリを追加して、tnsnames.ora を更新します。

    REMOTE_DB =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)
                       (HOST = 10.10.10.10)
                       (QUEUESIZE = 20)
                       (PORT = 1521)
            )
            (CONNECT_DATA =
                       (SERVICE_NAME = remote_service)
            )
        )
    
  2. 後でストアド プロシージャを作成して実行するユーザーとして、データベース リンクを作成します。

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
  3. そこから選択して、データベースリンクが機能していることを証明します。

    select id from remote_table@remote_link;
    
    id
    --------------------------------------------------------------------------------
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917
    c9e7ee51-2314-4002-a684-7817b181267b
    cc395a81-56dd-4d68-9bba-fa926dad4fc7
    d6b450e0-3f36-411a-ba14-2acc18b9c008
    
  4. 作業中のデータベース リンクに依存するストアド プロシージャを作成します。

    create or replace
    PROCEDURE test_remote_db_link
    AS
    v_id varchar(50);
    BEGIN   
        select id into v_id from remote_table@remote_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b';
        dbms_output.put_line('v_id : ' || v_id);
    END test_remote_db_link;
    
  5. 次のエラー メッセージを 1 日以上見つめた後、自分の頭を爆発させてください。

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    

この問題を解決するために、次のような多くのことを試しました。

  1. データベース リンクを作成するときは、ユーザー名とパスワードを引用符で囲みません。リンクは正常に作成されますが、そこから選択すると次のエラーが表示されます。

    ERROR at line 1:
    ORA-01017: invalid username/password; logon denied
    ORA-02063: preceding line from TWS_LINK
    
  2. 大文字/小文字のユーザー名とパスワードのさまざまな組み合わせを試しました。1と同じエラーを受け取りました。

  3. ユーザー名とパスワードを二重引用符ではなく一重引用符で囲んでみました。このエラーを受け取りました:

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
  4. sqlplus でリモート db に接続することにより、リモート db に完全にアクセスできることが証明されました。

    [oracle]$ sqlplus remote_user/remote_pass@REMOTE_DB
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> 
    

次に何をすべきかわかりません。考えられる次のステップは、リモート データベースの問題の調査を開始し、他のデータベースが接続できるかどうかを確認することです。もう 1 つは、ホスト 10g からリモート 11g への非互換性を調べることです。

4

3 に答える 3

7

わかりましたので、これを機能させることができました。

データベース リンクを作成するときに、ユーザー名とパスワードのフィールドを二重引用符で囲んでいることが問題の原因であることが判明しました。要約すると:

それらが存在し、リンクが次のように作成された場合:

create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
  1. リモートデータベースはSQL経由でクエリできます
  2. ストアド プロシージャをコンパイルできず、ORA-942 エラーが発生しました
  3. プロシージャをコンパイルできなかったため、実行できませんでした

二重引用符が存在しない場合:

create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
  1. リモートデータベースはSQL経由でクエリできず、無効なパスワードエラーを受け取りました(詳細は質問に記載されています)
  2. ストアド プロシージャは、エラーなしでコンパイルできました。
  3. ストアド プロシージャは期待どおりに実行され、データベース リンクからデータを取得して表示します。

そのため、SQL を介してリモート データベースにクエリを実行できず、無効なパスワード エラーが発生しても、この同じ接続情報を使用するプロシージャは正常にコンパイルおよび実行されます。

きっと同意していただけると思いますが、これは奇妙な状況であり、私のシナリオでそれを機能させることに本当に出会いました。未回答の質問がたくさんあるので、それを解決策と呼ぶかどうかはよくわかりません。

うまくいけば、誰かがGoogle経由でここに来たら、この回答が役に立ち、少なくともコードを実行できるようになるでしょう。

GC。

于 2011-10-24T11:23:05.613 に答える
4

私は11gR2で同じ問題に直面しました、そして私は問題を見つけるのを手伝ってくれたこのフォーラムに感謝しています。SQLとプロシージャの両方でdbリンクを機能させる方法は、以下の構文に従うことです(パスワードのみを二重引用符で囲みます)。

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
于 2012-04-02T16:58:41.763 に答える
2

ここに問題があると思います。ストアドプロシージャを実行しているユーザーは、ストアドプロシージャを作成したユーザーと同じですか?

「後でストアドプロシージャを実行するユーザーとして、データベースリンクを作成する」とおっしゃいました。

データベースリンクを作成しているユーザーがストアドプロシージャを作成しているユーザーと異なる場合は、それが問題である可能性があります。

同じユーザーとしてストアドプロシージャとデータベースリンクを作成するか、パブリックデータベースリンクを作成してみてください。

次に、Oracleのデフォルトは定義者権限であるため、誰でもストアドプロシージャを実行することができます(プロシージャに対する実行権限が付与されている場合)。

于 2011-10-20T17:18:16.227 に答える