2

クライアント側の 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 から呼び出されると同じエラー メッセージで失敗します。

私がやろうとしていることは可能ですか?もしそうなら、私のコードを修正する方法をお勧めできますか? それとも、まったく異なるアプローチが必要ですか?

ヒントや関連情報は大歓迎です。前もって感謝します。

4

3 に答える 3

1

私はこれに自分自身で答えています。答えは見つかりましたが、結果には満足していません。機能した機能は、私の個人ユーザー ID で実行されており、db-owner 権限を持っています。アドホックアクセスを機能させるには、レジストリ設定を 0 に設定するか、DisallowAdhocAccessWeb アクセスで使用されるユーザー ID に db-owner 権限を付与する必要があります。これは厳重なセキュリティを備えた共有サーバーであるため、レジストリ設定を変更することはできません。これは、データベースに影響を与えるだけではありません。そして、2番目のオプションも同様に危険だと思います。

その結果、クライアント側の Javascript で Oracle データベースへの ADO 接続を直接開くことができるように、ユーザーに Oracle Instant Client をインストールするよう強制することに固執しているようです。

これに関する別の考えを歓迎します。

于 2009-01-15T23:02:36.720 に答える
0

sqlserverボックスでリンクサーバーを推奨してみてくださいリンクサーバー(データベースエンジン)は、Oracleデータを取得するために使用されます

于 2010-06-07T13:30:32.483 に答える
0

データベースへのクライアント側の ADO 接続を開くことは、非常にセキュリティ上厳禁です。基本的に、ユーザーにデータベースへの接続資格情報を提供し、あえてデータベース セキュリティの穴を見つけさせます。対象者が会社の内部にいる場合でも、オラクル ドライバー (または古いバージョン) がインストールされていないという問題が発生する可能性があります。JSON 呼び出しの背後にある Oracle クエリを非表示にしないのはなぜですか? このようにして、サーバー側でデータベース入力をサニタイズすることができ、ユーザーはデータベース接続資格情報をプレーン テキストで受け取ることはありません。

于 2009-04-09T13:24:13.353 に答える