Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR function with ServiceReference  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Задача - забирать данные, предоставляемые клиентом, обращаясь к его Web сервису.
Задача уникальная в том смысле, что с остальных объектов мы читаем данные, подключая собственное оборудование.
Данные посредством серверной программы опроса в конечном итоге попадают в БД MS SQL.
Чтобы не плодить на сервере дополнительных программ, делаю через CLR.
Добавил в проект ServiceReference, подключился, тут же был сгенерирован код для методов, в общем все быстро и хорошо.
Сделал табличную функцию. Далее выполнены подготовительные пляски:
sp_configure 'clr enabled', 1
reconfigure
go
alter database MyDB set trustworthy on;
go

При попытке добавить сборку в SQL
create assembly WSClient
AUTHORIZATION [dbo]
from 'C:\WORK\WSClient\bin\Release\WSClient.dll'
with permission_set=external_access
go

получаю следующее сообщение:
Warning: The Microsoft .NET Framework assembly 'system.runtime.serialization, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details.
Msg 6586, Level 16, State 1, Line 1
Assembly 'System.Runtime.Serialization' could not be installed because existing policy would keep it from being used.

Насколько я понимаю, моя сборка требует system.runtime.serialization (добавляется в проект при добавлении ServiceReference), которая не нравится MS SQL. На просторах инета пишут о подобной проблеме, но решения не увидел.
среда разработки: Visual Studio 2010
версия SQL: Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
26 окт 17, 17:25    [20903476]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Matroz,

с permission_set = unsafe создает?
26 окт 17, 18:02    [20903687]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
чет я сегодня торможу:

сразу давайте
SELECT @@VERSION
SELECT * FROM sys.dm_clr_properties where name in ('directory', 'version')
26 окт 17, 18:05    [20903698]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
автор
Чтобы не плодить на сервере дополнительных программ, делаю через CLR.


Это плохая мотивация для создания UNSAFE сборок.
26 окт 17, 18:10    [20903723]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
SELECT * FROM sys.dm_clr_properties where name in ('directory', 'version')
directory C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version v4.0.30319

В проекте выбран тоже 4 фреймворк.

С unsafe сборку не создает.
26 окт 17, 18:27    [20903798]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Matroz,

ну вообщем это хреновая практика:
но вам надо тогда зарегистрировать сборку сериализации с permission_set = unsafe
create assembly [System.Runtime.Serialization] from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll'
with permission_set = unsafe
26 окт 17, 18:33    [20903821]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
Matroz,

Ну external_access... Небезопасные или external_access сложнее сопровождать, чем трехслойку в любом случае. Особенно, если это не "на коленке" в проекте базы данных от VS.
Можно включить trusworthy (забив на безопасность) или там если у вас три коннекта, работающих раз в час и пара CLR функций, тогда это терпимо.
26 окт 17, 18:37    [20903831]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
При трехслойке вы можете изолировать слой приложений на отдельном сервере и резко повышаете ремонтопригодность. Если вы _внезапно_ перейдете на другой винсервер, то ваши сборки, которые, которые смотрят в GAC сборками sys.blahblah также идут на корм рыбам и вы имеете бэкап на руках, который как новенький, только им нельзя пользоваться.
В общем, если Вам плевать, то делайте, иначе сразу конструируйте трехслойку.
26 окт 17, 18:41    [20903842]     Ответить | Цитировать Сообщить модератору
 Re: CLR function with ServiceReference  [new]
cossack5
Member

Откуда:
Сообщений: 496
Поддерживаю предыдущих участников. Сам раньше много использовали CLR (функции, процедуры, типы данных и т.д.), сказать, что мучались, ничего не сказать. Не стоит оно того. СУБД не должна заниматься не своими делами (лезть в интернет, в файловую систему и т.д.). Если уж никак, то можете посмотреть SQL# (SQLSharp), которая предоставляет кучу возможностей (чтобы не писать самому).
27 окт 17, 00:55    [20904693]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить