2009-08-16 16 views
4

SQL Serverに統合されたアセンブリを作成し、C#で記述されたストアドプロシージャを提供しました。アセンブリには、一部の構成データを保持する読み取り専用静的変数があります。このデータは、アセンブリによって提供されるストアドプロシージャを使用して操作されます。明らかに、この静的変数へのアクセスを同期させる必要があります。私は使用しようとしましたSQL Serverの静的変数へのアクセスを同期するSQLCLR

lock(someGuard) 
{ 
    // ... access static configuration 
} 

私の構成クラス内に。しかし、アセンブリを完全に信頼して実行しなければならないというHostProtectionExceptionが発生しました。それを行う良い方法はありますか?

答えて

7

実際には文書化されていないハックがあります。CompilerGenerated属性でクラスを飾ります。ドキュメント化されていない回避策と同様に、マイルは将来のリリースによって異なる場合があります。

スタティックが読み取り専用の場合は、読み取り専用として宣言でき、アセンブリは安全なアセンブリを受け入れ、安全なアセンブリで受け入れられます。本当に読書だけですが、ロックガードも不要です。

読み取り専用としてマークを付けることができない場合は、読み取り専用ではないことを意味し、あなたは砂場を移動することになります。 SQLワーカーをブロックし、予測できない結果をもたらすことがあります(UNSAFE要件)。 CompilerGeneratedのトリックは、実際にlotのケア、onylと完全に理解している場合は使用する必要があります。 lockが必要であるという事実は、コードが実際にはSQLと静的に安全でないことを示す強力な指標です。

+0

クールチップ、レムス! – RBarryYoung

+0

*技術的に*文書化されているようですが。 :-)おそらくこの使用のためにサポートされていません。 – RBarryYoung

+0

はい、「この属性により、SQLサーバはコンパイラが生成した静的値を参照できます。 AFAIKこれはこの属性の唯一の用途です。 –

2

この制限を回避する唯一の方法は、UNSAFEとしてアセンブリを展開することです。 複数の呼び出しや共有渡って開催された

、SQL Serverのマネージコード のためのプログラミングモデルが必要とする機能、 手順、および 状態の使用を必要としないタイプ:それでも、静的な共有データは、勧告に反しています複数のユーザーセッションにわたって という状態が発生します。 さらに、先に説明したように、 共有状態が存在すると、 アプリケーションの アプリケーションに影響を与える重大な例外が発生する可能性があります。

これらの点を考慮すると、SQL Server は、静的変数 と静的データメンバーの使用を許可しません。 SAFEと 外部アクセスのアセンブリの場合、SQL Serverの は、組み立て時間をCREATEのアセンブリ のメタデータを調べ、それ は、静的データメンバ と変数の使用を発見した場合、このようなアセンブリの 作成が失敗しました。

関連する問題