Auf dieser Seite wird erläutert, wie die detaillierte Zugriffssteuerung mit Cloud Spanner-Warteschlangen für Datenbanken im GoogleSQL-Dialekt und Datenbanken im PostgreSQL-Dialekt funktioniert.
In Spanner wird eine Warteschlange als Schemaobjekt definiert. Der Zugriff zum Senden, Empfangen, Verlängern von Leases, Bestätigen und Löschen von Nachrichten oder zum direkten Abfragen von Warteschlangen entspricht den Standardrollen und ‑berechtigungen für Spanner-Datenbanken.
Berechtigungen zum Senden von Nachrichten (Produzenten)
Wenn Sie Nachrichten mit DML (INSERT INTO) oder der Mutation API (siehe Insert-Anweisung) an eine Warteschlange senden möchten, gewähren Sie der Datenbankrolle die Berechtigung INSERT für die Warteschlange:
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
So widerrufen Sie das Recht:
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Erteilungen für den Empfang von Nachrichten (Nutzer)
Um Nachrichten aus einer Warteschlange zu streamen, führen Consumer-Worker die Tabellenwertfunktion RECEIVE_QUEUE_NAME() mit ExecuteStreamingSQL aus.
Damit eine Datenbankrolle Nachrichten aus der Warteschlange streamen kann, erteilen Sie die Berechtigung EXECUTE für die automatisch erstellte Funktion RECEIVE_QUEUE_NAME:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;
So widerrufen Sie das Recht:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;
Für den Aufruf von RECEIVE_QUEUE_NAME() ist nur EXECUTE im TVF erforderlich, nicht SELECT in der Warteschlange.
Nachrichtenleases verlängern
Wenn ein Nutzer eine Nachricht empfängt, weist Spanner ihr eine anfängliche Lease von 10 Sekunden zu. Wenn die Nachrichtenverarbeitung länger als die ursprüngliche Leasedauer dauert, muss der Consumer die Leasedauer mit dem RENEWLEASE_QUEUE_NAME()-TVF verlängern.
Zum Verlängern von Leases muss die Rolle EXECUTE für die Funktion RENEWLEASE_QUEUE_NAME haben:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;
So widerrufen Sie das Recht:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;
Für den Aufruf von RENEWLEASE_QUEUE_NAME() ist nur EXECUTE im TVF erforderlich, nicht SELECT in der Warteschlange.
Weitere Informationen zum Empfangen von Nachrichten und zum Verlängern von Leases finden Sie unter Warteschlangen verwenden.
Direktes Abfragen von Warteschlangen
Wenn Sie Nachrichten direkt aus einer Warteschlange mit Standard-SQL (SELECT * FROM QUEUE_NAME) oder der Read API lesen oder prüfen möchten, gewähren Sie das SELECT-Privileg für die Warteschlange:
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
So widerrufen Sie das Recht:
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Wenn Sie SELECT für die Warteschlange gewähren, können Sie die Warteschlange als Tabelle abfragen, aber Sie erhalten nicht EXECUTE für RECEIVE_QUEUE_NAME() oder RENEWLEASE_QUEUE_NAME().
Berechtigungen zum Bestätigen und Löschen von Nachrichten
Wenn Sie Nachrichten aus einer Warteschlange mit DML (DELETE FROM) oder der Mutation API (Ack oder Delete) bestätigen oder löschen möchten, gewähren Sie die Berechtigung DELETE für die Warteschlange:
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
So widerrufen Sie das Recht:
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Erforderliche Berechtigungen für Warteschlangenoperationen
In der folgenden Tabelle sind die Berechtigungen zusammengefasst, die für häufige Warteschlangenoperationen erforderlich sind:
| Vorgang | Erforderliche Berechtigungen |
|---|---|
Nachrichten senden (DML INSERT oder Mutation API Send) |
INSERT in der Warteschlange |
Nachrichten empfangen (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE für die RECEIVE_QUEUE_NAME-Funktion |
Nachrichten-Lease verlängern (RENEWLEASE_QUEUE_NAME() TVF) |
EXECUTE für die RENEWLEASE_QUEUE_NAME-Funktion |
Nachrichten bestätigen oder löschen (DML DELETE oder Mutation API Ack oder Delete) |
DELETE in der Warteschlange |
Warteschlangendaten direkt lesen (SQL SELECT oder Read API) |
SELECT in der Warteschlange |
Beispiel: Producer- und Consumer-Rollen konfigurieren
Im folgenden Beispiel werden separate Datenbankrollen für einen Producer, einen Consumer und einen Auditor für eine Warteschlange mit dem Namen OrdersQueue konfiguriert:
GoogleSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;
PostgreSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;
INFORMATION_SCHEMA Aufrufe für Warteschlangen
In den folgenden Ansichten werden Informationen zu Datenbankrollen und ‑berechtigungen für Warteschlangen angezeigt:
- Datenbanken mit GoogleSQL-Dialekt:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - Datenbanken im PostgreSQL-Dialekt:
information_schema.table_privileges
Da Spanner Warteschlangen als Schemaobjekte auf Tabellenebene modelliert, werden Berechtigungen, die für Warteschlangen gewährt werden, in TABLE_PRIVILEGES angezeigt. Berechtigungen, die für Tabellenwertfunktionen für Warteschlangen gewährt wurden, werden in ROUTINE_PRIVILEGES angezeigt.
Die Zeilen in diesen Ansichten werden basierend auf den Berechtigungen der aktuellen Datenbankrolle gefiltert. So können Hauptkonten nur die Rollen, Berechtigungen und Warteschlangen sehen, auf die sie Zugriff haben.
Die Zeilenfilterung gilt auch für die folgenden Ansichten mit Warteschlangenmetadaten:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
Die Zeilenfilterung gilt auch für die Metadatenansichten für Tabellenwertfunktionen für Warteschlangen (RECEIVE_QUEUE_NAME und RENEWLEASE_QUEUE_NAME):
GoogleSQL
PostgreSQL
Die Systemrolle spanner_info_reader und ihre Mitglieder sehen immer einen ungefilterten INFORMATION_SCHEMA.
Einschränkungen und wichtige Aspekte
Separate Berechtigungen für die Ausführung von TVFs und direkte Warteschlangenabfragen: Wenn Sie
SELECTfür die Warteschlange gewähren, wird nicht automatischEXECUTEfür die zugehörigen Tabellenwertfunktionen (RECEIVE_QUEUE_NAMEoderRENEWLEASE_QUEUE_NAME) gewährt. Wenn SieEXECUTEfür die TVF gewähren, wird nicht automatischSELECTfür die Warteschlange gewährt.- Wenn eine Rolle mit nur
SELECTin der Warteschlange versucht,RECEIVE_QUEUE_NAME()auszuführen, gibt Spanner einen Fehler zurück, der besagt, dass die Rolle nicht die erforderlichen Berechtigungen für die TabellenfunktionRECEIVE_QUEUE_NAMEhat. - Wenn eine Rolle mit nur
EXECUTEfür die TVF versucht,SELECT * FROM QUEUE_NAMEauszuführen, gibt Spanner einen Fehler zurück, der besagt, dass die Rolle nicht die erforderlichen Berechtigungen für die WarteschlangeQUEUE_NAMEhat.
- Wenn eine Rolle mit nur
Unterschied zu Änderungsstreams: Im Gegensatz zu Änderungsstreams, für die sowohl
SELECTfür den Stream als auchEXECUTEfür die Lesefunktion erforderlich sind, benötigen Queue Message Consumers nurEXECUTEfür dieRECEIVE-TVF. Für die Warteschlange selbst ist keineSELECTerforderlich.Berechtigungen auf Spaltenebene werden nicht unterstützt: Im Gegensatz zu Tabellen unterstützt Spanner keine Berechtigungen auf Spaltenebene für Warteschlangen (z. B.
GRANT SELECT (COLUMN_NAME) ON QUEUE). Berechtigungen müssen für das gesamte Warteschlangenobjekt erteilt werden, da Warteschlangen interne Systemmetadatenspalten enthalten.Trennung von Ersteller- und Nutzerrollen: Wir empfehlen, separate Datenbankrollen für Nachrichtenersteller und Nachrichtennutzer zu definieren. Beispiel:
- Eine Erstellerrolle mit nur
INSERTin der Warteschlange. - Eine Verbraucherrolle mit
EXECUTEfür die FunktionenRECEIVE_QUEUE_NAMEundRENEWLEASE_QUEUE_NAMEsowieDELETEfür die Warteschlange, wenn Nachrichten mitDELETEoder der MutationAckbestätigt werden.
- Eine Erstellerrolle mit nur
Direkte DML im Vergleich zur TVF-Bereitstellung über die Warteschlange: Direkte
DELETE- oderUPDATE-Anweisungen umgehen die Warteschlangen-Leasing- und Bereitstellungsstatusmaschine. Wir empfehlen, diese Berechtigungen auf Administrator- oder Wartungsrollen zu beschränken.