SQL Server の CLR プロシージャのコードを動的に変更する方法はありますか?
ビジネス ロジックを含むアセンブリが MS SQL Server 2008 R2 にデプロイされているとします。このアセンブリ (またはアセンブリ) は常に使用されています (たとえば、複数の同時クエリでテーブルの各行に対していくつかの関数を呼び出すなど)。したがって、アセンブリをドロップすることはできません。ビジネス ロジックを動的に変更する方法や、変更可能な外部コードを実行する方法はありますか?
私はすでにこれらのアプローチを検討しましたが、どれもうまくいきませんでした:
- Reflection.Emit
- モノセシル
- 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 のようなヒントは役に立ちません。