sqlplusを使用して、自分のtnsnames.oraを変更せずに別のホストにあるOracle Databaseに接続する方法

別のホストにあるOracleデータベースにsqlplusで接続したいのですが、どうすればいいでしょうか?このページでは、そのデータベースに接続するために、tnsnamesに項目を追加することを提案しています。

local_SID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL= TCP)(Host= hostname.network)(Port= 1521))
    (CONNECT_DATA = (SID = remote_SID))
  )

を追加し、それをsqlplusで使用することを提案しています。

sqlplus user/pass@local_SID

しかし、私の状況では、ローカルのtnsnamesを変更することはできません。tnsnamesを変更することなく、sqlplusの引数だけでリモートデータベースに接続することは可能でしょうか?以下のようなものです。

sqlplus user/pass@remote_SID@hostname.network ;( I know, this one is not valid)
ソリューション
 sqlplus user/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=hostname.network)(Port=1521))(CONNECT_DATA=(SID=remote_SID)))

もしかしたら、使用しているコマンドライン環境にもよるかもしれませんが、以下のように文字列を引用する必要があります。

 sqlplus "user/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=hostname.network)(Port=1521))(CONNECT_DATA=(SID=remote_SID)))"

または

 sqlplus 'user/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=hostname.network)(Port=1521))(CONNECT_DATA=(SID=remote_SID)))'
解説 (0)

これにはeasy connectが使えます。

sqlplus usr/pass@hostname.network/remote_service_name

あなたのマシンで easy connect を有効にするには、sqlnet.ora の NAMES.DIRECTORY_PATH に追加する必要があります。

NAMES.DIRECTORY_PATH=(EZCONNECT)

リスナーがデフォルト以外のポートにある場合は、...@hostname.network:port/... を使用してください。

実際には、SIDではなくサービス名を指定しなければならないようです。これらは同じかもしれませんが、そうでない場合はサーバから取得する必要があります。

解説 (3)

書き込み可能なディレクトリにtnsnames.oraファイルのコピーを作成し、ファイルを適宜変更した後、TNS_ADMIN環境変数にそのディレクトリの場所を設定します。

cp $ORACLE_HOME/network/admin/tnsnames.ora /tmp/tnsnames.ora
# edit the /tmp/tnsnames.ora file to add your entries

# Set the $TNS_ADMIN environment variable so that sqlplus knows where to look 
export TNS_ADMIN=/tmp
解説 (2)