Вы используете многопоточность, так что да, сборка 100% должна иметь PERMISSION_SET = UNSAFE
.
Кроме того, поскольку у вас уже есть настроенный асимметричный ключ и связанный логин (спасибо за это и не с использованием TRUSTWORTHY ON
), перед установкой сборки в UNSAFE
необходимо сделать следующее:
USE [master];
GRANT UNSAFE ASSEMBLY TO [BrokcRetail];
, а затем:
USE [{db_containing_assembly_hopefully_not_master];
ALTER ASSEMBLY [PerfInsert] WITH PERMISSION_SET = UNSAFE;
или, если вы создаете логин на основе асимметричного ключа и сначала предоставляете ему разрешение UNSAFE ASSEMBLY
, тогда вы можете просто использовать UNSAFE
вместо SAFE
в операторе CREATE ASSEMBLY
.
Начиная с SQL Server 2017, вам нужно будет создать асимметричный ключ и связанный логин до создания сборки. Асимметричный ключ и логин входят в [master]
, в то время как сборка может идти в любую БД (включая [master]
, но обычно лучше не помещать туда собственный код).
Если вы уже используете SQL Server 2017или новее, и если код, показанный в вопросе, находится в фактическом порядке, в котором вы его выполняете, то я бы предположил, что вы уже установили базу данных на TRUSTWORTHY ON
или отключили «CLR строгая безопасность». В противном случае вы вообще не смогли бы создать сборку без предварительного создания имени входа на основе сигнатуры , а предоставило разрешение UNSAFE ASSEMBLY
. Если я прав в этом, вы можете снова включить «CLR строгую безопасность» и / или включить TRUSTWORTHY OFF
для этой базы данных.
Кроме того, как я отметил по вашему связанному вопросу (тот, который связан с этимвопрос), вы должны использовать SqlString
вместо SqlChars
. SqlString.Value
возвращает .NET string
, а SqlChars.Value
возвращает char[]
. Давным-давно люди связывали SqlChars
с NVARCHAR(MAX)
и SqlString
с NVARCHAR(1-4000)
, но это было связано только с тем, что Visual Studio / SSDT использовал эти сопоставления в качестве значений по умолчанию при создании DDL для публикации проекта базы данных. Но между ними никогда не было никакого технического / строкового отображения. Вы можете использовать любой тип .NET с любым типом данных T-SQL.
Также, пожалуйста, соблюдайте осторожность (и много проверяйте) при использовании многопоточности из SQLCLR.
Пожалуйста, посетите SQLCLR Info для получения дополнительных ресурсов, связанных с работой с SQLCLR в целом.
Похожие сообщения:
- System.Web в SQL ServerФункция CLR (на DBA.StackExchange)
- CREATE PROCEDURE получает «Msg 6567, уровень 16, состояние 2» для хранимой процедуры SQLCLR