SQL Server 2008: исключение при исключении функции CLR, которая пытается получить доступ к базе данных через соединение - PullRequest
0 голосов
/ 19 июля 2010

Я хочу использовать табличную функцию CLR в SQL Server 2008, которая обращается к базе данных изнутри себя. У меня есть разрешение на исключение. Я пытаюсь выполнить функцию от имени того же пользователя, под которым она была создана. Так что причина проблемы не ясна ..

Вот функция:

public partial class MyClass
    {    
        [SqlFunction(
            DataAccess = DataAccessKind.Read,
            FillRowMethodName = "Availability_FillRow",
            TableDefinition = "B0RID nchar(32)")]
        public static IEnumerable Fn_SEARCH_Availability(SqlDateTime checkin, SqlInt32 overnights)
        {
            if (checkin.IsNull || overnights.IsNull)
            {
                return null;
            }
            List<ResultRoom> roomsResultList = new List<ResultRoom>();


        using (SqlConnection conn = new SqlConnection("Data Source=MachineName;Initial Catalog=DBNANE;Integrated Security=True"))
        {
            conn.Open();
        }
        return roomsResultList;
    }
}

Вот исключение

A .NET Framework error occurred during execution of user-defined routine or aggregate "Fn_SEARCH_Availability": 
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException: 
   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.PermissionSet.Demand()
   at System.Data.Common.DbConnectionOptions.DemandPermission()
   at System.Data.SqlClient.SqlConnection.PermissionDemand()
   at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at StoredProcedures.Fn_SEARCH_Availability(SqlDateTime checkin, SqlInt32 overnights)

1 Ответ

5 голосов
/ 19 июля 2010

Возможно, попробуйте изменить оператор использования, устанавливающий соединение, на

using (SqlConnection conn = new SqlConnection("context connection=true;"))

Что говорит CLR использовать текущее соединение SQL.

Я полагаю, почему у вас не получилось, указав встроенную безопасность, он использовал бы учетные данные учетной записи службы SQL Server.

Подробнее об этом здесь

...