web-dev-qa-db-ja.com

SQL 2000/2005上のOracleデータベースにリンクサーバーをどのように設定しますか?

リモートのOracleデータベースからローカルのSQLサーバーにテーブルをコピーするDTSパッケージを作成して実行できますが、リンクされたサーバーとしてOracleデータベースへの接続をセットアップします。

DTSパッケージは現在Microsoft OLE DB Provider for Oracle)を次のプロパティで使用しています:

  • データソース:SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=10.1.3.42)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=acc)));uid=*UserName*;pwd=*UserPassword*;
  • パスワード:serPassword
  • ユーザーID:serName
  • パスワードの保存を許可:true

上記で定義したデータソースを使用して、リンクサーバーをOracleデータベースに設定するにはどうすればよいですか?

21
Oppositional

リンクサーバーをリモートのOracleデータベースにセットアップすることができましたが、最終的には複数ステップのプロセスになりました。

  1. SQL ServerにOracle ODBCドライバをインストールします。
  2. SQL ServerでOracleデータベースへのシステムDSNを作成します。
  3. システムDSNを使用してSQLサーバー上にリンクサーバーを作成します。

ステップ1:OracleをインストールODBCサーバーにドライバー

a。必要な Oracle Instant Client パッケージをダウンロードします:Basic、ODBC、SQL * Plus(オプション)

b。パッケージをSQLサーバーのローカルディレクトリ(通常はC:\Oracle)に解凍します。これはC:\Oracle\instantclient_10_2のような[ディレクトリ]になるはずです。これは、この回答の残りで参照される[ディレクトリ]の値になります。

c。以下を含むtnsnames.oraという名前のテキストファイルをインスタントクライアント[ディレクトリ]内に作成します。

OracleTnsName = 
(
  DESCRIPTION=
  (
    ADDRESS = (PROTOCOL=TCP)(Host=10.1.3.42)(PORT=1521)
  )
  (
    CONNECT_DATA = (SERVICE_NAME=acc)
  )
)

注:実際のHostPORT、およびSERVICE_NAMEは、接続を確立しているOracleサーバーによって異なります。この情報は、listenersの下のOracleネットワーククライアントツールを使用して見つけることができます。

OracleTnsNameは、Oracleデータソースに割り当てる任意の名前にすることができ、システムDSNを設定するときに使用されます。上記の構文を使用して、必要に応じて、同じ tnsnames.ora ファイルで複数のTNS名を定義することもできます。

d。 [ディレクトリ]をシステムPATH環境変数に追加します。

e。 [ディレクトリ]の値を持つTNS_Adminという名前の新しいシステム環境変数を作成します

f。 [directory]\odbc_install.exeユーティリティを実行して、Oracle ODBCドライバをインストールします。

g。 SQLサーバーを再起動することをお勧めしますが、必要ない場合もあります。また、SQLサーバーとSQLエージェントのユーザーIDに対して、このディレクトリへのセキュリティ権限を付与することもできます。

ステップ2:Oracleを使用するシステムDNSを作成するODBC driver

a。 ODBC Data Source Administratorツールを開きます。 [管理ツール->データソース(ODBC)]

b。 [システムDSN]タブを選択し、[追加]ボタンを選択します。

c。ドライバーのリストで、Oracle in instantclient {バージョン}を選択します。 (「Oracle in instantclient 10_2」など)、[完了]ボタンを選択します。

d。以下を指定します。

  • Data Source Name:{システムDSN名}
  • Description:{空白/空のままにする}
  • TNS Service Nametnsnames.oraファイルで定義したOracleTnsNameがリストされているはずです。値として選択してください。
  • ユーザーID:{Oracleユーザー名}

e。 [テスト接続]ボタンを選択します。 {Oracleユーザーのパスワード}を入力するように求められます。すべてがうまくいけば、テストは成功します。

ステップ3:SQLでOracleデータベースにリンクサーバーを作成する

SQLサーバーでクエリウィンドウを開き、次を実行します。

EXEC sp_addlinkedserver 
     @server        = '{Linked Server Name}'
    ,@srvproduct    = '{System DSN Name}'
    ,@provider      = 'MSDASQL'
    ,@datasrc       = '{System DSN Name}'

EXEC sp_addlinkedsrvlogin 
     @rmtsrvname    = '{Linked Server Name}'
    ,@useself       = 'False'
    ,@locallogin    = NULL
    ,@rmtuser       = '{Oracle User Name}'
    ,@rmtpassword   = '{Oracle User Password}'

注:{Linked Server Name}は、Oracleサーバーを参照するときに使用したいものであれば何でも構いませんが、{System DNS Name}は名前と一致する必要があります以前に作成したシステムDSNの。

{Oracle User Name}は、システムDSNが使用するユーザーIDと同じである必要があり、{Oracle User Password}は、ODBC接続を正常にテストするために使用したものと同じである必要があります。 Oracleリンクサーバーの問題のトラブルシューティングについては、 KB 280106 を参照してください。

Oracleリンクサーバーのクエリ

[〜#〜] openquery [〜#〜] を使用してOracleリンクサーバーでパススルークエリを実行できますが、非常に大きなレコードセットの場合、ORA-01652パススルークエリでORDER BY句を指定した場合のエラーメッセージ。 ORDER BY句をパススルークエリから外部のselectステートメントに移動すると、この問題は解決しました。

36
Oppositional

私も同じ問題を抱えていました。私は何時間もMicrosoftと電話で話していましたが、彼らには解決策がありませんでした。これらの「接続タイムアウト」設定はどれも役に立ちませんでした。

それを解決するために、DTSジョブを実行するジョブを作成しました。このジョブは、1列の1行の時間を2分ごとに更新するだけです。次に、SQL ServerとOracleの間のレプリケーションをセットアップしました。 SQLからOracleへのその単一セルの変更を3分ごとに複製するようにスケジュールされ、接続を維持します!

1
Me Stackohelp