AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 101570
Accepted
Phrancis
Phrancis
Asked: 2015-05-15 17:44:01 +0800 CST2015-05-15 17:44:01 +0800 CST 2015-05-15 17:44:01 +0800 CST

Erro 42P01: relação não existe

  • 772

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_pathalguma forma. Aqui está uma captura de tela. Alguma ideia do que estou fazendo de errado por favor?

42P01

postgresql schema
  • 2 2 respostas
  • 111388 Views

2 respostas

  • Voted
  1. Best Answer
    dezso
    2015-10-10T06:20:54+08:002015-10-10T06:20:54+08:00

    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ê

    1. criar um esquema
    2. crie um papel
    3. grant SELECT em todas as tabelas no esquema criado em (1.) para este novo role_
    4. e, finalmente, conceda todos os privilégios ( CREATEe USAGE) no novo esquema para a nova função

    O 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, o GRANTin (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:

    Atualmente [a partir de 9.4] , apenas os privilégios para tabelas (incluindo visualizações e tabelas estrangeiras), sequências, funções e tipos (incluindo domínios) podem ser alterados.

    Há também uma limitação importante:

    Você pode alterar os privilégios padrão apenas para objetos que serão criados por você ou por funções das quais você é membro.

    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 \duem psql), não terá os direitos de acesso prescritos. A cláusula opcional FOR 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 - como mydatabase_owner.

    Um pequeno exemplo para mostrar isso no trabalho:

    CREATE ROLE test_owner; -- cannot log in
    CREATE SCHEMA replays AUTHORIZATION test_owner;
    GRANT ALL ON SCHEMA replays TO test_owner;
    
    SET ROLE TO test_owner; -- here we change the context, 
                            -- so that the next statement is issued as the owner role
    
    ALTER DEFAULT PRIVILEGES IN SCHEMA replays GRANT SELECT ON TABLES TO alice;
    
    CREATE TABLE replays.replayer (r_id serial PRIMARY KEY);
    
    RESET ROLE; -- changing the context back to the original role
    
    CREATE TABLE replays.replay_event (re_id serial PRIMARY KEY);
    
    -- and now compare the two
    
    \dp replays.replayer
                                       Access privileges
     Schema  │   Name   │ Type  │       Access privileges       │ Column access privileges 
    ─────────┼──────────┼───────┼───────────────────────────────┼──────────────────────────
     replays │ replayer │ table │ alice=r/test_owner           ↵│ 
             │          │       │ test_owner=arwdDxt/test_owner │ 
    
    \dp replays.replay_event
                                   Access privileges
     Schema  │     Name     │ Type  │ Access privileges │ Column access privileges 
    ─────────┼──────────────┼───────┼───────────────────┼──────────────────────────
     replays │ replay_event │ table │                   │ 
    

    Como você pode ver, alicenão tem direitos explícitos sobre a última tabela. (Neste caso, ela ainda pode SELECTda mesa, sendo um membro do publicpseudorole, mas não quis atrapalhar o exemplo revogando os direitos de public.)

    • 8
  2. Phrancis
    2015-05-15T18:07:21+08:002015-05-15T18:07:21+08:00

    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.

    START TRANSACTION;
    DROP SCHEMA IF EXISTS replays CASCADE;
    CREATE SCHEMA replays;
    CREATE ROLE admins WITH
        PASSWORD 'changeme';
    GRANT SELECT ON ALL TABLES IN SCHEMA replays TO PUBLIC;
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA replays TO admins;
    COMMIT;
    
    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve