É 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
VACUUMeNOTIFY. - Funções com efeitos colaterais. Isso significa que não é possível chamar uma
FUNCTIONou executar umPROCEDUREdefinido comoVOLATILEeLANGUAGE CouLANGUAGE internal, porque alguns dos efeitos colaterais não exigem um ID de transação. Exemplos sãopg_promote(),pg_cancel_backend()epg_terminate_backend(). - Wrappers de dados estrangeiros.
- Qualquer função ou procedimento criado em uma linguagem de procedimento SQL (PL, na sigla em inglês).
- Instruções como
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 paraoff:SET cloudsql_session_read_only = 'off'Definir a flag de volta para
offrestaura o acesso de gravação na sessão, exceto quando a flag está definida comolocked.SET cloudsql_session_read_only = 'locked'Definir a flag como
lockedtorna a sessão permanentemente somente leitura. Depois que a flag é definida comolocked, 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
FUNCTIONouPROCEDUREespecífica definida comoVOLATILEeLANGUAGE CouLANGUAGE internal. Para fazer isso, anexe umSECURITY LABELà função ou procedimento definido comoallow. - Para negar uma função específica na sessão, defina uma instrução
SECURITY LABELcomodeny. 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_sessionpermite 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/pgsqlepl/v8linguagens.
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
DROPnão remove nenhum rótulo atual. O segundo comandoCREATEapenas adiciona rótulos para as funções C voláteis na nova extensão.
A seguir
- Saiba mais sobre as flags do Cloud SQL para PostgreSQL.
- Saiba mais sobre as extensões do Cloud SQL para PostgreSQL.