Criar sessões somente leitura do Cloud SQL para PostgreSQL

É possível criar uma sessão somente leitura do Cloud SQL para PostgreSQL usando o cloudsql_session_read_only parâmetro de sessão. Essa abordagem é uma maneira mais robusta de evitar a modificação de dados durante uma sessão do que as opções padrão somente leitura do PostgreSQL. Usando o cloudsql_session_read_only parâmetro, é possível tornar a sessão somente leitura temporariamente ou permanentemente durante a sessão. Você pode usar sessões somente leitura desse tipo para ajudar a proteger a integridade de dados em vários contextos, incluindo sessões em que você está usando ferramentas do Protocolo de Contexto de Modelo (MCP), ferramentas de relatórios e ferramentas de auditoria.

Por padrão, cloudsql_session_read_only é definido como off, o que permite a modificação de dados.

O que o modo somente leitura impede

Em uma sessão somente leitura, o banco de dados não pode modificar nenhum dado. Especificamente, o modo somente leitura impede o seguinte:

  • O modo somente leitura impede a geração de novos IDs de transação. Nenhuma transação gravável pode ser iniciada e, como resultado, nenhuma instrução de linguagem de manipulação de dados (DML) ou linguagem de definição de dados (DDL) pode ser executada. No entanto, se a flag for definida no meio de uma transação gravável ativa, as instruções básicas de DML e DDL poderão ser executadas até que a transação termine.

  • O modo somente leitura impede os seguintes tipos de instruções e chamadas:

    • Instruções como VACUUM e NOTIFY.
    • Funções com efeitos colaterais. Isso significa que não é possível chamar uma FUNCTION ou executar um PROCEDURE definido como VOLATILE e LANGUAGE C ou LANGUAGE internal, porque alguns dos efeitos colaterais não exigem um ID de transação. Exemplos são pg_promote(), pg_cancel_backend() e pg_terminate_backend().
    • Wrappers de dados estrangeiros.
    • Qualquer função ou procedimento criado em uma linguagem de procedimento SQL (PL, na sigla em inglês).

Configurar o status somente leitura

Durante uma sessão do Cloud SQL para PostgreSQL, é possível usar a instrução SET para mudar o valor da flag cloudsql_session_read_only da seguinte maneira:

  • SET cloudsql_session_read_only = 'on'

    Essa instrução torna a sessão somente leitura, impedindo que qualquer pessoa modifique os dados enquanto a flag permanecer definida como on. Para retomar a modificação de dados mais tarde na sessão, mude o valor de volta para off:

  • SET cloudsql_session_read_only = 'off'

    Definir a flag de volta para off restaura o acesso de gravação na sessão, exceto quando a flag está definida como locked.

  • SET cloudsql_session_read_only = 'locked'

    Definir a flag como locked torna a sessão permanentemente somente leitura. Depois que a flag é definida como locked, não é possível mudar a flag para qualquer outro valor durante a sessão.

Para tornar uma sessão permanentemente somente leitura assim que você se conectar ao banco de dados, incorpore a flag cloudsql_session_read_only na string de conexão da sessão:

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

Faça as seguintes substituições:

  • USER: o nome de usuário da pessoa que está criando a sessão.
  • PASSWORD: a senha do usuário.
  • HOST: o URL do host.
  • PORT: o número da porta.
  • DATABASE: o nome do banco de dados.

Essa abordagem tem a vantagem adicional de que, se você estiver tentando se conectar a uma versão mais antiga do Cloud SQL que não oferece suporte a sessões somente leitura, a conexão falhará.

Também é possível negar o acesso de gravação a um usuário de banco de dados específico para todas as conexões futuras, como esta:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

Substitua USERNAME pelo nome de usuário da pessoa cujo acesso você quer restringir ao modo somente leitura.

Ativar funções específicas em sessões somente leitura

  • É possível ativar o uso de uma FUNCTION ou PROCEDURE específica definida como VOLATILE e LANGUAGE C ou LANGUAGE internal. Para fazer isso, anexe um SECURITY LABEL à função ou procedimento definido como allow.
  • Para negar uma função específica na sessão, defina uma instrução SECURITY LABEL como deny.
  • Para permitir funções que não afetam o estado global, crie um grupo predefinido de rótulos de segurança:

    CREATE EXTENSION "google_read_only_session"
    

    A extensão google_read_only_session permite o seguinte:

    • Todas as funções C voláteis integradas permitidas para o modo somente leitura.
    • Todas as funções permitidas para o modo somente leitura que são de extensões carregadas no banco de dados, incluindo as funções de handler para pl/pgsql e pl/v8 linguagens.

    Se você instalar uma ou mais novas extensões depois, para aplicar rótulos de grupo, solte e recrie a extensão google_read_only_session:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    O comando DROP não remove nenhum rótulo atual. O segundo comando CREATE apenas adiciona rótulos para as funções C voláteis na nova extensão.

A seguir