MSSQL 2012, создающий триггеры CLR для WCF

Я создал систему, которая использует триггеры CLR для подключения к серверу WCF и уведомляет об изменениях в БД. Он работает нормально на SQL Server 2008 R2. Теперь я пытаюсь выполнить миграцию на SQL Server 2012. Для использования WCF мне нужно загрузить сборку SMDiagnostics.dll вместе с другими. Ive проверил, что clr включен в db, и настроен на то, чтобы быть "on", отключить отладку WCF WCF, и проверял, что SQL-сервер работает под учетной записью Local System, поэтому проблем с разрешениями нет. Теперь моя проблема в том, что когда я запускаю следующую команду

IF  NOT EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'SMdiagnostics')
create assembly [SMdiagnostics]
from  'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication        Foundation\SMdiagnostics.dll'
with permission_set = unsafe
go

i получает следующую ошибку

Предупреждение: smdiagnostics сборки Microsoft.NET Framework, version = 3.0.0.0, culture = neutral, publickeytoken = b77a5c561934e089, processorarchitecture = MSIL. вы регистрируетесь не полностью протестированы в среде размещения SQL Server и не поддерживается. в будущее, если вы обновляете или обслуживаете эту сборку или .NET Framework, ваша программа интеграции CLR может перестать работать. Пожалуйста, обратитесь к SQL Server Books Online для более подробной информации. Msg 6586, уровень 16, состояние 1, строка 2 Сборка "SMdiagnostics" не может быть установлена, поскольку существующие политика не позволит использовать его.

SMdiagnostics.dll существует по указанному пути. Поскольку я понимаю ее какую-то политику на SQL-сервере 2012 или в GAC, однако я не могу найти политики SMdiagnostics. Есть идеи, как их решить? Спасибо.

Ответ 1

Мы представили проблему с Microsoft месяц назад по той же проблеме. Мое предположение: вы не можете загрузить System.IdentityModel.dll, который является зависимостью сборки System.ServiceModel. Microsoft указала нам, что, хотя это работало в SQL 2005 и SQL 2008, это известная ошибка в SQL 2012, и они не собираются исправлять ее до SQL 2014.

Тот факт, что это еще не стало широко известным, является для меня неожиданностью, кроме того, что 2012 год все еще очень новый. Но это означает, что вы не можете использовать то, что я бы сказал, это лучшая практика Microsoft. Технология Interprocess Communication в SQL CLR (WCF), обратите внимание, что удаленное выполнение .NET не будет также потому, что оно также использует сборку ServiceModel.

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

Я очень недоволен этим и надеюсь, что другие, повышающие свой голос, укажут, что это настоящая проблема, и ее следует считать неприемлемой.

Ответ 2

Натан Шонэк. Да, http://support.microsoft.com/kb/2742595 устранить проблему с System.IdentityModel.dll но с System.Data.Services.dll я все еще получаю сообщение об ошибке: CREATE ASSEMBLY для сборки "System.Data.Services" не удалось, потому что сборка "microsoft.visualbasic.activities.compiler" неверна или не является чистой сборкой .NET. Неподтверждаемый заголовок PE/родной заглушка. Thanx.

Ответ 3

SQL 2012 перешел на фреймворк версии 4.0.30319. Таким образом, по умолчанию вы не сможете загружать сборки из старых фреймворков.

Подробнее см. поток MSDN.

К сожалению, также нельзя загрузить сборку System.ServiceModel из фреймворческой версии 4, поскольку она зависит от Microsoft.VisualBasic.Activities.Compiler, который не является чистой сборкой .NET.

Script:

CREATE ASSEMBLY [System.ServiceModel]
AUTHORIZATION [dbo]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.dll'
WITH PERMISSION_SET = UNSAFE;

Я всегда получаю следующую ошибку:

Msg 6544, Level 16, State 1, Line 1
CREATE ASSEMBLY for assembly 'Microsoft.VisualBasic.Activities.Compiler' failed because assembly 'Microsoft.VisualBasic.Activities.Compiler' is malformed or not a pure .NET assembly. 
Unverifiable PE Header/native stub.

Ответ 4

Проблема с сбоем CREATE ASSEMBLY для System.IdentityModel.dll для версии .NET Framework 4.0 в SQL Server 2012 была устранена исправлением безопасности, недавно выпущенным командой .NET.

MS13-004: Описание обновления безопасности для .NET Framework 4 в Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 и Windows Server 2008 R2: 8 января 2013 г. http://support.microsoft.com/kb/2742595

Мое тестирование показало, что нет проблемы с CREATE ASSEMBLY с сборкой .NET 4.5 System.IdentityModel.dll в SQL Server 2012.

Натан Шонэк Технический руководитель технической поддержки SQL