Verwenden von Referenzen, um den Zugriff auf Objekte zu autorisieren

Eine Referenz kann verwendet werden, um einer gespeicherten Prozedur, einer Anwendung oder einer Klasseninstanz Zugriff auf Objekte zu erlauben, auf die sie standardmäßig keinen Zugriff haben.

Unter diesem Thema:

Einführung

Eine Referenz ist eine Zeichenfolge, die als Bezeichner verwendet werden kann. Der Bezeichner löst das Objekt auf, auf das verwiesen wird.

Eine Referenz kapselt das Folgende ein:

  • Den Namen des Objekts.

  • Die aktive Rolle, mit der die Objektreferenz erstellt wurde, und ggf. die aktiven sekundären Rollen.

  • Die Berechtigungen für das Objekt, die beim Erstellen der Referenz angegeben werden.

In folgenden Szenarios könnte eine Referenz erforderlich sein:

  • Eine gespeicherte Prozedur mit Eigentümerrechten benötigt Zugriff, um Daten in eine Tabelle einzufügen, die einer anderen Rolle gehört.

  • Eine Anwendung führt Datenanalysen durch und benötigt Lesezugriff auf Daten in Tabellen.

  • Eine Instanz der Klasse SNOWFLAKE.ML.ANOMALY_DETECTION benötigt Lesezugriff auf eine Ansicht für das Training des Anomalieerkennungsmodells ML.

Nach Namen identifizierte Objekte

Eine Referenz identifiziert ein Objekt nach dem Namen. Das heißt, wenn ein Objekt umbenannt wird, nachdem eine Referenz erstellt wurde, ist die Referenz ungültig. Wenn jedoch ein neues Objekt mit dem gleichen Namen erstellt wird, ist die Referenz möglicherweise gültig. Zum Beispiel erstellt eine Rolle my_role eine Referenz my_ref1 für Tabelle my_table1 mit der Berechtigung SELECT. Nachdem die Referenz erstellt wurde, wird die Tabelle my_table1 gelöscht und eine neue Tabelle namens my_table1 erstellt. Die Referenz my_ref1 identifiziert eine Tabelle mit dem Namen my_table1. In diesem Fall identifiziert sie die neue Tabelle my_table1.

Wenn die zum Erstellen der Referenz verwendete Rolle und die für my_table1 erteilten Berechtigungen noch gültig sind, ist der Zugriff auf die neue my_table1 bei Verwendung der Referenz zulässig.

Wenn die Rolle und die Berechtigung(en), die in der Referenz enthalten sind, nicht mehr gültig sind, kann der Zugriff auf die Tabelle my_table1 nicht autorisiert werden und es muss eine neue Referenz für die neue Tabelle erstellt werden.

Überprüfung von Berechtigungen zum Zeitpunkt der Ausführung

Die Berechtigungen der Rolle, die die Referenz erstellt hat, werden zum Zeitpunkt der Verwendung der Referenz überprüft. Zum Beispiel erstellt eine Rolle my_role eine Referenz auf eine Tabelle t1 mit der Berechtigung SELECT. Wenn my_role gelöscht oder die Berechtigung SELECT für die Tabelle t1 von my_role entzogen wird, sind die in der Referenz eingeschlossenen Berechtigungen nicht mehr gültig. Wenn die Referenz an eine gespeicherte Prozedur übergeben wird, die die Berechtigung SELECT für die Tabelle benötigt, schlägt die gespeicherte Prozedur mit einem Berechtigungsfehler fehl.

Arten von Referenzen und Referenzlebensdauer

Die Lebensdauer einer Referenz kann bei der Erstellung angegeben werden.

  • Eine transiente Referenz hat eine begrenzte Lebensdauer, entweder für die Dauer des Aufrufs, in dem die Referenz übergeben wird, oder für die Dauer der Sitzung.

Referenzen für gespeicherte Prozeduren mit Eigentümerrechten

Eine gespeicherte Prozedur mit Eigentümerrechten wird mit den Berechtigungen des Eigentümers ausgeführt und nicht mit den Berechtigungen des Aufrufers, der die gespeicherte Prozedur ausführt. Um Aktionen an einer Tabelle, einer Ansicht oder einer Funktion durchzuführen, für die der Aufrufer Zugriffsrechte hat, muss der Aufrufer eine Referenz auf die Tabelle, die Ansicht oder die Funktion übergeben. Die Referenz ermöglicht es der gespeicherten Prozedur, Aktionen an dem Objekt durchzuführen, das die Referenz mit den Berechtigungen des Erstellers der Referenz (in diesem Fall des Aufrufers) identifiziert.

Referenzen für Anwendungen und Klassen

Standardmäßig haben Anwendungen und Klassen keinen Zugriff auf Objekte in dem Konto, in dem die Anwendung installiert oder eine Instanz einer Klasse erstellt wird. Benutzer können den Zugriff auf Objekte einer Anwendung oder Klasseninstanz autorisieren, indem sie eine Referenz erstellen.

Anbieter und Nutzer von Anwendungen und Klassen

Ein Anbieter erstellt eine Anwendung und ein Verbraucher installiert und nutzt eine Anwendung im Verbraucherkonto. Im Fall von Snowflake-Klassen ist Snowflake der Anbieter, und ein Benutzer mit einem Snowflake-Konto, der eine Instanz einer Klasse erstellt, ist der Verbraucher.

Anbieter können Anwendungen und Klassen erstellen, die Referenzen in ihrem Code anfordern und verwenden. Weitere Informationen dazu finden Sie unter Referenzen für Anbieter.

Verbraucher können Referenzen auf Anwendungen, die sie in ihrem Konto installieren, oder auf Instanzen von Snowflake-Klassen erstellen und weitergeben. Weitere Informationen dazu finden Sie unter Referenzen für Verbraucher.

Unterstützte Ziele für Referenzen

Die Ziele für eine Referenz können ein Objekt oder eine Abfrage sein. Wenn das Ziel der Referenz ein Objekt ist, sind für die Referenz Berechtigungen im Hinblick auf das Objekt erforderlich.

Unterstützte Objekttypen und Berechtigungen für Referenzen

In der folgenden Tabelle sind die Objekttypen aufgeführt, die eine Referenz enthalten können, sowie die Berechtigungen, die für jedes Objekt zulässig sind:

Objekttyp

Transient

Persistent

Zulässige Berechtigungen

Standardberechtigung

DATABASE

APPLYBUDGET

SCHEMA

APPLYBUDGET

TABLE

APPLYBUDGET

SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES

SELECT

VIEW

SELECT, REFERENCES

SELECT

MATERIALIZED VIEW

APPLYBUDGET

EXTERNAL TABLE

SELECT, REFERENCES

SELECT

PIPE

APPLYBUDGET

APPLYBUDGET

TASK

APPLYBUDGET

APPLYBUDGET

FUNCTION

USAGE

USAGE

PROCEDURE

USAGE

USAGE

WAREHOUSE

APPLYBUDGET

MODIFY, MONITOR, OPERATE, USAGE

USAGE

API INTEGRATION

USAGE

USAGE

Abfragereferenzen

Eine Abfragereferenz ist eine Art von transienter Referenz. Sie verweist auf eine SELECT-Anweisung, die in der FROM-Klausel einer anderen SQL-Anweisung in einer gespeicherten Prozedur verwendet werden kann. Sie können einen Abfragereferenz mit der Funktion SYSTEM$QUERY_REFERENCE erstellen.

Weitere Informationen dazu finden Sie unter Verwenden von Abfragereferenzen.

Referenzen für Anbieter

Sie können Anwendungen als Anbieter erstellen, indem Sie das Snowflake Native App Framework verwenden. Ausführliche Informationen zur Anforderung von Referenzen von einem Verbraucher Ihrer Anwendung finden Sie unter Referenzen und Berechtigungen auf Objektebene von Verbrauchern anfordern.

Referenzen für Verbraucher

Sie können eine Referenz mit der Funktion SYSTEM$REFERENCE erstellen. Sie können den Zeichenfolgebezeichner, den die Funktion zurückgibt, an eine gespeicherte Prozedur, eine Anwendung oder eine Klasseninstanz weitergeben. Alternativ können Sie auch die Anweisung, die die Referenz erstellt, anstelle des Zeichenfolgebezeichners übergeben.

Beispiele

Erstellen Sie eine transiente Referenz mit Sitzungsbereich auf Tabelle t1 mit der Berechtigung SELECT:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');
Copy

Um eine Referenz auf dieselbe Tabelle für die Lebensdauer des Bereichs zu erstellen, in dem sie referenziert wird (wenn Sie sie zum Beispiel an eine gespeicherte Prozedur übergeben, wäre ihre Lebensdauer die des äußersten Blocks der gespeicherten Prozedur), führen Sie die folgende Anweisung aus:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');
Copy

Erstellen Sie eine persistente Referenz auf eine Tabelle t1 mit der Berechtigung INSERT zur Übergabe an eine Anwendung:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');
Copy

Erstellen Sie eine Abfragereferenz zur Übergabe an eine gespeicherte Prozedur. Die Lebensdauer dieser transienten Referenz gilt für den äußersten Block der gespeicherten Prozedur, an die Sie die Referenz übergeben:

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);
Copy

Weitere Beispiele:

Aufheben einer persistenten Referenz für eine Anwendung

Eine Anwendung oder eine Klasse, die eine persistente Referenz benötigt, stellt auch eine Methode zur Verfügung, um die Referenz wieder aufzuheben. Die Methodennamen können je nach Implementierung variieren.

Alternativ können Sie Referenzen auch mit der Anweisung ALTER APPLICATION… UNSET REFERENCES aufheben.

  1. Mit dem Befehl SHOW REFERENCES können Sie alle Referenzen anzeigen, einschließlich der Referenzen, die für eine Anwendung festgelegt wurden.

    Zum Beispiel, um Referenzen für die Anwendung my_app anzuzeigen:

    SHOW REFERENCES IN APPLICATION my_app;
    
    Copy
  2. Mit dem Befehl ALTER APPLICATION können Sie alle Referenzen, die für die Anwendung gesetzt wurden, aufheben.

    Zum Beispiel, um die Referenz namens table_to_read in der Anwendung my_app zu löschen:

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    
    Copy

    Zum Beispiel, um alle Referenzen in der Anwendung my_app aufzuheben:

    ALTER APPLICATION my_app UNSET REFERENCES;
    
    Copy

Hinweise zur Verwendung von Referenzen

  • Wenn ein Objekt, das mit einer Referenz verbunden ist, umbenannt (oder repariert) wird, ist die Referenz nicht mehr gültig.

    Wenn ein neues Objekt mit dem gleichen Namen erstellt wird und die in der Referenzzuordnung kodierten Rollen über die entsprechenden Berechtigungen für das neue Objekt verfügen, bleibt die Referenz gültig. Andernfalls schlägt es mit einem Berechtigungsfehler fehl.

  • Wenn ein Objekt ausgetauscht wird und die in der Referenzzuordnung kodierten Rollen die entsprechenden Berechtigungen für das neue Objekt haben, das nun den ausgetauschten Namen trägt, bleibt die Referenz gültig. Andernfalls schlägt es mit einem Berechtigungsfehler fehl.

  • Löschen und Wiederherstellen von Objekten:

    • Wenn ein Objekt, das mit einer Referenz verbunden ist, gelöscht wird, wird die Referenzzuordnung ungültig.

    • Wenn das Objekt wiederhergestellt wird, wird die Referenzzuordnung wieder gültig.

  • Klonen

    Sie können eine Klasseninstanz oder deren übergeordnete Datenbank oder Schema klonen, die Referenzen auf Objekte in Ihrem Konto verwendet.

    • Wenn das Referenzobjekt mit einem vollqualifizierten Namen referenziert wird, verweist der Instanzklon auf das ursprüngliche Objekt.

    • Wenn das referenzierte Objekt mit einem teilweise qualifizierten oder nicht qualifizierten Namen referenziert wird, kann der Instanzklon je nach Klongrenze auf das Klonobjekt, das Originalobjekt oder auf kein reales Objekt verweisen.

  • Die Replikation wird für eine Anwendung oder eine Datenbank unterstützt, die eine Klasseninstanz enthält, die eine Referenz auf Objekte im Verbraucherkonto verwendet.

    Referenzen funktionieren im Zielkonto korrekt, sofern die folgenden Objekte repliziert werden:

    • Anwendung oder Klasseninstanz.

    • Referenziertes Objekt.

    • Rolle, die die Referenz erstellt hat.

    Diese Objekte können in verschiedenen Replikations- oder Failover-Gruppen repliziert werden. Sobald alle Objekte repliziert sind, kann die Referenz verwendet werden.

Für Anbieter von Snowflake Native App Framework-Anwendungen, siehe auch Hinweise zur Verwendung von Referenzen.

Überwachung der Nutzung von Referenzen

Sie können die von einer Anwendung angeforderten Referenzen mit dem Befehl SHOW REFERENCES anzeigen. Wenn Sie Referenzen für eine Anwendung gesetzt haben, enthält die Ausgabe Informationen über das Objekt, die Datenbank, das Schema und den Identifikator für jede Referenz.

Zum Beispiel, um Referenzen in Anwendung my_app anzuzeigen:

SHOW REFERENCES IN APPLICATION my_app;
Copy