10

dbリンクを作成するための一般的な構文は次のとおりです。

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'

ただし、作成後に別のアカウントがDBリンクを所有するようにしたいと思います。これを行う方法はありますか?

以下は機能しません。

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db'
4

3 に答える 3

20

Sathyaは正しいです。CREATE DATABASE LINK構文では、別のスキーマにデータベースリンクを作成することはできません。でも...

回避策

特権があり、接続しているユーザーが特権をanotheruser持っている限り、別のユーザーのスキーマにデータベースリンクを作成することは可能です。CREATE DATABASE LINKCREATE ANY PROCEDURE

これが私が使用する回避策です:

    プロシージャanotheruserを作成します。"tmp_doit_200906121431"
    は
    始める
      即時実行'
        データベースリンクを作成しますremote_db_link
        remote_userに接続します
        remote_passwordで識別
        ''remote_db'''を使用します;
    終わり;
    /
    始める
      anotheruser。"tmp_doit_200906121431";
    終わり;
    /
    プロシージャanotheruserを削除します。"tmp_doit_200906121431"
    /

それをほどきましょう。まず、anotherusersのスキーマにプロシージャを作成します。このプロシージャには、CREATE DATABASE LINK実行したいステートメントが含まれています。

プロシージャが実行されると、プロシージャの所有者として実行され、CREATE DATABASE LINKステートメントはによって実行されanotheruserます。

プロシージャの名前は重要ではありませんが、既存のオブジェクト名と競合しないことを確認する必要があります。小文字(プロシージャ名を二重引用符で囲む)を使用し、「tmp」を使用してこのオブジェクトを「一時」としてマークし、現在のyyyymmddhh24missをプロシージャ名の一部として使用します。(私は通常、DBA_OBJECTSのクエリを実行して、一致するobject_nameが存在しないことを確認します。)

「1回限りの」タイプの管理機能の場合、これは実行可能な回避策です。私はこれを他の選択肢よりも好みます:別のユーザーのパスワードを保存し、パスワードを変更し、ユーザーとして接続し、別のユーザーのパスワードを保存済みにリセットします。)

于 2009-06-12T19:38:19.387 に答える
9

DBLinkの制限-別のユーザーのスキーマにデータベースリンクを作成したり、スキーマの名前でdblinkを修飾したりすることはできません。

于 2009-06-12T18:33:59.277 に答える
-3

sysユーザーとして、SYS.DBA_DB_LINKSビューですべてのdbリンクを表示できます。そのビューはlink$とuser$テーブルを使用します。通常どおり新しいdblinkを作成すると、link$テーブルに表示されます。次に、所有者を変更します(user $のidを使用します)。専念。終わり。

于 2012-05-30T17:45:49.973 に答える