Oracleサーバー上のMS SQL Serverからopenrowsetを実行しようとしています。
次のコマンドを実行すると:
select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass',
'select * from table')
次のエラーが発生します
Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".
OraOLEDB.Oracle
でopenrowsetを使用する方法を教えてください。
64ビットバージョンのMS SQL ServerとOracle OLEDBドライバーを使用しています。
Windows 7 x64&Windows Server 2008 x64 with MS SQL Server 2008 x64を実行している2台のマシンでこれを試しました。どちらも同じエラーメッセージを表示しました。
SQL Server Enterprise Managerで\Server Objects\Linked Servers\Providers
を開き、OraOLEDB.Oracle
プロバイダーを右クリックしてプロパティを選択し、"Allow inprocess"
オプションを確認します。リンクサーバーを再作成し、再度テストします。
SQL Server Management Studioにアクセスできない場合は、次のクエリを実行することもできます。
EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
リンクサーバーは、サーバーのローカル管理者であるユーザーに対しては機能するが、他のユーザーに対しては機能しないという問題に遭遇しました。何時間もいじくり回した後、次の手順を使用して問題を解決できました。
(ローカルSQL Serverアカウントではなく)Windows認証でSQL Serverに接続する場合、リンクサーバーを使用しようとすると、エラーメッセージが表示される場合があります。
Cannot create an instance of OLE DB provider "(OLEDB provider name)"...
「MSDAINITIALIZE DCOMクラスのセキュリティ設定が正しくないため」この問題に対する最も直接的な回答は Microsoft KB 2647989 によって提供されます。
解決策は、MSDAINITIALIZEのセキュリティ設定を修正することです。 Windows Vista以降では、クラスはTrustedInstallerによって所有されているため、セキュリティを調整する前にMSDAINITIALIZEの所有権を変更する必要があります。上記のKBには、詳細な手順が記載されています。
MSDAINITIALIZEは、OLE DB。によって提供されるCOMクラスです。このクラスは、OLE DB接続文字列を解析し、プロパティ値に基づいてプロバイダをロード/初期化できます。接続文字列.MSDAINITILIAZEは、SQL Serverに接続しているユーザーによって開始されます。Windows認証を使用してSQL Serverに接続する場合、プロバイダーはログインユーザーアカウントで初期化されます。ログインユーザーがSQLログインである場合、プロバイダーは初期化されますSQL Serverサービスアカウントで使用されるログインの種類に基づいて、MSDAINITIALIZEの権限を適宜提供する必要があります。
この問題は、少なくともSQL Server 2000までさかのぼります。 MicrosoftのKB 280106はエラーについて説明しています (「メッセージ3」を参照)で、OLEDBプロバイダーのIn Processフラグを設定する修正案があります。
In Processを設定することで差し迫った問題を解決できますが、それはあなたが望むものではないかもしれません。マイクロソフトによると、
SQL Serverプロセスの外部でプロバイダーをインスタンス化すると、プロバイダーのエラーからSQL Serverプロセスが保護されます。プロバイダーがSQL Serverプロセスの外部でインスタンス化される場合、長い列(テキスト、ntext、またはイメージ)を参照する更新または挿入は許可されません。 - SQL Server 2008 R2のリンクサーバープロパティドキュメント 。
より良い答えは、Microsoftのガイダンスに従って、MSDAINITIALIZEセキュリティを調整することです。
特にエラー7302については、レジストリでOraOLEDB.Oracleを探しているときに、InprocServer32の場所が間違っていることを発見しました。
その場合、またはレジストリでその文字列が見つからない場合は、コンポーネントをインストールまたは再登録する必要があります。
GUID=レベルからキーを削除してから、ProgID(OraOLEDB.Oracle)キーを見つけ、それも削除する必要がありました(ProgIDはペアとしてCLSIDにリンクします)。
次に、ORAOLEDB * .dllでregsvr32.exeを呼び出してOraOLEDB.Oracleを再登録しました。
単独で再登録しても問題は解決しませんでした。レジストリキーを削除して正しい場所を指すようにしなければなりませんでした。または、InprocServer32の場所をハックします。
現在、シングルスレッドアパートメントに関するエラー7308があります。転がる!
Oracle 12cにリンクしようとするSQL Server 2017で同じエラーを受け取りました。 OracleのSQL Developerを使用してソースデータベースに接続することはできましたが、リンクサーバーは7302エラーをスローし続けました。
最後に、すべてのSQLサービスを停止、次にODACコンポーネントを再インストール。 SQLサービスのバックアップを開始しました。
次の構成と同様の状況:
私の解決策: