OPENROWSETを使用したSQL Serverを介したOracle DBへのアクセス
-
19-08-2019 - |
質問
クライアント側のJavascriptでOPENROWSETを使用して、SQL Serverを介して大規模なOracleデータベースにアクセスしようとしていますが、あまり運がありません。詳細は次のとおりです。
- OPENROWSETを使用してOracleデータベースにアクセスするSQL Serverビューは完全に機能するため、有効な接続文字列パラメーターがあることがわかります。ただし、新しい要件は、クライアント側の選択に依存する非常に動的なOracleクエリに対するものであり、動的(またはパラメーター化された)OracleクエリをSQL Serverビューまたはストアドプロシージャから機能させることができませんでした。
- SQL Serverデータベースへのクライアント側のアクセスは、動的なパラメーター化されたクエリで完全に機能します。
- Oracleクライアントソフトウェアを持っているクライアントを期待することはできません。したがって、Oracleデータベースへのアクセスは、ビュー、ストアドプロシージャ、またはOPENROWSETを使用した動的クエリを使用して、SQL Serverデータベースを介して行う必要があります。
- SQL Serverデータベースは共有サーバー上にあるため、グローバルにリンクされたデータベースを使用することはできません。
私の考えは、パラメータ化されたOracleクエリの独自のバージョンを取得し、パラメータの置換を行い、クエリをOPENROWSETでラップし、SQL Serverで実行して結果のレコードセットを返す関数を定義することでした。サンプルコードは次のとおりです。
// db is a global variable containing an ADODB.Connection opened to the SQL Server DB
// rs is a global variable containing an ADODB.Recordset
. . .
ss = "SELECT myfield FROM mytable WHERE {param0} ORDER BY myfield;";
OracleQuery(ss,["somefield='" + somevalue + "'"]);
. . .
function OracleQuery(sql,params) {
var s = sql;
var i;
for (i = 0; i < params.length; i++) s = s.replace("{param" + i + "}",params[i]);
var e = "SELECT * FROM OPENROWSET('MSDAORA','(connect-string-values)';"
+ "'user';'pass','" + s.split("'").join("''") + "') q";
try {
rs.Open("EXEC ('" + e.split("'").join("''") + "')",db);
} catch (eobj) {
alert("SQL ERROR: " + eobj.description + "\nSQL: " + e);
}
}
私が取得しているSQLエラーはAd hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server.
で、これは意味がありません。このエラーのMicrosoftの説明は、レジストリ設定(DisallowAdhocAccess
)に関連しています。これは私のPCで正しく設定されていますが、これは確かにクライアントPCではなくDBサーバーに関連しており、上記のビューが機能するため、そこにある設定が正しいと思われます。
私が試した1つの代替方法は、Openステートメントで囲むEXECを削除することです:
rs.Open(e,db);
しかし、これは同じエラーを生成します。
また、OPENROWSETをストアドプロシージャに入れてみました。これは、SQL Server Management Studio内から実行すると完全に機能しますが、ストアドプロシージャがJavascriptから呼び出されると同じエラーメッセージで失敗します。
私がやろうとしていることは可能ですか?もしそうなら、私のコードを修正する方法をお勧めできますか?または、まったく異なるアプローチが必要ですか?
ヒントや関連情報は歓迎します。事前に感謝します。
解決
自分でこれに答えています。答えを見つけましたが、結果に満足していません。動作した機能は個人ユーザーIDで実行されており、db-owner特権があります。 アドホックアクセスを機能させるには、DisallowAdhocAccess
レジストリ設定を0に設定するか、Webアクセスで使用されるユーザーIDにdb-owner権限を付与する必要があります。これは強固なセキュリティを備えた共有サーバーであるため、レジストリ設定を変更することはできません。これは、データベースよりもはるかに大きな影響を及ぼします。そして、2番目のオプションも同様に危険だと考えています。
その結果、ユーザーにOracle Instant Clientを強制的にインストールさせ、クライアント側のJavascriptでOracleデータベースへのADO接続を直接開けるようにしているようです。
これに関する別の考えを歓迎します。
他のヒント
データベースへのクライアント側のADO接続を開くことは、非常に大きなセキュリティです。あなたは基本的に、ユーザーにデータベースへの接続資格情報を提供し、データベースセキュリティの穴を見つけるためにそれらを大胆にやり直しています。聴衆が社内にいる場合でも、Oracleドライバー(または古いバージョン)がインストールされていないという問題に直面する可能性があります。 JSON呼び出しの背後にOracleクエリを非表示にしないのはなぜですか?これにより、サーバー側でデータベース入力をサニタイズでき、ユーザーはデータベース接続の資格情報をプレーンテキストで受信しませんでした。
sqlserverボックスでリンクサーバーを再試行してください http://msdn.microsoft.com/en-us/library/ms188279。 Oracleデータの取得に使用されるaspx