Erstellen des Setup-Skripts

Unter diesem Thema wird beschrieben, wie Sie über das Setup-Skript festlegen können, welche Objekte bei der Installation Ihrer Anwendung erstellt werden. Außerdem werden im Setup-Skript Anwendungsrollen und deren Verwendung beschrieben.

Allgemeine Informationen zum Setup-Skript

Das Setup-Skript einer Anwendung enthält SQL-Anweisungen, die ausgeführt werden, wenn der Verbraucher eine Anwendung installiert oder aktualisiert oder wenn ein Anbieter eine Anwendung zum Testen installiert oder aktualisiert. Jede Anwendung muss ein Setup-Skript enthalten. Der Speicherort des Setup-Skripts wird in der Manifest-Datei angegeben.

Das Setup-Skript definiert die Objekte, die erstellt werden, wenn eine Anwendung installiert oder aktualisiert wird.

Bemerkung

Das Setup-Skript ist erforderlich, um ein Anwendungspaket erstellen zu können. Name und Pfad zum Setup-Skript werden in der Datei manifest.yml angegeben.

Einschränkungen für das Setup-Skript

Die folgenden Operationen können nicht innerhalb eines Setup-Skripts ausgeführt werden:

  • USE DATABASE

  • USE SCHEMA

  • USE ROLE

  • USE SECONDARY ROLES

  • Einstellen der Eigenschaften LOG_LEVEL oder TRACE_LEVEL mit dem Befehl ALTER <Objekt>.

  • Erstellen oder Aufrufen von Prozeduren, die EXECUTE AS CALLER verwenden

  • Erstellen von benutzerdefinierten Snowpark-Funktionen (UDFs) oder Prozeduren, die IMPORT aus einem benannten Stagingbereich verwenden

  • Aufrufen von Prozeduren, Funktionen oder anonymen Codeblöcken, die Erweiterungscode verwenden

  • Importieren von Codedateien aus einem benannten Stagingbereich bei Verwendung des Befehls CREATE FUNCTION

  • Verwenden von CALL zum Aufrufen einer Prozedur, die EXECUTE AS CALLER verwendet.

Es gibt weitere Einschränkungen für Objekte, die innerhalb eines versionierten Schemas erstellt werden.

Sichtbarkeit von im Setup-Skript erstellten Objekten für Verbraucher

Das Setup-Skript kann die meisten Objekte auf Datenbankebene definieren. Die vom Setup-Skript erstellten Datenbankobjekte sind intern für die Anwendung. Die Objekte sind für das Verbraucherkonto nicht sichtbar und nicht direkt zugänglich.

Sie können diese Objekte mithilfe von Anwendungsrollen für den Verbraucher sichtbar machen. Jede im Setup-Skript erstellte Anwendungsrolle wird automatisch der Rolle zugewiesen, die Eigentümer der Instanz der installierten Anwendung ist. Diese Rollen können nicht widerrufen werden.

Benutzer mit der Rolle, die Eigentümer der Anwendungsinstanz ist, können dann anderen Rollen innerhalb ihrer Organisation Anwendungsrollen zuweisen. Das Setup-Skript kann zum Beispiel eine Anwendungsrolle APP_ADMIN definieren, der es die Berechtigung zum Zugriff auf Objekte innerhalb der Anwendung erteilt. Dieser Benutzer kann dann diese Objekte verwenden, um die Anwendung zu verwalten.

Das Setup-Skript kann auch eine Anwendungsrolle definieren (z. B. USER). Mit dieser Rolle wird den Verbrauchern der Zugriff auf die von der Anwendung bereitgestellten Funktionen gewährt. Das Setup-Skript kann eine Anwendungsrolle definieren, z. B. READ_ONLY, um innerhalb der Anwendung eingeschränkten Zugriff auf bestimmte Bereiche der Daten bereitzustellen.

Das Setup-Skript wird sowohl für die Erstinstallation als auch für Upgrades verwendet. Das Skript muss auf idempotente Weise geschrieben sein. Erstellen Sie zum Beispiel Objekte mit CREATE … IF NOT EXISTS oder CREATE OR REPLACE.

Bewährte Methoden für das Erstellen des Setup-Skripts

Snowflake empfiehlt die folgenden bewährten Methoden für das Erstellen des Setup-Skripts für eine Anwendung:

  • Wenn Sie den CREATE-Befehl verwenden, um Objekte innerhalb des Setup-Skripts zu erstellen, empfiehlt Snowflake die Verwendung der Versionen CREATE OR REPLACE oder CREATE IF NOT EXISTS des Befehls. Das Setup-Skript kann während der Installation oder des Upgrades sowie bei Auftreten eines Fehlers mehrfach ausgeführt werden. In diesen Situationen darf beispielsweise ein versioniertes Schema nicht leer sein.

  • CREATE SCHEMA ändert den Sitzungskontext nicht, sodass Objekte bei der Erstellung mit dem Zielschema qualifiziert werden müssen. Um beispielsweise ein Schema innerhalb des Setup-Skripts zu erstellen, verwenden Sie die folgenden Befehle:

    CREATE SCHEMA IF NOT EXISTS app_config;
    CREATE TABLE IF NOT EXISTS app_config.params(...);
    
    Copy
  • Versionierte Schemaobjekte können auf nicht versionierte Objekte verweisen und umgekehrt. Sie müssen mit der Möglichkeit eines Fehlers rechnen, wenn das Setup-Skript ausgeführt wird. Da das Setup-Skript so geschrieben ist, dass es idempotent ist, wird es automatisch erneut ausgeführt, wenn die erste Ausführung fehlschlägt.

    Berücksichtigen Sie dies bei der Zuweisung von Anwendungsrollen innerhalb eines Schemas. Verwenden Sie zum Beispiel Folgendes:

    CREATE OR REPLACE PROCEDURE app_state.proc()...;
    -- Additional CREATE statements
    GRANT USAGE ON PROCEDURE app_state.proc()
       TO APPLICATION ROLE app_user;
    
    Copy

    Die Anweisung CREATE OR REPLACE ersetzt die Prozedur, wodurch implizit die Berechtigungen entfernt werden, die zuvor der Prozedur zugewiesen wurden. Obwohl die Berechtigungen zu einem späteren Zeitpunkt im Skript wiederhergestellt werden, kann es vorkommen, dass Verbraucher den Zugriff auf die Prozedur verlieren, wenn die Ausführung des Skripts fehlschlägt.

    Wenn das Setup-Skript aufgrund eines Problems fehlschlägt, das nicht durch einen erneuten Versuch behoben werden kann, z. B. bei einem Syntaxfehler, kann der Verbraucher erst wieder auf die Prozedur zugreifen, wenn eine neue Version oder ein Patch erstellt und die Berechtigung wiederhergestellt wurde.

  • Ansichten auf freigegebene Inhalte müssen immer in einem versionierten Schema definiert sein. Dadurch wird sichergestellt, dass jeder Code, der während eines Upgrades auf die Ansicht zugreift, eine konsistente Ansicht verwendet, auch wenn neue Spalten oder andere Attribute hinzugefügt oder entfernt werden.

  • Wenn das Setup-Skript Operationen mit sehr langen Ausführungszeiten ausführen muss, wie z. B. das Aktualisieren großer Zustandstabellen, müssen Sie sicherstellen, dass diese Aktualisierungen mit bereits in Ausführung befindlichem Code der Vorgängerversion kompatibel sind.

Allgemeine Informationen zu Anwendungsrollen

Standardmäßig hat der Verbraucher keine Berechtigungen für Objekte, die innerhalb der Anwendung erstellt werden. Auch für die Rolle ACCOUNTADMIN sind die Objekte innerhalb einer Anwendung nicht sichtbar. Objekte, die von der Anwendung außerhalb ihrer selbst erstellt werden, wie z. B. eine Datenbank, sind nur für die Rolle ACCOUNTADMIN des Verbraucherkontos sichtbar.

Anwendungsrollen sind ähnlich wie Datenbankrollen, können aber nur innerhalb der Anwendung erstellt werden. Im Gegensatz zu Datenbankrollen können Anwendungsrollen Berechtigungen für Objekte zugewiesen werden, die außerhalb der Anwendung existieren.

Anwendungsrollen müssen während der Installation der Anwendung durch das Setup-Skript erstellt werden. Sie werden automatisch der Rolle des Anwendungseigentümers zugewiesen, der dann anderen Rollen im Verbraucherkonto entsprechende Anwendungsrollen zuweisen kann.

Bemerkung

Anwendungsrollen sind der einzige Rollentyp, der innerhalb einer Anwendung erstellt werden kann. Datenbankrollen sind zum Beispiel innerhalb der Anwendung nicht zulässig.

Ebenso können Anwendungsrollen nur in einer Anwendung erstellt werden und nicht z. B. in einer normalen Datenbank oder auf der Kontoebene.

Alle Berechtigungen, die Anwendungsrollen zugewiesen werden, werden an den Eigentümer der Anwendung weitergegeben, d. h. an die Rolle, die für die Installation der Anwendung verwendet wird. Der Eigentümer kann außerdem Anwendungsrollen an andere Rollen innerhalb des Verbraucherkontos delegieren.

Im Gegensatz zu Datenbankrollen können Anwendungsrollen auch Berechtigungen für Objekte außerhalb der installierten Anwendung zugewiesen werden. Sie können daher verwendet werden, um Berechtigungen für Objekte außerhalb der Anwendung zuzuweisen. Die Anwendungsrolle selbst muss jedoch innerhalb der Anwendung erstellt werden.

Unterstützte SQL-Befehle für die Verwendung von Anwendungsrollen

Das Snowflake Native App Framework bietet die folgenden SQL-Befehle für die Verwendung von Anwendungsrollen:

Verwenden von Anwendungsrollen im Setup-Skript

Die im Setup-Skript definierten Anwendungsrollen werden automatisch der Rolle zugewiesen, die Eigentümer der Anwendungsinstanz ist. Wenn die Anwendung installiert wird, wird die Rolle, mit der die Anwendung installiert wird, zum Eigentümer der Anwendung. Der Eigentümer der Anwendung kann anderen Kontorollen im Verbraucherkonto Berechtigungen zuweisen.

Mit Anwendungsrollen können dem Verbraucher innerhalb der Anwendung Berechtigungen für Objekte zugewiesen werden. Beispiel:

CREATE APPLICATION ROLE admin;
CREATE APPLICATION ROLE user;
GRANT APPLICATION ROLE user TO APPLICATION ROLE admin;

CREATE OR ALTER VERSIONED SCHEMA app_code;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE admin;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE user;
CREATE OR REPLACE PROCEDURE app_code.config_app(...)
GRANT USAGE ON PROCEDURE app_code.config_app(..)
  TO APPLICATION ROLE admin;

CREATE OR REPLACE FUNCTION app_code.add(x INT, y INT)
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
  TO APPLICATION ROLE admin;
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
  TO APPLICATION ROLE user;
Copy

Im folgenden Beispiel erstellt das Setup-Skript Anwendungsrollen mit den Namen admin und user. Das Setup-Skript gewährt dann beiden Anwendungsrollen Zugriff auf das Schema, das den Anwendungscode enthält. Sie weist außerdem die Zugriffsberechtigung auf die Funktion add innerhalb des Schemas zu. Die Rolle admin erhält außerdem Zugriff auf die Prozedur config_app.

Anwendungsrollen und Versionen

Anwendungsrollen sind nicht versioniert. Das bedeutet, dass das Löschen einer Anwendungsrolle oder der Entzug einer Berechtigung für ein Objekt, das nicht in einem versionierten Schema enthalten ist, Auswirkungen auf die aktuelle Version einer Anwendung oder die zu aktualisierende Version haben kann. Anwendungsrollen werden nur dann sicher gelöscht, wenn Sie alle Versionen der Anwendung, die diese Rollen verwenden, gelöscht haben.

Bemerkung

Anwendungsrollen kann nicht die Eigentümerschaft an Objekten zugewiesen werden. Das bedeutet, dass eine im Setup-Skript definierte Anwendungsrolle nur verwendet werden sollte, um Verbrauchern den Zugriff auf Objekte innerhalb der installierten Snowflake Native App zu ermöglichen.