Detaillierte Zugriffssteuerung für Warteschlangen

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:

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.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

Die Zeilenfilterung gilt auch für die Metadatenansichten für Tabellenwertfunktionen für Warteschlangen (RECEIVE_QUEUE_NAME und RENEWLEASE_QUEUE_NAME):

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 SELECT für die Warteschlange gewähren, wird nicht automatisch EXECUTE für die zugehörigen Tabellenwertfunktionen (RECEIVE_QUEUE_NAME oder RENEWLEASE_QUEUE_NAME) gewährt. Wenn Sie EXECUTE für die TVF gewähren, wird nicht automatisch SELECT für die Warteschlange gewährt.

    • Wenn eine Rolle mit nur SELECT in 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 Tabellenfunktion RECEIVE_QUEUE_NAME hat.
    • Wenn eine Rolle mit nur EXECUTE für die TVF versucht, SELECT * FROM QUEUE_NAME auszuführen, gibt Spanner einen Fehler zurück, der besagt, dass die Rolle nicht die erforderlichen Berechtigungen für die Warteschlange QUEUE_NAME hat.
  • Unterschied zu Änderungsstreams: Im Gegensatz zu Änderungsstreams, für die sowohl SELECT für den Stream als auch EXECUTE für die Lesefunktion erforderlich sind, benötigen Queue Message Consumers nur EXECUTE für die RECEIVE-TVF. Für die Warteschlange selbst ist keine SELECT erforderlich.

  • 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 INSERT in der Warteschlange.
    • Eine Verbraucherrolle mit EXECUTE für die Funktionen RECEIVE_QUEUE_NAME und RENEWLEASE_QUEUE_NAME sowie DELETE für die Warteschlange, wenn Nachrichten mit DELETE oder der Mutation Ack bestätigt werden.
  • Direkte DML im Vergleich zur TVF-Bereitstellung über die Warteschlange: Direkte DELETE- oder UPDATE-Anweisungen umgehen die Warteschlangen-Leasing- und Bereitstellungsstatusmaschine. Wir empfehlen, diese Berechtigungen auf Administrator- oder Wartungsrollen zu beschränken.

Nächste Schritte