Übersicht zu gespeicherten Prozeduren

Sie können gespeicherte Prozeduren schreiben, um das System mit prozeduralem Code zu erweitern. Mit einer Prozedur können Sie Verzweigungen, Schleifen und andere Programmsteuerungskonstrukte verwenden. Sie können eine Prozedur mehrfach wiederverwenden, indem Sie sie von anderem Code aus aufrufen.

Mit einer gespeicherten Prozedur können Sie:

  • Aufgaben automatisieren, die eine häufige Ausführung mehrerer Datenbankoperationen erfordern.

  • Datenbankoperationen dynamisch erstellen und ausführen.

  • Ausführen von Code, der mit den Berechtigungen der Rolle ausgeführt wird, die Eigentümer der Prozedur ist, und nicht mit den Berechtigungen der Rolle, die die Prozedur ausführt.

    Auf diese Weise können Eigentümer gespeicherter Prozeduren die Befugnis zum Ausführen bestimmter Operationen an Benutzer delegieren, die diese sonst nicht ausführen könnten. Es gibt bei diesen gespeicherten Prozeduren mit Eigentümerrechten jedoch einige Einschränkungen.

Angenommen, Sie möchten eine Datenbank bereinigen, indem Sie alle Daten löschen, die älter als ein bestimmtes Datum sind. Sie können den Löschvorgang in Ihrem Code mehrfach ausführen und dabei jedes Mal Daten aus einer bestimmten Tabelle löschen. Sie können alle diese Anweisungen in einer einzigen gespeicherten Prozedur zusammenfassen und dann einen Parameter übergeben, der das Datum Stichtags angibt.

Wenn die Prozedur eingerichtet ist, können Sie sie aufrufen, um die Datenbank zu bereinigen. Wenn sich Ihre Datenbank ändert, können Sie die Prozedur aktualisieren, um zusätzliche Tabellen zu bereinigen. Wenn mehrere Benutzer den neuen Bereinigungsbefehl verwenden, können sie eine Prozedur aufrufen, anstatt sich jeden Tabellennamen zu merken und jede Tabelle einzeln zu bereinigen.

Eine gespeicherte Prozedur ist wie eine UDF, jedoch unterscheiden sich beide in wichtigen Punkten. Weitere Informationen dazu finden Sie unter Entscheidung über das Schreiben einer gespeicherten Prozedur oder einer benutzerdefinierten Funktion.

Eine Prozedur ist nur eine Möglichkeit, um Snowflake zu erweitern. Weitere Informationen dazu finden Sie unter:

Unterstützte Sprachen und Tools

Sie können gespeicherte Prozeduren (und andere Snowflake-Entitäten) mit einem von mehreren Tools erstellen und verwalten, je nachdem, wie Sie am liebsten arbeiten.

Sprache

Ansatz

Unterstützung

SQL

Mit Handler in Java, JavaScript, Python, Scala, oder SQL Scripting

Schreiben Sie SQL-Code in Snowflake, um Snowflake-Entitäten zu erstellen und zu verwalten. Schreiben Sie die Logik der Prozedur in einer der unterstützten Handler-Sprachen.

Java

JavaScript

Python

Scala

SQL Scripting

Java, Python oder Scala

Snowpark-API

Schreiben Sie im Client Code für Operationen, die zur Verarbeitung an Snowflake weitergeleitet werden.

Java

Python

Scala

Befehlszeilenschnittstelle

Snowflake CLI

Verwenden Sie die Befehlszeile, um Snowflake-Entitäten zu erstellen und zu verwalten, indem Sie Eigenschaften als Eigenschaften von JSON-Objekten angeben.

Verwalten von Snowflake-Objekten

Python

Snowflake-Python-API

Schreiben Sie auf dem Client Code, der Verwaltungsoperationen auf Snowflake ausführt.

Verwalten von gespeicherten Prozeduren

REST

Snowflake REST API

Stellen Sie Anfragen an RESTful-Endpunkte, um Snowflake Entitäten zu erstellen und zu verwalten.

Prozeduren verwalten

Die Logik einer Prozedur, d. h. ihr Handler, wird in einer der unterstützten Sprachen geschrieben. Sobald der Handler verfügbar ist, können Sie mit dem Befehl CREATE PROCEDURE eine Prozedur erstellen und anschließend mit einer CALL-Anweisung die Prozedur aufrufen.

Eine gespeicherte Prozedur kann einzelne Werte oder (wenn sie von der Handler-Sprache unterstützt wird) Tabellendaten zurückgeben. Weitere Informationen zu unterstützten Rückgabetypen finden Sie unter CREATE PROCEDURE.

Bei der Wahl einer Sprache sollten Sie auch die Speicherorte der Handler beachten. Nicht alle Sprachen unterstützen das Verweisen auf einen Handler in einem Stagingbereich (der Handler-Code muss stattdessen inline sein). Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.

Sprache

Speicherort des Handlers

Java

Inline oder Staging

JavaScript

Inline

Python

Inline oder Staging

Scala

Inline oder Staging

Snowflake Scripting

Inline

Bemerkung

Um eine anonyme Prozedur sowohl zu erstellen als auch aufzurufen, verwenden Sie CALL (mit anonymer Prozedur). Das Erstellen und Aufrufen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.

Beispiel einer gespeicherten Prozedur

Der Code im folgenden Beispiel erstellt eine gespeicherte Prozedur namens myproc mit einem Python-Handler namens run.

CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.9'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
  session.table(from_table).limit(count).write.save_as_table(to_table)
  return "SUCCESS"
$$;
Copy

Im folgenden Beispiel wird die gespeicherte Prozedur myproc aufgerufen:

CALL myproc('table_a', 'table_b', 5);
Copy

Richtlinien und Einschränkungen

Tipps:

Weitere Tipps zum Schreiben von gespeicherten Prozeduren finden Sie unter Verwenden von gespeicherten Prozeduren.

Snowflake-Einschränkungen:

Sie können die Stabilität innerhalb der Snowflake-Umgebung sicherstellen, indem die Snowflake-Einschränkungen beim Entwickeln berücksichtigen. Weitere Informationen dazu finden Sie unter Entwerfen von Handlern unter Berücksichtigung der Snowflake-bedingten Einschränkungen.

Namensgebung:

Achten Sie darauf, Prozeduren so zu benennen, dass es nicht zu Kollisionen mit anderen Prozeduren kommt. Weitere Informationen dazu finden Sie unter Benennen und Überladen von Prozeduren und UDFs.

Argumente:

Geben Sie die Argumente für Ihre gespeicherte Prozedur an, und geben Sie an, welche Argumente optional sind. Weitere Informationen dazu finden Sie unter Definieren von Argumenten für UDFs und gespeicherte Prozeduren.

Zuordnung von Datentypen:

Für jede Handler-Sprache gibt es einen separaten Satz von Zuordnungen zwischen den Datentypen der Sprache und den SQL-Typen, die für Argumente und Rückgabewerte verwendet werden. Weitere Informationen zur Zuordnung in den einzelnen Sprachen finden Sie unter Zuordnung von Datentypen zwischen SQL und Handler-Sprachen.

Schreiben von Handlern

Sprachen des Handlers:

Sprachspezifische Informationen zum Schreiben eines Handlers finden Sie unter Unterstützte Sprachen und Tools.

Externer Netzwerkzugriff:

Mit externem Netzwerkzugriff können Sie auf externe Netzwerkstandorte zugreifen. Sie können einen sicheren Zugriff auf bestimmte Netzwerkstandorte außerhalb von Snowflake erstellen und diesen Zugriff dann innerhalb des Handler-Codes verwenden.

Protokollierung und Ablaufverfolgung:

Sie können Code-Aktivitäten erfassen, indem Sie Protokollmeldungen und Ablaufverfolgungsereignisse aufzeichnen und die Daten in einer Datenbank speichern, die Sie später abfragen können.

Sicherheit

Ob Sie eine gespeicherte Prozedur mit Aufruferrechten oder mit Eigentümerrechten ausführen, kann sich auf die Informationen auswirken, auf die die Prozedur Zugriff hat, und auf die Aufgaben, die sich damit ausführen lassen. Weitere Informationen dazu finden Sie unter Erläuterungen zu gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten.

Bei gespeicherten Prozeduren müssen bestimmte Sicherheitsaspekte wie bei benutzerdefinierten Funktionen (UDFs) berücksichtigt werden. Weitere Informationen dazu finden Sie unter:

Bereitstellen von Handler-Code

Beim Erstellen einer Prozedur können Sie deren Handler, der die Prozedurlogik implementiert, als Inline-Code in der CREATE PROCEDURE-Anweisung angeben oder als Code außerhalb der Anweisung als kompilierten Code, der gepackt und in einen Stagingbereich kopiert wird.

Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.