Sou novo na criação de bancos de dados, e esse erro me deixou perplexo, pois sou super novo com coisas de administração de banco de dados (principalmente faço consultas de tipo de relatório). Eu criei um novo banco de dados através da GUI do pgAdmin3 e estou tentando criar objetos de banco de dados lá usando SQL, mas estou recebendo um:
ERROR: relation "replays" does not exist SQL state: 42P01
Dei uma olhada no manual, mas não encontrei nada muito útil, embora suspeite que possa ter a ver de search_path
alguma forma. Aqui está uma captura de tela. Alguma ideia do que estou fazendo de errado por favor?
O que você tinha originalmente era uma sintaxe correta - para tabelas , não para esquemas . Como você não tinha uma tabela (apelidada de 'relação' na mensagem de erro), ela gerou o erro não encontrado.
Vejo que você já percebeu isso - acredito que não há melhor maneira de aprender do que corrigir nossos próprios erros ;)
Mas há algo mais. O que você está fazendo acima é demais por um lado e insuficiente por outro.
Executando o script, você
SELECT
em todas as tabelas no esquema criado em (1.) para este novo role_CREATE
eUSAGE
) no novo esquema para a nova funçãoO problema está no ponto (3). Você concedeu privilégios em tabelas em
replays
- mas não há tabelas lá! Pode haver alguns no futuro, mas neste ponto o esquema está completamente vazio. Desta forma, oGRANT
in (3.) não faz nada - desta forma você está fazendo muito.Mas e as tabelas futuras?
Existe um comando para cobri-los:
ALTER DEFAULT PRIVILEGES
. Aplica-se não apenas às tabelas, mas:Há também uma limitação importante:
Isso significa que uma tabela criada por
alice
, que não é você nem uma função da qual você é membro (pode ser verificada, por exemplo, usando\du
empsql
), não terá os direitos de acesso prescritos. A cláusula opcionalFOR ROLE
é usada para especificar a função 'criador de tabela' da qual você é membro. Em muitos casos, isso implica que é uma boa ideia criar todos os objetos de banco de dados usando a mesma função - comomydatabase_owner
.Um pequeno exemplo para mostrar isso no trabalho:
Como você pode ver,
alice
não tem direitos explícitos sobre a última tabela. (Neste caso, ela ainda podeSELECT
da mesa, sendo um membro dopublic
pseudorole, mas não quis atrapalhar o exemplo revogando os direitos depublic
.)Falei com alguém que me ajudou a encontrar a resposta. A sintaxe correta é, para qualquer referência futura. A documentação menciona isso, embora possa ser fácil perder.