Java ausführen mit SQL Server 2019

Dank der Spracherweiterungen (engl. Language Extensions) des SQL Servers 2019 ist es möglich, externe Programme über den SQL Server ausführen zu lassen. In einem unserer vorherigen Artikel (hier) haben wir bereits beschrieben was Spracherweiterungen sind und was sie für den Umgang mit SQL Server 2019 bedeuten. Im folgenden Artikel betrachten wir die zu treffenden Vorkehrungen um mit Hilfe einer solchen Spracherweiterung und Java ein simples “Hello World!”-Programm auf dem SQL Server auszuführen.

Die zu dieser Anleitung gehörigen Quelldateien sind auch auf unserer Github-Seite zu finden.

Voraussetzung:

Um die Spracherweiterung auf dem SQL Server nutzen zu können wird eine Installation der Version SQL Server 2019 oder neuer benötigt.

Achtung: Spracherweiterungen können nicht auf einem Domain Controller installiert werden.

Um eine Java-Anwendung mit Hilfe der Spracherweiterungen nutzen zu können, wird entweder ein JRE (Java Runtime Environment, also eine Java Laufzeitumgebung) oder ein JDK (Java Development Kit, also eine Java Entwicklungspacket) benötigt. Für unerfahrene Benutzer empfiehlt es sich das mit SQL Server 2019 standardmäßig installierte Zulu Open JRE Version 11.0.3 zu verwenden.

Installation:

Um die Spracherweiterungen zu installieren, müssen folgende Schritte befolgt werden:

  • Das SQL Server 2019 Setup muss ausgeführt werden.
  • Es muss auf der linken Seite des Fensters der Menüpunkt Installation ausgewählt werden.
  • Es muss im folgend erscheinenden Fenster der oberste Menüpunkt New SQL Server stand-alone installation or add features to an existing installation.
  • Ein neues Fenster erscheint.
  • Auf der Menü-Seite Installation Type kann die Art der Installation bestimmt werden. Um einer existierenden Installation die Spracherweiterung hinzuzufügen, muss Add features to an existing instance of SQL Server 2019 ausgewählt und anschließend im ausklappbaren Menü darunter die existierende SQL Server Instanz angegeben werden.
  • Auf der Menü-Seite Feature Selection muss der Menüpunkt Machine Learning Services and Language Extension ausgewählt werden. Darunter kann jeweils R, Python und/oder Java zur Installation gewählt werden. Achtung: soll ein externes JRE/JDK genutzt werden, darf der Punkt Java nicht ausgewählt werden.
  • Falls im vorherigen Menü der Punkt Java zur Installation gewählt wurde, muss auf der Menü-Seite Java Install Location das angegebene Verzeichnis bestätigt oder ein eigenes gewählt werden.
  • Nachdem die Installation erfolgreich abgeschlossen wurde, muss das System neu gestartet werden.

JRE_HOME definieren:

Um die Position der Java Executable im Dateisystem allgemein zu definieren, werden sogenannte Umgebungsvariablen genutzt. Um dem SQL Server den Zugriff auf Java zu ermöglichen, muss eine solche Umgebungsvariable mit dem namen JRE_HOME erstellt werden.

  • Es muss der Pfad des installierten JRE gefunden werden. Im Falle einer Standardmäßigen Installation lautet dieser wie folgt:
    <pre class=”lang-sql prettyprint prettyprinted”><code>C:\Programme\Microsoft SQL Server\MSSQL15.MSSQLSERVER\AZUL-OpenJDK-JRE\</code></pre>
  • Es muss Systemumgebungsvariablen bearbeiten (beispielsweise über die Windows Suche) geöffnet werden.
  • Es muss mit einem Klick auf den Knopf Umgebungsvariablen… ein neues Fenster geöffnet werden.
  • Im neuen Fenster muss unter der Auflistung der Systemvariablen eine neue Variable mit dem Knopf Neu… angelegt werden.
  • Als Name der Variablen muss JRE_HOME und als Wert der Variablen der zuvor gefundene Pfad zum Verzeichnis der Java Installation (also C:\Programme\Mircosoft SQL Server\mSSQL15.MSSQLServer\AZUL-OPENJDK-JRE\) angegeben werden.
  • Mit einem Klick auf Ok wird die neue Variable erzeugt.
  • Um die Änderungen auch auf der SQL Server Instanz zu übernehmen, muss diese neu gestartet werden.

Konfiguration der SQL Server Instanz

Um externe Programme über den SQL Server auszuführen, muss die Instanz dafür konfiguriert werden, da dies aus Sicherheitsgründen standardmäßig nicht eingeschaltet ist.

  • Es muss SSMS (SQL Server Management Studio) oder ein vergleichbarer DB Manager geöffnet werden.
  • Es muss eine neue Abfrage gestartet und die Anweisung ausgeführt werden.
EXEC sp_configure 'external scripts enabled', 1 
RECONFIGURE WITH OVERRIDE
  • Die SQL Server Instanz muss anschließend neu gestartet werden.

Registrieren einer externen Sprache

Um Java als eine externe Sprache auf der Instanz zu registrieren, muss folgende Anweisung in einem neuen Abfrage-Fenster ausgeführt werden:

CREATE EXTERNAL LANGUAGE Java
FROM (CONTENT = N'path-to-zip', FILE_NAME = 'javaextension.dll');
GO

Hierbei muss jedoch path-to-zip durch den vollständigen Pfad der Datei java-lang-extension.zip ersetzt werden. Diese Datei ist standardmäßig in dem folgenden Verzeichnis zu finden: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn

Erstellen der Java .jar executable

Als nächstes muss eine .jar Datei, also eine Java executable, erstellt werden um anschließend als Bibliothek im SQL Server registriert zu werden. Der folgende Java Code ist ein Beispiel für ein simples “Hello World”-Programm, welches nach seiner Ausführung eine Ergebnismenge mit dem Inhalt “Hello World” zurück gibt:

package pkg;

import com.microsoft.sqlserver.javalangextension.PrimitiveDataset;
import com.microsoft.sqlserver.javalangextension.AbstractSqlServerExtensionExecutor;

import java.sql.Types;
import java.util.LinkedHashMap;

public class HelloWorld extends AbstractSqlServerExtensionExecutor {

    public HelloWorld() {
        executorExtensionVersion = SQLSERVER_JAVA_LANG_EXTENSION_V1;
        executorInputDatasetClassName = PrimitiveDataset.class.getName();
        executorOutputDatasetClassName = PrimitiveDataset.class.getName();
    }

    public PrimitiveDataset execute(PrimitiveDataset input, LinkedHashMap<String, Object> params) {
        // Construct the output dataset
        PrimitiveDataset output = new PrimitiveDataset();
        output.addColumnMetadata(0, "Text", Types.NVARCHAR, 0, 0);
        output.addStringColumn(0, new String[]{"Hello World!"});
        return output;
    }
}

Um aus diesem Quelltext eine .jar Datei zu erzeugen, kann die Datei entweder mit der Anweisung javac über die Kommando-Zeile übersetzt und anschließend mit jar in eine .jar Datei konvertiert werden, oder es kann ein IDE (wie beispielsweise IntelliJ von NetBeans) verwendet werden.

Externe Bibliotheken erstellen

Um die zuvor erzeugte .jar Datei im SQL Server nutzen zu können, muss diese noch registriert werden. Dies geschieht durch das Anlegen einer externen Bibliothek auf der SQL Server Instanz. Hierbei ist zu beachten, dass nicht nur für unser Programm, sondern auch für alle seine Abhängigkeiten eine Bibliothek angelegt werden muss. Dies geschieht wie folgt:

  • Es muss das SQL Server Management Studio geöffnet werden.
  • Es muss ein neues Abfrage-Fenster geöffnet werden.
  • Es muss folgende Abfrage eingegeben und ausgeführt werden:
CREATE EXTERNAL LIBRARY sdk 
FROM (CONTENT = 'path-to-jar') WITH (LANGUAGE = 'Java'); 
GO

Hierbei muss jedoch path-to-jar noch durch den vollständigen Pfad der Datei java-lang-extension.jar ersetzt werden. Diese Datei ist standardmäßig in dem folgenden Verzeichnis zu finden: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn

  • Es muss folgende Abfrage eingegeben und ausgeführt werden:
CREATE EXTERNAL LIBRARY helloWorld
FROM (CONTENT = 'path-to-jar')WITH (LANGUAGE = 'Java');
GO

Hierbei muss jedoch path-to-jar noch durch den vollständigen Pfad der zuvor erstellten .jar Datei ersetzt werden.

Berechtigungen hinzufügen

Bevor die erzeugte Java Anwendung endlich ausführen werden kann, müssen noch die Richtigen Berechtigungen gesetzt werden. Die geschieht wie folgt:

  • Es muss zum Verzeichnis welches die zuvor erzeugte Java Anwendung beinhaltet navigiert werden.
  • Es müssen die Einstellungen des Verzeichnisses mit einem Rechtsklick geöffnet werden.
  • Es muss auf den Reiter Sicherheit navigiert werden.
  • Es muss auf Bearbeiten… geklickt werden.
  • Im neu erscheinenden Fenster muss auf Hinzufügen… geklickt werden.
  • Es muss SQLRUserGroup in das Eingabefeld eingegeben und mit einem Klick auf Namen überprüfen überprüft werden.
  • Es muss die Eingabe mit einem Klick auf OK bestätigt werden.

Ausführen der Java Anwendung

Um die erstellte Java Anwendung nun auszuführen, muss eine gespeicherte Prozedur erstellt werden. Dafür muss man wie folgt vorgehen:

  • Es muss SQL Server Management Studio (SSMS) geöffnet werden.
  • Es muss ein neues Abfrage-Fenster geöffnet werden.
  • Es muss folgender Code in das Abfrag-Fenster eingefügt und ausgeführt werden:
CREATE OR ALTER PROCEDURE [dbo].[java_hello_world]
AS
BEGIN
EXEC sp_execute_external_script
@language = N'Java', 
@script = N'pkg.HelloWorld'
with result sets ((text nvarchar(100)));
END
GO
  • Es kann nun folgende Anweisung genutzt werden, um die Java Anwendung auszuführen:
EXECUTE [dbo].[java_hello_world]

Abschluss und Hinweise

Der initiale Aufwand der betrieben werden muss um eine externe Sprache in SQL Server nutzen zu können scheint vielleicht im ersten Moment sehr groß. Ist das Unterliegende System jedoch erst einmal aufgesetzt und eine Routine im Umgang mit der externen Sprache entstanden bleibt der Aufwand sehr überschaulich.

Hinweis: Das oben aufgeführte Script ist natürlich nur ein sehr simples Beispiel zur Nutzung von Java Anwendungen mit dem SQL Server. In der Praxis ist es beispielsweise wichtig, die Anwendung direkt aus der Datenbank heraus mit Daten zu versorgen.

Um eine Anwendung mit Parameterübergabe auszuführen, kann beispielsweise die Prozedur die zum Aufruf benutzt wird abgeändert werden:

CREATE OR ALTER PROCEDURE [dbo].[java_hello_world] @param1 nvarchar(200), @param2 nvarchar(400) AS 
BEGIN 
EXEC sp_execute_external_script 
@language = N'Java' , 
@script = N'pkg.HelloWorld' ,
@input_data_1 = @param2,
@params = N'@param1 nvarchar(200)'
with result sets ((ID int, text nvarchar(100))); 
END 
GO

Schreibe einen Kommentar