НАЗНАЧЕНИЕ
SQLCLR позволяет делать вещи, которые либо:
- не могут быть выполнены в T-SQL, либо
- не может быть сделано так же эффективно, как в T-SQL
Есть много вещей, которые можно сделать в обоих, и для которых T-SQL на самом деле намного лучше.В этих случаях использование SQLCLR для этих целей является неуместным, поэтому лучше сначала исследовать, чтобы убедиться, что операция не может быть выполнена в T-SQL или будет медленнее.
Например,производительность, скалярные пользовательские функции T-SQL предотвращают параллельные планы выполнения.Но скалярные UDF-функции SQLCLR, если нет доступа к данным и они помечены как IsDeterministic=true
, делают , а не предотвращают параллельные планы выполнения.
Для получения дополнительной информации о том, что такое SQLCLR, инет, см. первую статью в серии Stairway to SQLCLR , которую я пишу для SQL Server Central:
Stairway to SQLCLR Уровень 1: Что такое SQLCLR?
Или, чтобы получить представление о том, что можно сделать в SQLCLR, см. Мой проект SQL #, представляющий собой библиотеку из более чем 320 хранимых процедур и функций, многие из которых находятся в бесплатной версии, имногие из которых работают в режиме SAFE
: SQLsharp.com .
РИСКИ
Риски варьируются в зависимости от PERMISSION_SET
(т.е.SAFE
, EXTERNAL_ACCESS
и UNSAFE
), на которых помечена сборка, и что делается.В сборке UNSAFE можно выполнять действия, которые нельзя выполнить в обычном T-SQL (за исключением того, что многие из этих опасных действий уже могут быть выполнены с помощью некоторых расширенных хранимых процедур, xp_cmdshell и процедур OLE Automatic - sp_OA*
),Сборка, помеченная как SAFE
, не может выйти за пределы базы данных, поэтому, как правило, вполне безопасна, НО вы все равно можете заблокировать систему с помощью регулярного выражения, которое предоставляет «катастрофический возврат» (конечно, это можно уменьшить, начиная с .NET Framework4.5, поэтому SQL Server 2012 и новее, установив максимальный лимит времени для операции RegEx).Сборка, помеченная как UNSAFE
, может записывать в статические переменные, что в контексте модели общего домена приложения, используемой SQLCLR, позволяет совместно использовать память между сеансами.Это может разрешить кэширование, но при неправильном использовании легко приводит к условиям гонки.
TESTING
Что касается tSQLt, я не верю, что вы обязаныиспользуйте компонент SQLCLR.Я думал, что видел, что это только включило некоторую расширенную функциональность.В любом случае, исходный код доступен на GitHub, так что вы можете проверить его, чтобы увидеть, что он делает.Прошло много времени с тех пор, как я посмотрел на него, но, насколько я помню, он не должен представлять большой риск для того, что он делает (особенно в среде Dev / QA).
Другой варианткоторый не использует SQLCLR - это DbFit.Я всегда предпочитал DbFit, так как он совершенно не зависит от БД.Он основан на инфраструктуре FitNesse, написанной на Java, и вы управляете тестами через страницы в стиле вики.По умолчанию он оборачивает тесты в транзакцию и откатывает все обратно после завершения теста (т. Е. Очистки).Стоит взглянуть на.
Загрузить: Проект DbFit на GitHub
Учебное пособие: Использование DbFit Framework для регрессионного тестирования хранилища данных