Control de acceso detallado para las filas

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:

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

PostgreSQL

  • information_schema.tables
  • information_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):

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 SELECT en la cola no otorga EXECUTE en las funciones con valores de tabla asociadas (RECEIVE_QUEUE_NAME o RENEWLEASE_QUEUE_NAME). Del mismo modo, otorgar EXECUTE en la TVF no otorga SELECT en la cola.

    • Si un rol con solo SELECT en la cola intenta ejecutar RECEIVE_QUEUE_NAME(), Spanner muestra un error que indica que el rol no tiene los privilegios necesarios en la función de tabla RECEIVE_QUEUE_NAME.
    • Si un rol con solo EXECUTE en la TVF intenta ejecutar SELECT * FROM QUEUE_NAME, Spanner devuelve un error que indica que el rol no tiene los privilegios necesarios en la cola QUEUE_NAME.
  • Diferencia con las transmisiones de cambios: A diferencia de las transmisiones de cambios (que requieren SELECT en la transmisión y EXECUTE en la función de lectura), los consumidores de mensajes de la cola solo requieren EXECUTE en la TVF RECEIVE. No requieren SELECT en 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 INSERT en la cola.
    • Un rol de consumidor con EXECUTE en las funciones RECEIVE_QUEUE_NAME y RENEWLEASE_QUEUE_NAME, además de DELETE en la cola si se confirman mensajes con DELETE o la mutación Ack.
  • DML directa frente a la entrega de TVF en cola: Las instrucciones DELETE o UPDATE directas omiten la máquina de estados de arrendamiento y entrega de la cola. Recomendamos restringir estos privilegios a los roles administrativos o de mantenimiento.

¿Qué sigue?