2015-09-30 18 views
7

テーブルを返すSQL Server 2012ストアドプロシージャがあります。返されたテーブルに追加の値を追加するには、そのSPを変更する必要があります。残念なことに、その付加価値はWebサービスへの呼び出しから発生します。私の研究から、これを行う主な方法は、SQLでOLEオートメーションプロシージャ(sp_OA ...)を使用する方法とSQLCLRストアドプロシージャを使用する方法です。 sp_OA ...プロシージャが実行されるセキュリティコンテキストが与えられると、単一の戻り値はVARCHAR(10)登録キーであり、サービスへの呼び出しは少数(時間当たり10〜20)ですが、私はSQLCLRメソッドを推測しています行く道。また、Webサービスはイントラネット上でホストされており、外部からはアクセスできません。SQL CLRからWebサービスを呼び出しますか?

私は必要なものを達成するためのよりよい方法がありますか?パフォーマンスが向上し、セキュリティが強化され、コードや管理が容易になります。

答えて

6

OLEオートメーション手順sp_OA*を使用しないでください。それらは正式に推奨されていないようですが、SQLCLRはOLEオートメーションプロシージャと拡張ストアドプロシージャの両方を置き換えます。

はい、これはSQLCLRでも簡単に実行できます。 @ CodeCasterの回答に示されているように)WCFを使用するか、HttpWebRequest/HttpWebResponseを使用してサンプルを見つけることができます(この回答の詳細はHow to invoke webservice from SQL Server stored procedureです)。また、時には、あなたはまた、シリアル化アセンブリを追加する必要がありますのでご注意ください:Using Webservices and Xml Serialization in CLR Integration

コーディングとメンテナンス
Webサービスは、素敵なAPIを提供していますが、構造を変更する場合は、再コンパイルとで再デプロイする必要がありますこれの少なくとも一部。交換される情報が十分に単純であると仮定すると、これを標準的なWeb要求として扱うと柔軟性が増します。パラメータとURIを受け取り、適切にフォーマットされたXMLリクエストを構築してURIに送信する一般的なWebリクエスト関数(スカラーまたはTVF)を作成できます。それから、応答を取得し、単にXMLを返します。したがって、素敵なオブジェクトを取得するのではなく、XMLレスポンスを解析する必要があるため、少し責任を変えてください。しかし、XMLはSQL Serverで簡単に解析することができ、この関数を任意の数の場所で再利用できます。また、リモートサービスが更新された場合、ストアドプロシージャを更新してWebサービスに渡されるクエリ文字列を変更したり、XML応答の解析を変更したりするのは簡単なALTER PROCEDUREであり、簡単にテストできます。 SQLCLRアセンブリを再コンパイル/再デプロイする必要はありません。

セキュリティに関係なく、あなたが望む呼び出すには、主なものは、セキュリティが賢明な、怠惰なことや、@からリンクされたページにも示すように、(TRUSTWORTHY ONをオンにしないでにあるWebサービスの方法を「純粋」の
CodeCasterの答え、残念なことに、ここではほとんどの他の例がインターウェブ上にあります)。これを安全にするための適切な方法は、次の操作を行うことです。

    は、[master]データベースでは、あなたの国会
  • に署名し、あなたのアセンブリのDLLから非対称キーを作成します
  • 。また、[master]で、
  • 非対称鍵それからログインを作成
  • はあなたの新しいものではありませんUNSAFE
EXTERNAL_ACCESSPERMISSION_SETであなたのアセンブリを作成 EXTERNAL ACCESS ASSEMBLY許可
  • ログイン付与します
  • 1

    確かにcall a WCF service using SQL CLRです。

    もしあなたがそれを望まないなら、あなたはC#でWindowsサービスを書くことができます。それはwatches or polls the table for changesです。このサービスをどのように実装するかによって、新しい記録への反応はすぐに近くなります。 How to notify a windows service(c#) of a DB Table Change(sql 2005)?も読んでください。

    次に、C#からサービスコールを実行し、必要な作業を実行して結果を列に格納できます。

    交換中に取得された余分な変数などの追加情報が必要な場合は、そのテーブルを格納するための新しいテーブルと興味のある実際の結果を導入することができます。

    関連する問題