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.
Eine persistente Referenz hat eine unbegrenzte Lebensdauer. Die Referenz bleibt gültig, bis das Objekt, auf das sie verweist, gelöscht wird, die Referenz aufgehoben oder ungültig wird.
Beispiele für die Aufhebung von Referenzen finden Sie unter Aufheben einer persistenten Referenz für eine Anwendung.
Eine Referenz kann aus einem der folgenden Gründe ungültig werden:
Das Objekt, auf das sie verweist, wird umbenannt.
Die Rolle, die die Referenz erstellt hat, wird gelöscht.
Die Rolle, die die Referenz erstellt hat, hat keine Berechtigungen mehr für das Objekt.
Weitere Informationen dazu finden Sie unter Nach Namen identifizierte Objekte und Überprüfung von Berechtigungen zum Zeitpunkt der Ausführung.
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');
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');
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');
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);
Weitere Beispiele:
Beispiel einer gespeicherten Prozedur, siehe Ein einfaches Beispiel.
Beispiel einer Native App Framework-Anwendung, siehe Zuordnen der Referenz zur Anwendung.
Beispiel einer Klasseninstanz, siehe Trainieren eines Anomalieerkennungsmodells mit beschrifteten Daten.
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.
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;
CopyMit 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 Anwendungmy_app
zu löschen:ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
CopyZum 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;