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. In diesem 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 einer neueren Version 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 Entwicklungspaket) 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 darauf folgenden Fenster der oberste Menüpunkt “New SQL Server stand-alone installation or add features to an existing installation” ausgewählt werden.
  • 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\Microsoft 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> durch den vollständigen Pfad der zuvor erstellten .jar-Datei ersetzt werden.

Berechtigungen hinzufügen

Bevor die erzeugte Java Anwendung endlich ausgeführt werden kann, müssen erst die richtigen Berechtigungen gesetzt werden. Die geschieht wie folgt:

  • Navigieren Sie zu dem Verzeichnis, das die zuvor erzeugte Java Anwendung beinhaltet.
  • Öffnen Sie die Einstellungen des Verzeichnisses mit einem Rechtsklick.
  • Navigieren Sie zu dem Reiter “Sicherheit”.
  • Klicken Sie auf “Bearbeiten…”.
  • Klicken Sie im neu erschienenen Fenster auf “Hinzufügen…”.
  • Geben Sie “SQLRUserGroup” in das Eingabefeld ein und überprüfen sie diese mit einem Klick auf “Namen überprüfen”.
  • Bestätigen Sie die Eingabe mit einem Klick auf “OK”.

Ausführen der Java Anwendung

Um die erstellte Java Anwendung auszuführen, muss eine gespeicherte Prozedur erstellt werden. Dafür gehen Sie wie folgt vor:

  • Öffnen Sie SQL Server Management Studio (SSMS).
  • Öffnen Sie ein neues Abfrage-Fenster.
  • Fügen Sie folgenden Code in das Abfrage-Fenster führen Sie diesen aus:
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
  • Sie können nun die folgende Anweisung nutzen, 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 überschaubar.

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 etwa 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