クライアント側の 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 から呼び出されると同じエラー メッセージで失敗します。
私がやろうとしていることは可能ですか?もしそうなら、私のコードを修正する方法をお勧めできますか? それとも、まったく異なるアプローチが必要ですか?
ヒントや関連情報は大歓迎です。前もって感謝します。