SQL CLR - вопросы безопасности / небезопасности и использования памяти - PullRequest
0 голосов
/ 09 августа 2011

Я использую установку MS SQL Server 2008 R2, которая находится в процессе ввода в эксплуатацию.

Я написал приложение, которое шифрует и дешифрует столбцы в таблицах по требованию, и это прекрасно работает.Это приложение использует объект 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

Нет проблем;конечно, я должен объявить это как небезопасный, так как он содержит статическое поле, не помеченное только для чтения, поэтому оно не является потокобезопасным, поэтому непредсказуемым от выполнения к выполнению.быть безопасным (очевидно, подписав, введя в GAC и т. д.) и не может делать этого без проблем.Однако, когда я запускаю код, я получаю неприятную ошибку 'index out of range', которая не поднимает уродливую голову, если я объявлю свою основную библиотеку CLR DLL также небезопасной.Я предполагаю, что это связано с тем, что я пытаюсь получить доступ к небезопасной сборке, что является нет для безопасных сборок ???

Во-вторых, если эта основная библиотека CLR работает как небезопасная,«истекшие» вызовы CLR для этого не очищены SQL Server / .Net ???Потребление памяти увеличивается, когда я запускаю его, но память никогда не освобождается;Я действительно не хочу ждать, пока домен приложения не будет выгружен, чтобы освободить память !!

Спасибо вам, ребята ..

1 Ответ

0 голосов
/ 09 июня 2012

Вы уверены, что не было другого способа, кроме использования 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, не рекомендуется обойти рекомендацию, если вы точно не знаететы делаешь.Я бы посоветовал сначала посмотреть на поддерживаемые способы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...