Créer des sessions en lecture seule Cloud SQL pour PostgreSQL

Vous pouvez créer une session Cloud SQL pour PostgreSQL en lecture seule à l'aide du paramètre de session cloudsql_session_read_only. Cette approche est plus robuste que les options PostgreSQL en lecture seule standards pour empêcher la modification des données pendant une session. À l'aide du paramètre cloudsql_session_read_only, vous pouvez rendre la session en lecture seule de manière temporaire ou permanente pendant toute la durée de la session. Vous pouvez utiliser des sessions en lecture seule de ce type pour protéger l'intégrité des données dans différents contextes, y compris les sessions dans lesquelles vous utilisez des outils MCP (Model Context Protocol), des outils de création de rapports et des outils d'audit.

Par défaut, cloudsql_session_read_only est défini sur off, ce qui autorise la modification des données.

Ce que le mode lecture seule empêche

Dans une session en lecture seule, la base de données ne peut modifier aucune donnée. Plus précisément, le mode lecture seule empêche les opérations suivantes :

  • Le mode lecture seule empêche la génération de nouveaux ID de transaction. Aucune transaction en écriture ne peut être démarrée. Par conséquent, aucune instruction LMD (langage de manipulation de données) ni LDD (langage de définition de données) ne peut être exécutée. Toutefois, si l'option est définie au milieu d'une transaction en écriture active, les instructions LMD et LDD de base peuvent être exécutées jusqu'à la fin de la transaction.

  • Le mode lecture seule empêche les types d'instructions et d'appels suivants :

    • Instructions telles que VACUUM et NOTIFY.
    • Fonctions avec effets secondaires. Cela signifie que vous ne pouvez pas appeler une FUNCTION ni exécuter une PROCEDURE définie à la fois comme VOLATILE et LANGUAGE C ou LANGUAGE internal, car certains de leurs effets secondaires ne nécessitent pas d'ID de transaction. Par exemple, pg_promote(), pg_cancel_backend() et pg_terminate_backend().
    • Wrappers de données étrangers.
    • Toute fonction ou procédure que vous avez créée dans un langage procédural SQL (PL).

Configurer l'état en lecture seule

Lors d'une session Cloud SQL pour PostgreSQL, vous pouvez utiliser l'instruction SET pour modifier la valeur de l'option cloudsql_session_read_only comme suit :

  • SET cloudsql_session_read_only = 'on'

    Cette instruction rend la session en lecture seule, empêchant quiconque de modifier les données tant que l'option reste définie sur on. Pour reprendre la modification des données plus tard dans la session, redéfinissez la valeur sur off :

  • SET cloudsql_session_read_only = 'off'

    Lorsque l'option est redéfinie sur off, l'accès en écriture est rétabli dans la session, sauf lorsque l'option est définie sur locked.

  • SET cloudsql_session_read_only = 'locked'

    Lorsque l'option est définie sur locked, la session est en lecture seule de manière permanente. Une fois l'option définie sur locked, vous ne pouvez plus la modifier pendant toute la durée de la session.

Pour qu'une session soit en lecture seule de manière permanente dès que vous vous connectez à la base de données, intégrez l'option cloudsql_session_read_only dans la chaîne de connexion de la session :

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

Effectuez les remplacements suivants :

  • USER : nom de l'utilisateur qui crée la session.
  • PASSWORD : mot de passe de l'utilisateur.
  • HOST : URL de l'hôte.
  • PORT : numéro de port.
  • DATABASE : nom de la base de données.

Cette approche présente l'avantage supplémentaire que si vous essayez de vous connecter à une ancienne version de Cloud SQL qui n'est pas compatible avec les sessions en lecture seule, la connexion échoue.

Vous pouvez également refuser l'accès en écriture à un utilisateur de base de données spécifique pour toutes les connexions futures, comme suit :

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

Remplacez USERNAME par le nom d'utilisateur dont vous souhaitez limiter l'accès à la lecture seule.

Activer des fonctions spécifiques dans les sessions en lecture seule

  • Vous pouvez activer l'utilisation d'une FUNCTION ou d'une PROCEDURE particulière définie à la fois comme VOLATILE et LANGUAGE C ou LANGUAGE internal. Pour ce faire, associez un SECURITY LABEL à la fonction ou à la procédure définie sur allow.
  • Pour interdire une fonction particulière dans la session, définissez une instruction SECURITY LABEL sur deny.
  • Pour autoriser les fonctions qui n'affectent pas l'état global, créez un groupe prédéfini de libellés de sécurité :

    CREATE EXTENSION "google_read_only_session"
    

    L'extension google_read_only_session permet les opérations suivantes :

    • Toutes les fonctions C volatiles intégrées autorisées pour le mode lecture seule.
    • Toutes les fonctions autorisées pour le mode lecture seule qui proviennent d'extensions chargées dans la base de données, y compris les fonctions de gestionnaire pour les langages pl/pgsql et pl/v8.

    Si vous installez une ou plusieurs nouvelles extensions par la suite, pour appliquer des libellés de groupe, supprimez et recréez l'extension google_read_only_session :

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    La commande DROP ne supprime aucun libellé existant. La deuxième commande CREATE ajoute simplement des libellés pour les fonctions C volatiles dans la nouvelle extension.

Étape suivante