最近、お客様の1人が、SQLServerテーブルにOracle®データを挿入しようとしたときに問題が発生していました。 SQL Serverインスタンスのターゲットテーブルが、顧客が接続しているデータベースに存在しなかったため、挿入が失敗していました。
最終的に、この問題の解決策は最も単純なものでした。このトラブルシューティングには、問題の潜在的な修正のリストを論理的な順序で提示するために、このソリューションとその他のソリューションが含まれています。トラブルシューティングは、SQLServerをターゲットデータベースとして使用するEasysoftODBCドライバーに基づいていますが、手順の多くは、他のデータベース用の他のunixODBCベースのドライバーに適用できます。
- ターゲットデータベースのデータソース(DSN)を確認します。
これは通常、/ etc/odbc.iniで定義されます。
重要 DSNが別のマシンで動作しているセットアップからのコピーであるという理由だけで、これらの手順をバイパスしないでください。特に、その作業セットアップが別のプラットフォーム上にある場合、および/または異なるバージョンのドライバーを使用している場合。 ODBCドライバーのバージョンが異なれば、odbc.iniファイルの解析も異なります。たとえば、重複がある場合に検出されたDSNまたはDSN属性の最後のバージョンを使用するものもあれば、最後のバージョンを使用するものもあります。さらに、キャリッジリターンなどの問題のある文字がファイルにある場合、別のプラットフォーム上の別のドライバーがodbc.iniファイルの解析を停止することがあります。
- データソースのコピーが1つしかないことを確認します。データソースに複数のバージョンがある場合は、名前を変更するか、他のバージョンを削除します。つまり、次のようにします:
[MYDSN] Database=MYDB
—または—
[MYDSN1] Database=MYDB1 [MYDSN2] Database=MYDB2
ない
[MYDSN] Database=MYDB [MYDSN] Database=MYDB
- DSNのコピーが1つしかないことが確実な場合は、DSNにターゲットデータベースを指定する行しかないことを確認してください。つまり、次のようにします:
[MYDSN] Database=MYDB Server=MYMACHINE . . . [ANOTHERDSN]
ない
[MYDSN] Database=MYDB Server=MYMACHINE Database=MYDB2 . . . [ANOTHERDSN]
—または—
[MYDSN] Database=MYDB Server=MYMACHINE Database= . . . [ANOTHERDSN]
- データソースのコピーが1つしかないことを確認します。データソースに複数のバージョンがある場合は、名前を変更するか、他のバージョンを削除します。つまり、次のようにします:
- データベースを明示的に指定しない場合は、DBAに、ユーザーのデフォルトのデータベースが想定しているデータベースであることを確認してください。たとえば、SQL Serverでは、特定のデータベースに接続するようにログインを構成できます。そのため、
[MYDSN] Database=MYDB Server=MYMACHINE User=MYUSER. . . [ANOTHERDSN]
MYUSERは、ログインが特定のデータベースに構成されている場合はAdventureWorksに、構成されていない場合はマスターデータベースに最初に接続する場合があります。
- 自分が思っているDSNに接続していることを確認します。 DSNを既存のバージョン(たとえば/etc/odbc.ini)に追加したとしても、ドライバーマネージャーがこのファイルを検索しているわけではありません。ドライバーマネージャーの構築方法や環境の設定によっては、別の場所を探している可能性があります。確認するには、データソースのDriver属性をコメントアウトしてみてください。それでも接続できる場合は、別のバージョンのDSNを使用しています。 straceやtrussなどのプログラムを使用して、使用されているodbc.iniファイルを確認します。例:
$ more /etc/odbc.ini [MYDSN] #Driver=Easysoft ODBC-SQL Server $ /usr/local/easysoft/unixODBC/bin/isql.sh -v MYDSN SQL> $ strace -o -f /tmp/odbc.log /usr/local/easysoft/unixODBC/bin/isql.sh -v MYDSN $ grep odbc.ini /tmp/odbc.log
別のマシンからDSNをコピーした場合は、そのマシンでこのプロセスを繰り返して、ソースDSNの場所を確認してください。
- 自分が思っているDBMSに接続していることを確認します。たとえば、それほど混乱がない場合は、DBMSのターゲットインスタンス/サービスを一時停止/停止してみてください。それでも接続できる場合は、別のマシンのDBMSに接続しています。おそらく、ネットワークは、別のマシンがDSNで指定されたものと同じIPアドレスを持っているように見えるように構成されています。
- isqlで、「help」と入力します。返されたテーブルのリストには、どのデータベース名が表示されていますか?それはあなたが期待するものですか?そうでない場合は、次のように入力するとどうなりますか。
use database
データベースを置き換えます ターゲットデータベースの名前を使用します。データベースを変更できない場合は、IPアドレスによってデータベースへのアクセスを制御するログオントリガーがあるかどうかをDBAに確認してください。 SQL Server Management Studioでは、ログオントリガーは INSTANCEの下にあります>サーバーオブジェクト>トリガー。