Crea sesiones de Cloud SQL para PostgreSQL de solo lectura

Puedes crear una sesión de Cloud SQL para PostgreSQL de solo lectura con el cloudsql_session_read_only parámetro de sesión. Este enfoque es una forma más sólida de evitar la modificación de datos durante una sesión que las opciones de solo lectura estándar de PostgreSQL. Con el parámetro cloudsql_session_read_only, puedes hacer que la sesión sea de solo lectura de forma temporal o permanente durante la sesión. Puedes usar sesiones de solo lectura de este tipo para proteger la integridad de los datos en varios contextos, incluidas las sesiones en las que usas herramientas del Protocolo de contexto del modelo (MCP), herramientas de informes y herramientas de auditoría.

De forma predeterminada, cloudsql_session_read_only se establece en off, lo que permite la modificación de datos.

Qué impide el modo de solo lectura

En una sesión de solo lectura, la base de datos no puede modificar ningún dato. En particular, el modo de solo lectura impide lo siguiente:

  • El modo de solo lectura impide la generación de IDs de transacción nuevos. No se pueden iniciar transacciones de escritura y, como resultado, no se pueden ejecutar instrucciones de lenguaje de manipulación de datos (DML) ni de lenguaje de definición de datos (DDL). Sin embargo, si la marca se establece en medio de una transacción de escritura activa, se pueden ejecutar instrucciones básicas de DML y DDL hasta que finalice la transacción.

  • El modo de solo lectura impide los siguientes tipos de instrucciones y llamadas:

    • Instrucciones como VACUUM y NOTIFY.
    • Funciones con efectos secundarios. Esto significa que no puedes llamar a una FUNCTION ni ejecutar un PROCEDURE que se defina como VOLATILE y LANGUAGE C o LANGUAGE internal, ya que algunos de sus efectos secundarios no requieren un ID de transacción. Algunos ejemplos son pg_promote(), pg_cancel_backend() y pg_terminate_backend().
    • Wrappers de datos externos.
    • Cualquier función o procedimiento que hayas creado en un lenguaje de procedimiento SQL (PL).

Configura el estado de solo lectura

Durante una sesión de Cloud SQL para PostgreSQL, puedes usar la instrucción SET para cambiar el valor de la marca cloudsql_session_read_only de la siguiente manera:

  • SET cloudsql_session_read_only = 'on'

    Esta instrucción hace que la sesión sea de solo lectura, lo que impide que cualquier persona modifique los datos mientras la marca permanezca establecida en on. Para reanudar la modificación de datos más adelante en la sesión, vuelve a cambiar el valor a off:

  • SET cloudsql_session_read_only = 'off'

    Si vuelves a establecer la marca en off, se restablece el acceso de escritura en la sesión, excepto cuando la marca se establece en locked.

  • SET cloudsql_session_read_only = 'locked'

    Si estableces la marca en locked, la sesión será de solo lectura de forma permanente. Una vez que la marca se establece en locked, no puedes cambiarla a ningún otro valor durante la sesión.

Para que una sesión sea de solo lectura de forma permanente en cuanto te conectes a la base de datos, incorpora la marca cloudsql_session_read_only en la cadena de conexión de la sesión:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked

Realiza los siguientes reemplazos:

  • USER: El nombre de usuario del usuario que crea la sesión.
  • PASSWORD: La contraseña del usuario.
  • HOST: La URL del host.
  • PORT: El número de puerto.
  • DATABASE: El nombre de la base de datos.

Este enfoque tiene la ventaja adicional de que, si intentas conectarte a una versión anterior de Cloud SQL que no admite sesiones de solo lectura, la conexión falla.

También puedes denegar el acceso de escritura a un usuario de base de datos específico para todas las conexiones futuras, de la siguiente manera:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

Reemplaza USERNAME por el nombre de usuario del usuario cuyo acceso deseas restringir a solo lectura.

Habilita funciones específicas en sesiones de solo lectura

  • Puedes habilitar el uso de una FUNCTION o PROCEDURE en particular definida como VOLATILE y LANGUAGE C o LANGUAGE internal. Para ello, adjunta una SECURITY LABEL a la función o al procedimiento que se establece en allow.
  • Para rechazar una función en particular en la sesión, establece una instrucción SECURITY LABEL en deny.
  • Para permitir funciones que no afectan el estado global, crea un grupo predefinido de etiquetas de seguridad:

    CREATE EXTENSION "google_read_only_session"
    

    La extensión google_read_only_session habilita lo siguiente:

    • Todas las funciones volátiles integradas de C que se permiten para el modo de solo lectura.
    • Todas las funciones permitidas para el modo de solo lectura que provienen de extensiones cargadas en la base de datos, incluidas las funciones de controlador para los lenguajes pl/pgsql y pl/v8

    Si instalas una o más extensiones nuevas después, para aplicar etiquetas de grupo, quita y vuelve a crear la extensión google_read_only_session:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    El comando DROP no quita ninguna etiqueta existente. El segundo comando CREATE solo agrega etiquetas para las funciones volátiles de C en la extensión nueva.

¿Qué sigue?