2011-08-09 7 views
0

私は委託中のMS SQL Server 2008 R2インストールを実行しています。SQL CLR - 安全/ unsafeおよびメモリの使用に関する懸念

私は、オンデマンドでテーブルの列を暗号化および復号化するアプリケーションを作成しました。これはうまくいきます。このアプリケーションは、任意のテーブルの行を処理するためにDataTableオブジェクトを使用します。 SQLにこれを統合するために、私は、DataTableオブジェクトの使用を満たすために、まず、次のアセンブリを作成することを強制してい

create assembly [system.data.datasetextensions] 
from 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll' 
with permission_set = unsafe 

問題ありません。もちろん、これは、読み取り専用とマークされていない静的フィールドを含んでいるため安全ではないと宣言しなければならないため、スレッドセーフではないため、実行から実行まで予測できません。

しかし、私はメインのCLR DLLを安全であると宣言したいと思います(明らかに署名して、GACなどを入れます)。しかし、私はコードを実行すると、私は主なCLR DLLを安全でないと宣言すれば、その醜いヘッドを上げない "範囲外のインデックス"という厄介な "インデックスを取得する"エラーが発生します。私は安全なアセンブリのためのいいえではない安全でないアセンブリにアクセスしようとしているという事実によると思いますか?

2番目のことは、このメインのCLR DLLが安全でないとして実行されていて、CLRがSQL Server/.NetでクリーンアップされていないというCLRの呼び出しが「期限切れです。私はそれを実行するとメモリ消費量が増えますが、メモリは決して解放されないようです。メモリが解放されるためにApp Domainがアンロードされるまで待つことは本当にありません!

おかげでみんな..

答えて

0

あなたはのDataTableを使用するよりも他に方法はありませんでしたか?

1)この例のように、SqlCommandを使用できますか? http://msdn.microsoft.com/en-us/library/ms131094.aspx

using System; 
using System.Data.SqlTypes; 
using System.Data.SqlClient; 
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void PriceSum(out SqlInt32 value) 
    { 
     using(SqlConnection connection = new SqlConnection("context connection=true")) 
     { 
      value = 0; 
      connection.Open(); 
      SqlCommand command = new SqlCommand("SELECT Price FROM Products", connection); 
      SqlDataReader reader = command.ExecuteReader(); 

      using (reader) 
      { 
       while(reader.Read()) 
       { 
        value += reader.GetSqlInt32(0); 
       } 
      }   
     } 
    } 
} 

2)あなたの暗号化されており、CLR機能などの書き込み可能な機能を解読しますか?なぜあなたはテーブルの値を見る必要がありますからの機能?通常のUPDATE文から値を読み込んでそれらの関数に渡すことができますか?

アセンブリがSQLに対して安全でない場合は、実行中の作業を正確に把握していない限り、推奨をバイパスするように推奨されていません。私は最初にサポートされている方法を見てアドバイスをします。

関連する問題