GRANT
s em objetos diferentes são separados. GRANT
ndo em um banco de dados não GRANT
direitos para o esquema dentro. Da mesma forma, GRANT
ing em um esquema não concede direitos nas tabelas dentro. Se você tiver direitos para
SELECT
de uma tabela, mas não o direito de vê-lo no esquema que o contém, você não poderá acessar a tabela. Os testes de direitos são feitos na ordem:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Sua confusão pode surgir do fato de que o
public
esquema tem um padrão GRANT
de todos os direitos à função public
, do qual cada usuário/grupo é membro. Então todo mundo já tem uso nesse esquema. A frase:
(assumindo que os próprios requisitos de privilégio dos objetos também são atendidos)
Está dizendo que você deve ter
USAGE
em um esquema para usar objetos dentro dele, mas tendo USAGE
em um esquema não é por si só suficiente para usar os objetos dentro do esquema, você também deve ter direitos sobre os próprios objetos. É como uma árvore de diretórios. Se você criar um diretório
somedir
com arquivo somefile
dentro dele então defina-o para que apenas seu próprio usuário possa acessar o diretório ou o arquivo (modo rwx------
no diretório, modo rw-------
no arquivo), ninguém mais poderá listar o diretório para ver se o arquivo existe. Se você conceder direitos de leitura mundial no arquivo (modo
rw-r--r--
), mas não alterar as permissões do diretório, não faria diferença. Ninguém podia ver o arquivo para lê-lo, porque eles não têm o direito de listar o diretório. Se você definir
rwx-r-xr-x
no diretório, definindo-o para que as pessoas possam listar e percorrer o diretório, mas sem alterar as permissões do arquivo, as pessoas podem listar o arquivo, mas não pôde ler porque eles não teriam acesso ao arquivo. Você precisa definir ambos permissões para que as pessoas possam realmente visualizar o arquivo.
Mesma coisa na pág. Você precisa do esquema
USAGE
direitos e direitos de objeto para executar uma ação em um objeto, como SELECT
de uma mesa. (A analogia cai um pouco porque o PostgreSQL ainda não tem segurança em nível de linha, então o usuário ainda pode "ver" que a tabela existe no esquema por
SELECT
ndo de pg_class
diretamente. Eles não podem interagir com isso de forma alguma, então é apenas a parte da "lista" que não é exatamente a mesma.)