Я пытаюсь развернуть сборку CLR в БД SQL Server 2017, следуя процедуре, описанной в https://sqlquantumleap.com/2017/08/09/sqlclr-vs-sql-server-2017-part-2-clr-strict-security-solution-1/. В основном, для целей тестирования я просто включаю сборку с парой функций на основе Regex:
public class TextUdf
{
[SqlFunction(Name = "RegexIsMatch", IsDeterministic = true, IsPrecise = true)]
public static SqlBoolean RegexIsMatch(SqlString text, SqlString pattern,
SqlInt32 options)
{
if (text.IsNull) return SqlBoolean.Null;
if (pattern.IsNull) pattern = "";
return Regex.IsMatch((string)text,
(string)pattern,
options.IsNull? RegexOptions.None : (RegexOptions)options.Value,
new TimeSpan(0, 0, 10))
? SqlBoolean.True
: SqlBoolean.False;
}
[SqlFunction(Name = "RegexReplace", IsDeterministic = true, IsPrecise = true)]
public static SqlString RegexReplace(SqlString text, SqlString pattern,
SqlString replacement, SqlInt32 options)
{
if (text.IsNull || pattern.IsNull) return text;
return Regex.Replace((string)text, (string)pattern,
(string)replacement,
options.IsNull ? RegexOptions.None : (RegexOptions)options.Value);
}
}
Я создал полное решение для репродукции на https://github.com/Myrmex/sqlclr. Я могу следовать всей описанной там процедуре (readme) до того момента, когда мне нужно будет назначить сертификат PFX для сборки CLR, которая будет развернута. В этот момент я получаю эту ошибку:
MSB3325: Cannot import the following key file: pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: ...
Следуя указаниям, приведенным в сообщении об ошибке, я обнаружил, что могу решить эту проблему, установив PFX с sn
, чтобы можно было вводить пароль вручную при появлении запроса (см. Невозможно импортировать файл ключа 'blah.pfx' - ошибка 'Файл ключа может быть защищен паролем' ).
После этого я мог бы скомпилировать свою сборку CLR с функциями UDF. Теперь, когда я пытаюсь установить его в тестовую базу данных (просто пустую базу данных, созданную для этой цели), через CREATE ASSEMBLY [SqlServerUdf] FROM 0x...binary stuff...
я получаю эту ошибку:
CREATE or ALTER ASSEMBLY for assembly 'SqlServerUdf' with the SAFE or EXTERNAL_ACCESS option failed because the 'clr strict security' option of sp_configure is set to 1. Microsoft recommends that you sign the assembly with a certificate or asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission. Alternatively, you can trust the assembly using sp_add_trusted_assembly.
, которая просто противоречит цели длинной процедуры, которой я должен был следовать, чтобы позволить SQL Server принимать мой CLR без потери строгой безопасности.
Очевидно, что я что-то упустил, но я не уверен во многих деталях хитрой процедуры, так что это будет сложная догадка. Может кто-нибудь подсказать, что не так с процедурой, чтобы у нас была быстрая и грязная пошаговая инструкция о том, как вставить сборку CLR в SQL Server? Эта простая задача, кажется, стала очень трудной с последней версией ...