En esta página, se explica cómo funciona el control de acceso detallado con las colas de Spanner para las bases de datos con dialecto de GoogleSQL y las bases de datos con dialecto de PostgreSQL.
En Spanner, una cola se define como un objeto de esquema. El acceso para enviar mensajes, recibir mensajes, extender concesiones de mensajes, confirmar y borrar mensajes, o consultar colas directamente cumple con los roles y privilegios estándar de la base de datos de Spanner.
Subsidios para enviar mensajes (productores)
Para enviar mensajes a una cola con DML (INSERT INTO) o la API de Mutation (consulta la declaración Insert), otorga el privilegio INSERT en la cola al rol de la base de datos:
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Para revocar el privilegio, haz lo siguiente:
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Permisos para recibir mensajes (consumidores)
Para transmitir mensajes desde una cola, los trabajadores consumidores ejecutan la función con valor de tabla (TVF) RECEIVE_QUEUE_NAME() con ExecuteStreamingSQL.
Para permitir que un rol de base de datos transmita mensajes desde la cola, otorga EXECUTE en la función RECEIVE_QUEUE_NAME creada automáticamente:
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;
Para revocar el privilegio, haz lo siguiente:
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;
Llamar a RECEIVE_QUEUE_NAME() solo requiere EXECUTE en el TVF; no requiere SELECT en la cola.
Extiende los arrendamientos de mensajes
Cuando un consumidor recibe un mensaje, Spanner asigna un arrendamiento inicial de 10 segundos. Si el procesamiento del mensaje tarda más que el arrendamiento inicial, el consumidor debe extender el arrendamiento con la TVF RENEWLEASE_QUEUE_NAME().
Para extender los arrendamientos, el rol debe tener EXECUTE en la función RENEWLEASE_QUEUE_NAME:
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;
Para revocar el privilegio, haz lo siguiente:
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;
La llamada a RENEWLEASE_QUEUE_NAME() solo requiere EXECUTE en el TVF; no requiere SELECT en la cola.
Para obtener más información sobre cómo recibir mensajes y extender concesiones, consulta Usa colas.
Permisos para consultar colas directamente
Para leer o inspeccionar mensajes directamente desde una cola con SQL estándar (SELECT * FROM QUEUE_NAME) o la API de Read, otorga el privilegio SELECT en la cola:
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Para revocar el privilegio, haz lo siguiente:
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Otorgar SELECT en la cola permite consultar la cola como una tabla, pero no otorga EXECUTE en RECEIVE_QUEUE_NAME() ni en RENEWLEASE_QUEUE_NAME().
Permisos para confirmar y borrar mensajes
Para confirmar la recepción o borrar mensajes de una cola con DML (DELETE FROM) o la API de Mutation (Ack o Delete), otorga el privilegio DELETE en la cola:
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
Para revocar el privilegio, haz lo siguiente:
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Privilegios necesarios para las operaciones de filas
En la siguiente tabla, se resumen los privilegios necesarios para las operaciones comunes de la cola:
| Operación | Privilegios obligatorios |
|---|---|
Enviar mensajes (DML INSERT o API de Mutation Send) |
INSERT en la fila |
Recibir mensajes (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE en la función RECEIVE_QUEUE_NAME |
Extender la concesión de mensajes (TVF RENEWLEASE_QUEUE_NAME()) |
EXECUTE en la función RENEWLEASE_QUEUE_NAME |
Confirmar o borrar mensajes (DML DELETE o API de Mutation Ack o Delete) |
DELETE en la fila |
Leer datos de la fila directamente (SQL SELECT o API de Read) |
SELECT en la fila |
Ejemplo: Configura los roles de productor y consumidor
En el siguiente ejemplo, se configuran roles de base de datos separados para un productor, un consumidor y un auditor en una cola llamada OrdersQueue:
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 vistas para las colas
En las siguientes vistas, se muestra información sobre los roles y privilegios de la base de datos para las colas:
- Bases de datos con dialecto de GoogleSQL:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - Bases de datos con dialecto de PostgreSQL:
information_schema.table_privileges
Dado que Spanner modela las colas como objetos de esquema a nivel de la tabla, los privilegios otorgados en las colas aparecen en TABLE_PRIVILEGES. Los privilegios otorgados en las funciones de tabla valoradas de la cola aparecen en ROUTINE_PRIVILEGES.
Las filas de estas vistas se filtran según los privilegios del rol de la base de datos actual. Esto garantiza que las entidades principales solo puedan ver los roles, los privilegios y las colas a los que tienen acceso.
El filtrado de filas también se aplica a las siguientes vistas de metadatos de la cola:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
El filtrado de filas también se aplica a las vistas de metadatos para las funciones con valores de tabla de la cola (RECEIVE_QUEUE_NAME y RENEWLEASE_QUEUE_NAME):
GoogleSQL
PostgreSQL
El rol del sistema spanner_info_reader y sus miembros siempre ven un INFORMATION_SCHEMA sin filtrar.
Advertencias y consideraciones
Privilegios distintos para la ejecución de TVF y las consultas directas a la cola: Otorgar
SELECTen la cola no otorgaEXECUTEen las funciones con valores de tabla asociadas (RECEIVE_QUEUE_NAMEoRENEWLEASE_QUEUE_NAME). Del mismo modo, otorgarEXECUTEen la TVF no otorgaSELECTen la cola.- Si un rol con solo
SELECTen la cola intenta ejecutarRECEIVE_QUEUE_NAME(), Spanner muestra un error que indica que el rol no tiene los privilegios necesarios en la función de tablaRECEIVE_QUEUE_NAME. - Si un rol con solo
EXECUTEen la TVF intenta ejecutarSELECT * FROM QUEUE_NAME, Spanner devuelve un error que indica que el rol no tiene los privilegios necesarios en la colaQUEUE_NAME.
- Si un rol con solo
Diferencia con las transmisiones de cambios: A diferencia de las transmisiones de cambios (que requieren
SELECTen la transmisión yEXECUTEen la función de lectura), los consumidores de mensajes de la cola solo requierenEXECUTEen la TVFRECEIVE. No requierenSELECTen la cola.No se admiten privilegios a nivel de la columna: A diferencia de las tablas, Spanner no admite privilegios a nivel de la columna en las colas (como
GRANT SELECT (COLUMN_NAME) ON QUEUE). Los privilegios se deben otorgar en el objeto de la cola en su totalidad, ya que las colas incluyen columnas de metadatos internos del sistema.Separación de roles de productor y consumidor: Recomendamos definir roles de base de datos separados para los productores y los consumidores de mensajes. Por ejemplo:
- Un rol de productor con solo
INSERTen la cola. - Un rol de consumidor con
EXECUTEen las funcionesRECEIVE_QUEUE_NAMEyRENEWLEASE_QUEUE_NAME, además deDELETEen la cola si se confirman mensajes conDELETEo la mutaciónAck.
- Un rol de productor con solo
DML directa frente a la entrega de TVF en cola: Las instrucciones
DELETEoUPDATEdirectas omiten la máquina de estados de arrendamiento y entrega de la cola. Recomendamos restringir estos privilegios a los roles administrativos o de mantenimiento.