Каковы цель и риски включения SQL CLR?

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

EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

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

SQLCLR необходим, когда одного T-SQL недостаточно для требуемой функциональности. В случае, если tSQLt, он использует объекты CLR для обеспечения функциональности модульного тестирования, которую невозможно выполнить с помощью языка T-SQL. Включение CLR увеличивает площадь поверхности, поэтому его следует включать только тогда, когда вам это нужно. Однако не уверен, зачем вам запускать модульные тесты в продакшене. Лучше оставить его отключенным в prod и запускать модульные тесты в тестовой среде.

Dan Guzman 08.06.2018 15:15

Я полностью согласен с @DanGuzman в отношении отказа от модульного тестирования в производственной среде. Это просто похоже на проблему, которая ждет своего часа, независимо от SQLCLR.

Solomon Rutzky 08.06.2018 15:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
3 842
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

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

Как проверить значение набора разрешений?

variable 11.06.2018 11:18

Как прокомментировал @Solomon Rutzky выше, вы можете проверить значение разрешения с помощью: SELECT permission_set_desc FROM sys.assemblies WHERE name = 'some_assembly_name'.

Niels Berglund 12.06.2018 12:01
Ответ принят как подходящий

ЦЕЛЬ

SQLCLR позволяет делать то, что:

  1. невозможно сделать в T-SQL, или
  2. не может быть сделано так эффективно, как в T-SQL

Есть много вещей, которые можно сделать в обоих случаях, и для которых 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 для регрессионного тестирования хранилища данных

Как проверить значение набора разрешений?

variable 11.06.2018 11:18

Кроме того, можем ли мы считать, что DbFit можно использовать в производственной базе данных?

variable 11.06.2018 12:09
1) Вы можете проверить значения PERMISSION_SET, используя следующий запрос: SELECT * FROM sys.assemblies;. 2) DbFit «лучше» (на мой взгляд), потому что он ничего не добавляет к серверу или базе данных, которые он тестирует. ОДНАКО, вам следует никогда проводить тестирование в производственной среде, независимо от того, какой метод вы выберете.
Solomon Rutzky 11.06.2018 14:38

Другие вопросы по теме