AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

错误 42P01:关系不存在

  • 772

我是创建数据库的新手,这个错误让我目瞪口呆,因为我对数据库管理非常陌生(我主要做报告类型查询)。我通过 pgAdmin3 GUI 创建了一个新数据库,我正在尝试使用 SQL 在其中创建 DB 对象,但得到了:

ERROR: relation "replays" does not exist
SQL state: 42P01

我浏览了手册,但没有发现任何很有帮助的东西,尽管我怀疑它可能与search_path某种方式有关。这是一个屏幕截图。知道我做错了什么吗?

42P01

postgresql schema
  • 2 2 个回答
  • 111388 Views

2 个回答

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

    您最初拥有的是正确的语法——用于表,而不是用于模式。由于您没有表格(在错误消息中称为“关系”),因此它引发了未找到错误。

    我看到你已经注意到了这一点——我相信没有比纠正我们自己的错误更好的学习方法了;)

    但还有更多。您在上面所做的一方面太多,另一方面还不够。

    运行脚本,你

    1. 创建架构
    2. 创建角色
    3. 将(1.) 中创建SELECT 的架构中的所有表授予此新角色_
    4. 最后,将新模式的所有特权(CREATE和USAGE)授予新角色

    问题出在第 (3) 点之内。您授予了对其中表的权限replays- 但那里没有表!将来可能会有一些,但此时模式是完全空的。这样,GRANTin (3.) 什么都不做——这样你做的太多了。

    但是未来的桌子呢?

    有一个覆盖它们的命令:ALTER DEFAULT PRIVILEGES. 它不仅适用于表格,还适用于:

    目前[截至 9.4],只能更改表(包括视图和外部表)、序列、函数和类型(包括域)的权限。

    还有一个重要的限制:

    您只能更改将由您自己或您所属的角色创建的对象的默认权限。

    这意味着由alice既不是您也不是您的成员的角色(可以检查,例如,通过使用\duin psql)创建的表将不会获得规定的访问权限。可选FOR ROLE子句用于指定您所属的“表创建者”角色。在许多情况下,这意味着使用相同的角色创建所有数据库对象是一个好主意 - 类似mydatabase_owner.

    一个在工作中展示这一点的小例子:

    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 │                   │ 
    

    如您所见,alice对后一个表没有明确的权限。(在这种情况下,SELECT作为伪角色的成员,她仍然可以从表中退出public,但我不想通过撤销来自 的权利来混淆示例public。)

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

    我与帮助我找到答案的人交谈。正确的语法是,供以后的任何人参考。文档中提到了它,尽管它很容易被忽略。

    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

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve