1

SQL Server の CLR プロシージャのコードを動的に変更する方法はありますか?

ビジネス ロジックを含むアセンブリが MS SQL Server 2008 R2 にデプロイされているとします。このアセンブリ (またはアセンブリ) は常に使用されています (たとえば、複数の同時クエリでテーブルの各行に対していくつかの関数を呼び出すなど)。したがって、アセンブリをドロップすることはできません。ビジネス ロジックを動的に変更する方法や、変更可能な外部コードを実行する方法はありますか?

私はすでにこれらのアプローチを検討しましたが、どれもうまくいきませんでした:

  1. Reflection.Emit
  2. モノセシル
  3. SQL Server に配置されたアセンブリへの外部アセンブリの読み込み

更新: 質問はリリース プロセスに関するものではありませんでした。GUI を介していくつかのセキュリティ ルールを動的に設定できるようにしたいと考えています。

たとえば、一部のユーザーは、アドレスのないクライアントや昨年の取引などのみを表示できる必要があります。

ルールは複雑ではありませんが、ほぼ毎日変更される可能性があり、コードに入れることはできません。ビジネス ロジックの残りの部分は、TSQL で実装されます。CLR が選択されたのは、パフォーマンスの問題 (動的 SQL が遅すぎる) のためです。

別のオプションがありました: クラスター化されたビューを生成します (WHERE セクションにルールを使用) が、十分な速さではありませんでした。

詳細:

大きなテーブル dbo.Transactions の一部を選択するコードがあるとします。

select *
from dbo.Transactions
where ... --filters from your business logic

結果をフィルタリングして許可された行を表示する場合は、インデックス付きビューを生成し、次のように結果セットと結合できます。

select *
from dbo.Transactions t
inner join dbo.vw_Transactions v
on t.id = v.id
where ... --filters from your business logic

しかし、実行計画を確認すると、ほとんどの場合、クエリ アナライザーは dbo.Transaction をフィルター処理してから vw_Transactions に結合するのではなく、最初に結合して後でフィルター処理することを決定します (これは絶対に望ましくありません)。FORCE ORDER のようなヒントは役に立ちません。

4

2 に答える 2

1

私はCLRアセンブリの専門家ではありませんが、明らかなオプションは次のとおりです。

  1. アセンブリの変更
  2. トランザクション内にアセンブリをドロップして再作成します
  3. メンテナンスウィンドウを定義して展開します

リリースプロセスに関するgbnのポイントは良いものです。手順(したがってビジネスオペレーション)が実際に24時間年中無休で実行されている場合は、おそらく、アプリケーションにパッチを適用してアップグレードするための何らかの形式のシステム冗長性と確立されたメンテナンス手順がすでにありますか?その場合は、通常のメンテナンスウィンドウに新しいコードをデプロイするだけです。

于 2011-05-20T15:22:36.517 に答える
0

算術式を動的に評価するための優れたライブラリがあります (パラメーター付き) - Flee

私の場合、.Net コードを実行する必要はありませんでした "Date > '20100101' Or Status = 2" のような式を実行するだけなので、Flee はほぼ完全に満足しています。唯一の問題は、その論理演算子が (SQL 式で使用される) SqlBoolean 型で機能しないことですが、この機能を追加することは大したことではありません。

しかし、一般的に、Sql Server host 内で動的な .Net コードを実行することは不可能のようです

于 2011-05-30T08:59:01.980 に答える