Com base no exemplo abaixo, parece que não seria possível?
Digamos que você tenha duas tabelas em seu banco de dados PostgreSQL (D): tabela A e tabela B. A política é que qualquer pessoa pode ler ou inserir na tabela A e na tabela B. O banco de dados PostgreSQL (D) existe em um servidor de banco de dados PostgreSQL ( S)
Você tem uma versão 1.00 de um servidor Python (Azul) que se conecta a esse banco de dados PostgreSQL (D) por meio do servidor PostgreSQL (S).
Você implanta a nova versão (1.10) do seu servidor Python (Verde). Ele se conecta ao mesmo banco de dados PostgreSQL (D) por meio do mesmo servidor PostgreSQL (S). No processo de implantação da nova versão do servidor Python, você altera a política por meio de uma migração. Agora, qualquer pessoa só pode ler ou inserir na tabela A.
Portanto, ao final desta implantação, você terá duas versões do servidor Python em execução (azul e verde), cada uma delas conectada ao mesmo banco de dados PostgreSQL (D) por meio do mesmo servidor PostgreSQL (S). Conforme abordado acima, o banco de dados PostgreSQL (D) agora possui uma política que permite apenas ler ou inserir na tabela A. A capacidade de ler ou inserir na tabela B foi eliminada.
Um usuário tenta inserir na tabela B por meio do servidor Python (Azul). Ele receberá um erro de permissão porque está tentando inserir na tabela B, mas a política do banco de dados não permite isso. Esta é uma mudança radical.
Se a autorização fosse fornecida pelo servidor e não pelo banco de dados, pareceria que esse problema desapareceria.
- O azul permitiria a inserção na tabela B
- Verde não permitiria a inserção na tabela B
Portanto, nenhuma alteração significativa ocorreria.
Ok, entendido, você tem dois servidores de aplicativos conectados ao mesmo servidor de banco de dados e ao mesmo banco de dados.
A segurança em nível de linha permite que você defina a lógica que deseja usar para permitir ou negar instruções DQL e DML em relação a um objeto, por exemplo, tabela. Normalmente, essa lógica é baseada nos usuários que se conectam ao banco de dados. Mas, no seu caso, parece que você deseja que ele dependa do servidor de aplicativos que se conecta ao banco de dados, o que também é possível.
Falando especificamente do SQL Server (mas tenho certeza que o PostgreSQL tem uma metodologia semelhante), existe uma função do sistema chamada
HOST_NAME()
que retornará o nome da máquina que está conectada ao servidor de banco de dados. No seu caso, seriam os servidores de aplicativos Python.Em sua lógica de segurança em nível de linha, você verificaria essa função para determinar se o servidor conectado tem acesso ou não. Eu recomendaria armazenar os nomes dos servidores Python em uma tabela segura, para que eles possam ser gerenciados mais facilmente (em vez de codificá-los na política de segurança em nível de linha).
Isso permitiria que você permitisse o acesso de um servidor Python, enquanto negava o outro, em tempo real.