четверг, 26 июля 2012 г.

MS SQL Server CLR и разрешения System.WEB

Продолжая предыдущий пост... Есть желание отправлять web запрос из хранимой процедуры. Естественно привязал сборку, примерно, с содержанием такого кода:
        [Microsoft.SqlServer.Server.SqlProcedure]
        public static SqlInt32 SendMessage(SqlString provider,  SqlString mess)
        {
            try {
           
           
            WebRequest reqGET = WebRequest.Create(mess.ToString());
            WebResponse resp = reqGET.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(stream);
            sr.ReadToEnd();
          
            return 1;
            }
             catch(Exception ex){
                              }

           
            return 0;
        }

Все компилируется на ура, привязывается, но вот при вызове хранимой процедуры валится ошибка "Сбой при запросе разрешения типа "System.Net.WebPermission..."(Request for the permission of type 'System.Net.WebPermission, System...).
Как лечится:
1. Добавляем атрибут к функции [WebPermission(System.Security.Permissions.SecurityAction.Demand, ConnectPattern = @"*")]
2. Привязываем сборку с разрешением EXTERNAL_ACCESS, как то так:
CREATE ASSEMBLY hwsql
FROM 'C:\massembly\hwsql.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
В этом случае может возникнуть косячёк The assembly is authorized when either of the following is true: the database owner (DBO) has EXTERNAL ACCESS ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with EXTERNAL ACCESS ASSEMBLY permission.
Тут возможны варианты, но по простому нужно чтобы хозяин базы на которой создаете ассембли был аналогичен хозяину базы мастер. Ну или дайте хозяину базы на которой создаёте EXTERNAL ACCESS ASSEMBLY

использовано: это