2016-04-05 7 views
0

RPC SELECTステートメント全体のクエリテキストを、呼び出したビューから取得することは可能ですか? SQL Server 2014でエンタープライズデータベースを開発しています。これは、外部WHERE句が重要な複雑なSELECTステートメントを提出する商用アプリケーションをサポートする必要があります。このステートメントには、そのオブジェクトを含んでいない同じオブジェクト(私の場合はビュー)に対するサブクエリも含まれています。これは、呼び出し側のアプリケーションが別のフィールドのフィルタ結果にこれらのサブクエリを結合し、エラーを他の場所に投げるIDの複製を生成するため、大きな問題を引き起こします。実行中にクエリプランを取得する方法

呼び出し元のアプリケーションでは、ビュー(ビューではない)がクエリされているものとみなされ、単純なWHERE句を使用するようにのみ構成できます。私の仕事は、これほど素朴なアプリケーションの背後にあるより洗練されたセキュリティモデルを実装することです。問題のクエリを書き直すことはできませんが、キャッシュされたクエリプランから欠落している情報を取得することを望んでいました。ここに私の提案されたソリューションの超単純化疑似ビューです:

CREATE VIEW schema.important_data AS 
WITH a AS (SELECT special_function() AS condition), 
    b AS (SELECT c.criteria 
      FROM a, lookup_table AS c 
      WHERE a.condition IS NULL OR c.criteria = a.condition) 
SELECT d.field_1, d.field_2, d.filter_field 
FROM b, underlying_table AS d 
WHERE d.filter_field = b.criteria; 

私の「特殊機能」には、RPCのためのクエリプランを読み込んでWHERE条件を抽出し、それは常にものだけそれが必要を返すように、先制ビューをフィルタリング。残念ながら、クエリが実行された後にの後にまでキャッシュされていないようです。 RPCが数回行われた場合、私のソリューションは完全に動作しますが、2回目以降の呼び出しでのみ機能します。

私は現在、SPID、計画作成時間や特定の単語で検索してRPCの全文を取得するためにdm_exec_cached_plansdm_exec_query_stats dm_exec_sql_text を使用しています。現在実行中のプランを何とか得ることができれば、ずっと良いでしょう。私はdm_exec_requestsを信じていますが、現在のステートメントを返します。これは私の関数の単なる定義です。

拡張イベントは有望そうだが見慣れないものであり、消化するには多くのものがあります。リアルタイムで通知を受け取ることができるかどうか、またはイベントセッションが常に実行されていることを確認する方法について、この特定の課題に適しているかどうかについてのガイダンスは見つかりませんでした。私はこの調査を今追求しており、いかなる示唆やアドバイスも感謝しています。私にできることはほかにありますか?

答えて

0

これは永遠の考えではないことが分かりました。私は、ビュー自体を再構築することで、あまりエレガントな回避策を考案しました。パフォーマンス上のペナルティがありますが、ダウンストリームエラーは回避されます。私の根本的な問題は、クライアントアプリケーションがSQL文を生成する方法であり、私はそれについて何もしていません。

関連する問題