Подтвердить что ты не робот

Как предоставить владельцу базы данных (DBO) разрешение EXTERNAL ACCESS ASSEMBLY?

Когда я пытаюсь создать сборку в SQL 2008 из .NET сборки (.Net 3.5), я получаю следующую ошибку: ошибка говорит о том, что я должен установить любое из следующих свойств как true, как я могу это сделать?

Владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY как ИСТИНА

В базе данных есть свойство базы данных TRUSTWORTHY на

Сборка подписывается сертификатом или асимметричным ключом, который имеет соответствующий логин с разрешением ВНЕШНЕГО ДОСТУПА.

Полная ошибка ниже,

CREATE ASSEMBLY для сборки "SQLLogger" не удалось, поскольку сборка "SQLLogger" не разрешена для PERMISSION_SET = EXTERNAL_ACCESS. Сборка разрешена, если выполняется одно из следующих условий: владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY, а база данных имеет свойство базы данных TRUSTWORTHY; или сборка подписывается сертификатом или асимметричным ключом, который имеет соответствующий логин с разрешением ВНЕШНЕГО ДОСТУПА.

Спасибо заранее!

4b9b3361

Ответ 1

Вы должны установить эти параметры в файле проекта! Когда вы щелкните правой кнопкой мыши на своем проекте, нажмите "Параметры базы данных" в конфигурации проекта и выберите вкладку "Разное". Вы должны увидеть нечто похожее на то, что у меня есть: Project Settings

Это тот же вопрос, что и: Ошибка при запуске CLR Stored Proc

Ответ 2

Это сработало для меня:

EXEC sp_changedbowner 'sa'
ALTER DATABASE [dbase] SET trustworthy ON

и я также сделал это:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

Ответ 3

Не устанавливайте TRUSTWORTHY ON, если это абсолютно необходимо! И это должно быть "необходимо" при загрузке сборки, которую вы не строили, и не можете повторно подписывать. И это происходит в основном при загрузке библиотек .NET Framework, которые не поддерживаются и, следовательно, еще не находятся в узле CLR SQL Server. Вне этих обстоятельств вы не должны устанавливать базу данных на TRUSTWORTHY ON, поскольку она открывает отверстие для безопасности.

Вместо этого гораздо лучше сделать следующее:

USE [master];

CREATE ASYMMETRIC KEY [SomeKey]
  AUTHORIZATION [dbo]
  FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';

CREATE LOGIN [SomeLogin]
  FROM ASYMMETRIC KEY [SomeKey];

GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"

Вышеизложенное нужно выполнить только один раз за экземпляр, за ключ. Поэтому, если вы используете один и тот же файл snk/pfx для всех своих сборок, то приведенные выше шаги должны выполняться только один раз на экземпляр SQL Server; количество Ассамблей и баз данных, содержащих эти сборки, не имеет значения.

Этот подход позволяет сохранять лучшую безопасность в базе данных (сохраняя TRUSTWORTHY на OFF) и позволяя более детально контролировать, какие сборки даже разрешено устанавливать на EXTERNAL_ACCESS и/или UNSAFE (поскольку вы можете разделить с помощью разных ключей для подписания и входа на основе этих разных ключей).

Однако, если вы должны использовать метод TRUSTWORTHY ON, то владельцу базы данных не нужно быть sa. Требование состоит лишь в том, что Login, зарегистрированный как владелец базы данных, был предоставлен либо EXTERNAL ACCESS ASSEMBLY, либо UNSAFE ASSEMBLY (те же два разрешения, которые были указаны выше для входа в асимметричный ключ).

Для более подробного ознакомления с параметрами безопасности см. следующую статью, которую я написал в SQL Server Central: Stairway to SQLCLR Level 4: Безопасность (ВНЕШНИЕ И НЕСОВЕРШЕННЫЕ АСПЕКТЫ) (требуется бесплатная регистрация).


Подробную информацию о том, как автоматизировать это с помощью Visual Studio/SSDT, можно найти в следующих трех статьях (серия из трех частей), а также в SQL Server Central:

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

UPDATE

В SQL Server 2017 появилось новое осложнение в виде опции конфигурации на уровне сервера с надписью "CLR strict security". Он включен по умолчанию и требует, чтобы ВСЕ АССИСТИКИ, даже те, что помечены как SAFE, были подписаны с сертификатом или асимметричным ключом, имели связанный Логин и что у входа есть разрешение UNSAFE ASSEMBLY (недостаточно для предоставления EXTERNAL ACCESS ASSEMBLY). Пожалуйста, см. Мой ответ на следующий S.O. вопрос для получения дополнительной информации об этой новой "функции":

CLR Strict Security на SQL Server 2017

Ответ 4

Следующий код работал у меня для интегрированной безопасности:

ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO

ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO

Ответ 5

Вот как мне удалось заставить его работать:

ALTER DATABASE databasename SET trustworthy ON

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

/
DROP ASSEMBLY assemblyname

GO


CREATE ASSEMBLY assemblyname
FROM 0x4D5A9000.....
WITH PERMISSION_SET = EXTERNAL_ACCESS

Ответ 6

Это работает для обновления Visual Studio 2015 Update 2.

В настройках вашего проекта выберите "Внешний доступ":

введите описание изображения здесь

При публикации сообщения об ошибке сообщают, что он не может принять "EXTERNAL_ACCESS", если сборка не установлена ​​на "Trustworthy".

Итак, в настройках проекта установите для сборки значение "Trustworthy":

введите описание изображения здесь

Это означало, что я смог запустить образцовую пользовательскую функцию, которая перечисляла файлы на локальном жестком диске.

Если защита по-прежнему слишком ограничительна, добавьте атрибут DataAccess = DataAccessKind.Read в ваш UDF, например:

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]

Обновление 2017-07-02

В SQL Server 2016 + Visual Studio 2015 вам также может потребоваться следующее:

  • use master;grant unsafe assembly to [Domain\Username];
  • Запустите любые программы (например, Visual Studio или любые утилиты С#) в режиме Administrator, чтобы предоставить им достаточные разрешения для публикации ассемблеров UNSAFE.

Если ничего не работает, попробуйте подключиться с помощью имени пользователя sa и пароля администратора. Это всегда будет работать независимо от того, выполняется ли Visual Studio в режиме Administrator или нет.

Ответ 7

эта единственная строка решает проблему для меня

use master;
grant external access assembly to [domain\username]