Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта статья поможет устранить две различные проблемы, которые могут возникнуть при работе с объектами СРЕДЫ CLR в базе данных, перенесенной из другого экземпляра SQL Server.
Исходная версия продукта: SQL Server
Исходный номер базы знаний: 918040
Симптомы
Рассмотрим следующий сценарий. Вы отсоедините или создайте резервную копию базы данных, которая находится в экземпляре SQL Server. Экземпляр SQL Server выполняется на сервере A. Позже вы присоединяете или восстанавливаете эту базу данных к экземпляру SQL Server, работающему на сервере B. В этом сценарии могут возникнуть следующие симптомы:
При попытке запустить существующий объект среды CLR, имеющий
external_accessили небезопасный набор разрешений из базы данных, размещенной на сервере B, вы получите следующее сообщение об ошибке:Msg 10314, level 16, State 11, Line 2
Произошла ошибка в microsoft платформа .NET Framework при попытке загрузить идентификатор сборки 65536. Возможно, на сервере заканчиваются ресурсы или сборки не установлено доверие при помощи PERMISSION_SET = EXTERNAL_ACCESS или UNSAFE. Повторите запрос или обратитесь к документации за рекомендациями по решению проблем с доверием для сборок. Дополнительные сведения об этой ошибке:
System.IO.FileLoadException: не удалось загрузить файл или сборку AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null или одну из зависимостей. Произошла ошибка, связанная с безопасностью. (Исключение из HRESULT: 0x8013150A) System.IO.FileLoadException:
в System.Reflection.Assembly.nLoad(имя файла AssemblyName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) в System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark) в System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.Reflection.Assembly.Load(String assemblyString)При попытке создать новую сборку с набором
external_accessразрешений или небезопасных разрешений в той же базе данных вы получите следующее сообщение об ошибке:Сервер: Msg 10327, Level 14, State 1, Line 1
Сбой CREATE ASSEMBLY для сборки AssemblyName, так как сборка AssemblyName не авторизована для PERMISSION_SET = EXTERNAL_ACCESS. Сборка авторизована, если одно из следующих значений имеет значение true: владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY, а база данных имеет свойство DATABASE TRUSTWORTHY. или сборка подписана сертификатом или асимметричным ключом, который имеет соответствующее имя входа с разрешением EXTERNAL ACCESS ASSEMBLY.
Проблемы возникают, даже если свойство базы данных уже имеет Trustworthy значение ON.
Причина
Эта проблема возникает из-за того, что имя входа, используемое для создания базы данных на сервере A, не является экземпляром SQL Server на сервере B. Это может быть имя входа Microsoft Windows или имя входа SQL Server.
Обходное решение
Чтобы обойти эту проблему, используйте один из следующих методов.
Примечание.
Прежде чем использовать следующие методы, убедитесь, что вы включите Trustworthy свойство базы данных.
Используйте хранимую
sp_changedbownerпроцедуру, чтобы изменить владельца базы данных на sa или на доступную учетную запись на сервере B. Например, можно использовать следующую инструкцию, чтобы изменить владельца базы данных на sa:USE <DatabaseName> GO EXEC sp_changedbowner 'sa'Примечание.
В этом операторе
<DatabaseName>используется заполнитель имени базы данных, над которыми вы работаете. Измененный владелец базы данных должен иметь соответствующие разрешения для выполнения определенной задачи. Например, владелец базы данных должен иметь разрешение CREATE ASSEMBLY для создания сборки.Добавьте имя входа в экземпляр SQL Server на сервере A, который используется для создания базы данных в экземпляре SQL Server на сервере B.
Если имя входа является учетной записью домена, вы можете создать то же имя входа на сервере B. Затем предоставьте необходимые разрешения для входа в экземпляр SQL Server на сервере B.
Если имя входа является именем входа SQL Server, убедитесь, что идентификатор безопасности этого имени входа совпадает с новым именем входа SQL Server, создаваемым на экземпляре SQL Server на сервере B. Для этого укажите аргумент SID инструкции CREATE LOGIN .
Дополнительная информация
Если вы обращаетесь к объекту CLR из другой базы данных, и эта база данных имеет несоответствие идентификатора безопасности DBO, может возникнуть та же проблема.
Дополнительные сведения см. в следующем блоге: инженеры SQL Server CSS.