Расширяем возможности MS SQL Server с помощью хранимых процедур CLR
База данных - Инструменты администратора БД
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Ни для кого (?) не секрет, что начиная с версии 2005 в MS SQL Server можно создавать хранимые процедуры не только на T-SQL, но и на управляемом коде. А в последних редакциях даже и на Python.
В каких сценариях это может пригодиться? Да в любых, где вам уже не хватает стандартных возможностей по манипулированию с данными, например, если вы захотите прямо в скуле "на лету" получать данные, хранящиеся в поле, соответствующее 1С-ному ХранилищуЗначений ;-)
Здесь не будет чего-то нереально сложного, среднестатистический 1с-ник сможет сам разобраться в данной теме, покопавшись в интернетах.
Не буду утомлять демагогией, приступим.
Поставим некоторую простую задачу, например, вычисление контрольной суммы, пусть будет MD5, от значения двоичных данных. (В скуле "из коробки" уже присутствует такая возможность, зато будет с чем сравнить свою поделку).
Делать сборку на управляемом коде будем на современном и мощном языке C#.
Сначала нам надо создать ключ подписи, он нам в дальнейшем пригодится. Делается это с помощью консольной утилиты "sn", входящей в состав SDK Windows:
sn.exe -k MD5CS.snk
Далее в любом текстовом редакторе необходимо создать файл, назовем его "MD5CS.cs". В нем будем писать движок нашего алгоритма:
Создадим класс, в нем статический void метод, перед методом разместим атрибут [Microsoft.SqlServer.Server.SqlProcedure], добавим требуемые пространства имен: System.Data.SqlTypes, System.Data.SqlClient, Microsoft.SqlServer.Server. Метод будет принимать и возвращать данные типа SqlBinary, но возвращать уже по ссылке. Внутри метода реализуем алгоритм вычисления MD5 хэша:
using (MD5 md5Hash = MD5.Create())
{
byte[] data = md5Hash.ComputeHash((byte[])inputData);
value = (SqlBinary)data;
}
Не забываем добавить пространство имен System.Security.Cryptography.
Сохраняем файл и компилируем его с помощью стандартного компилятора CSC от MS, добавив ранее сгенерированную подпись:
csc.exe /t:library /keyfile:MD5CS.snk /out:MD5CS.dll MD5CS.cs
На выходе получаем управляемую самоподписанную сборку MD5CS.dll, её то и будем подгружать в скуль.
Остальную работу будем делать в Management Studio.
До версии MS SQL Server 2014 (если не ошибаюсь) для разрешения использования CLR достаточно было выполнить
EXEC sp_configure 'clr enabled' , '1';
RECONFIGURE;
В MS SQL Server 2017 уже гораздо сложнее. Оставлю здесь ссылку: deploying-sql-clr-assembly-using-asymmetric-key
После включения разрешений создадим на скуле объект сборки в разделе "Программирование":
CREATE ASSEMBLY MD5CS FROM '<PATH_TO_ASSEMBLY>\MD5CS.dll'
WITH PERMISSION_SET=EXTERNAL_ACCESS
GO
Затем создадим нашу хранимку:
CREATE PROCEDURE MD5CSSUM (@binData varbinary(MAX), @md5sum varbinary(MAX) OUTPUT)
AS EXTERNAL NAME MD5CS.StoredProcedures.MD5CS;
Готово. Осталось проверить работоспособность, ну и для чистоты проделанной работы сравнить с оригиналом:
Вот такая магия )
Теперь вы знаете, как можно добавить в скуль свой функционал и рассчитать то, что раньше вычислялось на клиенте.
На всякий случай предоставляю все исходники.
Вступайте в нашу телеграмм-группу Инфостарт