Расширения языка Java для SQL Server с открытым исходным кодом


Расширения языка — это способ SQL Server вызывать Java-программы из T/SQL, и это очень полезно.

SQL Server в течение длительного времени был интегрирован с общеязыковой средой выполнения, в рамках которой он мог взаимодействовать с общими языками программирования .NET framework, позволяющая писать хранимые процедуры, триггеры, пользовательские типы, пользовательские функции, пользовательские агрегаты и потоковые функции с табличными значениями, используя такие функции, как Visual Basic .NET или C#.

Но это глубокая интеграция. Для остальных языков, а не для части .NET framework, SQL Server все еще может взаимодействовать с ними на минимальном уровне с помощью так называемых языковых расширений SDK, в настоящее время это просто программы, написанные на Java.

Поддержка Java была добавлена с помощью пакета SDK Microsoft Extensibility для Java в составе SQL Server 2019 Release Candidate 1 как в Windows, так и в Linux.

По умолчанию используется среда выполнения Java-это открытая JRE Zulu от Azul, но вы также можете использовать другую Java JRE или SDK. Однако есть веские причины выбрать среду выполнения Zulu Java. Чтобы обойти ловушки лицензирования Oracle в отношении Java, Microsoft в партнерстве с Azul предоставила корпоративное распространение Java бесплатно и, самое главное, с поддержкой, предоставляемой как Microsoft, так и Azul.

Чтобы заставить его работать, вы просто компилируете свой класс как library/.jar, и напишите хранимую процедуру T-SQL, которая вызывает другую, sp_execute_external_script, которая, наконец, вызывает библиотеку Java как «package.class».

Существует подробное официальное руководство по написанию класса Java, который проверяет набор строк, переданных из SQL Server, на соответствие регулярному выражению. Более подробно мы напишем хранимую процедуру, которая принимает входной набор данных и регулярное выражение. Эта процедура выполняет sp_execute_external_script с этими входными данными, что, в свою очередь, вызывает нашу библиотеку regex.jar чтобы вернуть строки, которые выполнили данное регулярное выражение. Он использует регулярное выражение [Jj], которое проверяет, содержит ли текст слово Java или java.

СОЗДАЙТЕ ИЛИ ИЗМЕНИТЕ ПРОЦЕДУРУ [dbo].[java_regex] @expr nvarchar(200), @query nvarchar(400)ASBEGIN—Вызовите программу Java, указав имя пакета.className в @script—Метод, вызываемый в коде Java, всегда является «execute» methodEXEC sp_execute_external_script @language = N’Java’, @script = N’pkg.RegexSample’, @input_data_1 = @query, @params = N’@regexExpr nvarchar(200)’, @regexExpr = @exprwith результирующие наборы ((ID int, text nvarchar(100)));ENDGO

—Теперь выполните описанную выше хранимую процедуру и предоставьте регулярное выражение и входной queryEXECUTE [dbo].[java_regex] N'[Jj]ava’, N’SELECT id, текст ИЗ testdata’GO

Эта расширяемость имеет большое значение — вы можете использовать ее во всех сценариях, таких как прямой вызов API REST из SQL server. Другими словами, вам не нужно будет писать программу Java, которая взаимодействует с базой данных через JDBC, чтобы получить данные, которые затем используются для вызова службы RESTful, чтобы вернуть некоторые возвращаемые значения. Вы даже можете работать с JSON, так как SQL Server поддерживает обработку JSON по своей сути. Таким образом, из вашего T-SQL вы просто напрямую вызываете программу Java, которая взаимодействует с API.

С точки зрения безопасности также важно отметить, что программа Java будет выполняться в контексте запроса SQL Server, поскольку там также применяются те же меры защиты от песочницы SQL Server.

Последняя новость заключается в том, что Microsoft сделала еще один шаг вперед и открыла это расширение языка Java с открытым исходным кодом, чтобы мотивировать сообщество с открытым исходным кодом внести свой вклад в проект.

Таким образом, несмотря на отсутствие тесной интеграции с внутренностями SQL Server через CLR, языковые расширения оказываются чрезвычайно ценными. СУБД прошли долгий путь интеграции расширенных функций, найденных в общих языках программирования или библиотеках, но не могут делать все. Мы видели такой пример в «Техническом предварительном просмотре Ingres 11», когда освещали новости о новой версии почтенной СУБД Actian.

Поэтому в этой версии были добавлены такие вещи,как MD5SUM,SHA1SUM, симметричное шифрование AES для BLOB-объектов.Также строковые функции, такие как DMETAPHONE(c1), который возвращает код метафоны из строки varchar с использованием алгоритма двойного метафона, JARO_WINKLER(c1 c2), который вычисляет расстояние jaro_winkler между двумя строками VARCHAR, LEVENSHTEIN(c1 c1), который вычисляет расстояние Левенштейна между двумя строками VARCHAR (то есть минимальное количество изменений, которые необходимо внести, чтобы преобразовать исходную строку в целевую строку), Daitch-Mokotoff SOUNDEX_DM или SOUNDEX_NYSIS, который возвращает код NYSIS Soundex из строки.

Также дополнения на фронте регулярных расширений, поддерживая шаблоны с ПОХОЖИМИ, ПОХОЖИМИ, НАЧИНАЮЩИМИСЯ, ЗАКАНЧИВАЮЩИМИСЯ.

Например, BEGINNING возвращает подстроку из строки, которая начинается с первого вхождения шаблона, а ENDING возвращает подстроку из строки, которая заканчивается последним вхождением шаблона:

ВЫБЕРИТЕ ПОДСТРОКУ(‘Company 2016’ НАЧАЛО ‘test’) //возвращает NULL

ВЫБЕРИТЕ ПОДСТРОКУ(‘Company 2016’ НАЧАЛО ‘pan\|20’ESCAPE ‘\’) //возвращает ‘pany 2016’

ВЫБЕРИТЕ ПОДСТРОКУ(‘Company 2016’ НАЧАЛО ’20\|pan’ESCAPE ‘\’)//возвращает ‘2016’

ВЫБЕРИТЕ ПОДСТРОКУ(‘Company 2016’ НАЧАЛО ’20\|pan’ESCAPE ‘\’)//возвращает ‘2016’

LIKE и ПОДОБНОЕ, ЧТОБЫ вернуть подстроку из строки, которая лучше всего соответствует шаблону:

ВЫБЕРИТЕ ПОДСТРОКУ(‘Company 2016’, НАПРИМЕР ‘Company \»%\»‘ ESCAPE ‘\’) //возвращает ‘2016’

ВЫБЕРИТЕ ПОДСТРОКУ(«Компания 2016» АНАЛОГИЧНО ‘% \»[0-9]{4}\»‘ESCAPE’\’)//возвращает ‘2016’

ВЫБЕРИТЕ ПОДСТРОКУ(‘217 Bath Road, Slough, Berkshire, SL1 4AA, UK’ АНАЛОГИЧНО ‘%\»[A-Z]{1,2}[0-9]{1,2} [0-9][A-Z]{2}\»%’ ESCAPE ‘\’)//возвращает ‘SL1 4AA’

Дело в том, что даже с такими замечательными дополнениями, как эти, которые очень приветствуются и значительно улучшают продукт, все еще существует ограничение в функциональности. Поэтому очень желательно вызывать внешние библиотеки, которые могут сделать это лучше.

Теперь есть мысль — а как насчет сообщества OSS, добавляющего расширение языка, которое вызывает Perl, чтобы использовать его расширенную функциональность регулярных выражений?


Добавить комментарий