Ü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, Python oder Scala |
Schreiben Sie im Client Code für Operationen, die zur Verarbeitung an Snowflake weitergeleitet werden. |
|
Befehlszeilenschnittstelle |
Verwenden Sie die Befehlszeile, um Snowflake-Entitäten zu erstellen und zu verwalten, indem Sie Eigenschaften als Eigenschaften von JSON-Objekten angeben. |
|
Python |
Schreiben Sie auf dem Client Code, der Verwaltungsoperationen auf Snowflake ausführt. |
|
REST |
Stellen Sie Anfragen an RESTful-Endpunkte, um Snowflake Entitäten zu erstellen und zu 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"
$$;
Im folgenden Beispiel wird die gespeicherte Prozedur myproc
aufgerufen:
CALL myproc('table_a', 'table_b', 5);
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:
Sie können dazu beitragen, dass der Handler-Code einer Prozedur sicher ausgeführt wird, indem Sie die unter Sicherheitsverfahren für UDFs und Prozeduren beschriebenen bewährten Methoden befolgen.
Stellen Sie sicher, dass sensible Informationen vor Benutzern verborgen bleiben, die keinen Zugriff darauf haben sollten. Weitere Informationen dazu finden Sie unter Schutz sensibler Informationen mit sicheren UDFs und gespeicherten Prozeduren.
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.