Какова цель и риски включения SQL CLR? - PullRequest
0 голосов
/ 08 июня 2018

Мы собираемся реализовать модульные тесты, используя тестовую среду tSQLt.У него есть предварительное условие, что SQL CLR должен быть включен с помощью этой команды:

EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

Мне интересно знать, какова цель SQL CLR и риски включения этого в производственной среде?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

НАЗНАЧЕНИЕ

SQLCLR позволяет делать вещи, которые либо:

  1. не могут быть выполнены в T-SQL, либо
  2. не может быть сделано так же эффективно, как в 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 для регрессионного тестирования хранилища данных

0 голосов
/ 08 июня 2018

SQLCLR позволяет создавать сборки .NET и запускать код внутри них из SQL Server.

В зависимости от разрешений на сборку риски варьируются.Риски примерно такие:

Набор разрешений: Риск SAFE Вы не можете делать ничего, кроме того, что вы можете в T-SQL.Так довольно безопасно.

EXTERNAL ACCESS Вы можете вызывать код в сборках .NET, утвержденных Microsoft, таких как ADO.NET.Довольно безопасный, но все же риск.

UNSAFE Вы можете делать практически все, что позволяет .NET Framework.В действительности, стреляйте себе в голову, если вы не знаете, что делаете.

...