Мы планируем реализовать модульные тесты с использованием тестовой среды tSQLt. У него есть предварительное условие, что SQL CLR должен быть включен с помощью этой команды:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
Мне любопытно узнать, какова цель SQL CLR и риски включения этого в производственной среде?
Я полностью согласен с @DanGuzman в отношении отказа от модульного тестирования в производственной среде. Это просто похоже на проблему, которая ждет своего часа, независимо от SQLCLR.





SQLCLR позволяет создавать сборки .NET и запускать в них код из SQL Server.
В зависимости от разрешений на сборку риски различаются. Риски примерно такие:
Набор разрешений: риск
SAFE Вы не можете делать больше того, что можете в T-SQL. Так что довольно безопасно.
EXTERNAL ACCESS Вы можете вызывать код в сборках .NET, одобренных Microsoft, таких как ADO.NET. Достаточно безопасно, но все же есть риск.
UNSAFE Вы можете делать практически все, что позволяет .NET framework. На самом деле стреляйте себе в голову, если вы не знаете, что делаете.
Как проверить значение набора разрешений?
Как прокомментировал @Solomon Rutzky выше, вы можете проверить значение разрешения с помощью: SELECT permission_set_desc FROM sys.assemblies WHERE name = 'some_assembly_name'.
ЦЕЛЬ
SQLCLR позволяет делать то, что:
Есть много вещей, которые можно сделать в обоих случаях, и для которых T-SQL на самом деле лучше. В таких случаях использование SQLCLR для этих целей является нецелесообразным, поэтому лучше сначала изучить, чтобы убедиться, что операция не может быть выполнена в T-SQL или определенно будет медленнее.
Например, из-за производительности скалярные UDF-функции T-SQL препятствуют планам параллельного выполнения. Но скалярные UDF SQLCLR, пока нет доступа к данным и помечены как IsDeterministic=true, не позволяют нет предотвращать параллельные планы выполнения.
Дополнительные сведения о том, что такое SQLCLR, а что нет, см. В первой статье из серии Лестница в SQLCLR, которую я пишу для SQL Server Central:
Лестница на уровень SQLCLR 1. Что такое SQLCLR?
Или, чтобы получить представление о том, что можно сделать в SQLCLR, см. Мой проект SQL #, который представляет собой библиотеку из более чем 320 хранимых процедур и функций, многие из которых находятся в бесплатной версии, а многие из них работают в режиме SAFE. : SQLsharp.com.
РИСКИ
Риски различаются в зависимости от PERMISSION_SET (то есть SAFE, EXTERNAL_ACCESS и UNSAFE), обозначенной как Сборка, и от того, что делается. В UNSAFE Assembly можно делать то, что нельзя сделать в обычном T-SQL (за исключением того, что многие из этих опасных вещей уже можно сделать с помощью некоторых расширенных хранимых процедур, xp_cmdshell и автоматических процедур OLE - sp_OA*). Сборка, помеченная как SAFE, не может выйти за пределы базы данных, поэтому в целом вполне безопасна, НО вы все равно можете заблокировать систему с помощью регулярного выражения, которое предоставляет «катастрофический возврат» (конечно, это можно уменьшить, начиная с .NET Framework 4.5, так что SQL Server 2012 и новее, установив максимальное время для операции RegEx). Сборка, помеченная как UNSAFE, может записывать в статические переменные, что в контексте общей модели домена приложения, используемой SQLCLR, позволяет разделять память между сеансами. Это может позволить кэширование, но при неправильном использовании легко приводит к состояниям гонки.
ТЕСТИРОВАНИЕ
Что касается tSQLt, я не считаю, что вы обязаны использовать компонент SQLCLR. Мне показалось, что я увидел, что он просто включил некоторые дополнительные функции. В любом случае исходный код доступен на GitHub, так что вы можете проверить его, чтобы увидеть, что он делает. Прошло много времени с тех пор, как я смотрел на него, но, насколько я помню, он не должен представлять большого риска для того немногого, что он делает (особенно в среде Dev / QA).
Другой вариант, в котором не используется SQLCLR, - это DbFit. Я всегда отдавал предпочтение DbFit, поскольку он является полностью внешним по отношению к БД. Он основан на платформе FitNesse, написанной на Java, и вы управляете тестами через страницы в стиле вики. По умолчанию он оборачивает тесты в транзакцию и откатывает все, когда тест завершен (то есть очистка). На это стоит взглянуть.
Скачать: Проект DbFit на GitHub
Учебник: Использование DbFit Framework для регрессионного тестирования хранилища данных
Как проверить значение набора разрешений?
Кроме того, можем ли мы считать, что DbFit можно использовать в производственной базе данных?
PERMISSION_SET, используя следующий запрос: SELECT * FROM sys.assemblies;. 2) DbFit «лучше» (на мой взгляд), потому что он ничего не добавляет к серверу или базе данных, которые он тестирует. ОДНАКО, вам следует никогда проводить тестирование в производственной среде, независимо от того, какой метод вы выберете.
SQLCLR необходим, когда одного T-SQL недостаточно для требуемой функциональности. В случае, если tSQLt, он использует объекты CLR для обеспечения функциональности модульного тестирования, которую невозможно выполнить с помощью языка T-SQL. Включение CLR увеличивает площадь поверхности, поэтому его следует включать только тогда, когда вам это нужно. Однако не уверен, зачем вам запускать модульные тесты в продакшене. Лучше оставить его отключенным в prod и запускать модульные тесты в тестовой среде.