В postgresql какая разница между базой данных и отношением? («отношение ошибок x не существует», «база данных ошибок x уже существует»)

Я вижу наложение этих двух ошибок и, учитывая недостаток результатов поиска Google, должен был спросить. В чем разница и что мне здесь нужно делать?

deploy=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist
deploy=# create database angel_research_production;
ERROR:  database "angel_research_production" already exists

Я предполагаю, что мне нужно делать этот выбор гранта от какого-то другого пользователя...

Итак, я запускаю это на postgres (dbroot) и получаю следующее:

postgres=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist

Так что он существует как база данных, но не как отношение. Как я могу исправить это и каковы основные проблемы здесь? Я немного ошеломлен. Спасибо


person boulder_ruby    schedule 02.09.2012    source источник
comment
Я думаю, что он ожидает таблицу или схему, а не базу данных.   -  person Mike Christensen    schedule 02.09.2012
comment
Что со смертью результатов поиска Google? Любопытно узнать...   -  person nemesisfixx    schedule 18.04.2013
comment
голод, а не смерть. недостаток означает «отсутствие»   -  person boulder_ruby    schedule 26.04.2013


Ответы (2)


Я предполагаю, что вы действительно хотите рекурсивно GRANT SELECT право на каждое отношение (таблицу и представление) в базе данных angel_research_production. Правильный?

Как предоставить доступ ко всем таблицам в базе данных

Если да, то в PostgreSQL 9.0 и выше у вас есть:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

из руководства по GRANT. Обратите внимание на пункт ALL TABLES IN SCHEMA. Использование:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;

Если все ваши пользовательские объекты находятся в public схеме ( см. ниже) это поможет.

В предыдущих версиях такой функции нет, но ">определяемые пользователем функции существуют как обходные пути.

Pg 9.0 также имеет ИЗМЕНЕНИЕ ПРИВИЛЕГИЙ ПО УМОЛЧАНИЮ, что изменяет права по умолчанию, назначенные только что созданным объектам. Это не влияет на существующие объекты.

Что означает сообщение об ошибке?

Как отмечает TokenMacGuy, отношение — это таблица или представление, а не база данных.

GRANT SELECT ON angel_research_production TO angel_research;

можно рассматривать как сокращение для:

GRANT SELECT ON TABLE angel_research_production TO angel_research
                ^^^^^

и эта таблица (связь) не существует, поэтому вы получаете сообщение об ошибке, указанное выше.

В руководстве по GRANT или в выходных данных psql \h GRANT вы найдете видеть:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Это показывает, что привилегии, которые вы можете GRANT для базы данных, равны CREATE, CONNECT и TEMPORARY. Нет права SELECT на базу данных.

Связи? Схема? Хм?

В Pg есть четыре уровня организации:

  • Кластер – управляется постмастером, принимает подключения по заданному IP-адресу. Комбинация /port содержит одну или несколько баз данных, включая встроенные базы данных template0, template1 и postgres. Контролируется postgresql.conf и pg_hba.conf. Ваш кластер БД часто создается для вас установщиком или пакетом. Не путать с обычным значением слова cluster как вычислительного кластера или общим значение английского языка.

  • База данных — содержит одну или несколько схем или схемы. Вы подключаетесь к определенной базе данных при подключении к Pg.

  • Схема — содержит объекты, включая < em>отношения. Если вы не укажете иное, все, что создано пользователем, попадает в схему public. Запросы могут явно ссылаться на объекты в нескольких схемах или через search_path, неявно.

  • Объекты — в некоторой степени специфичные для PostgreSQL, все (включая отношения), которые существует в схеме.

    • Отношения — вещи, которые выглядят и ведут себя как таблицы, такие как представления и таблицы

    • Другие объекты также находятся в схемах, таких как функции, приведения, индексы, последовательности, операторы, агрегаты и т. д.

person Craig Ringer    schedule 02.09.2012
comment
@putin2012 Обучение через Интернет часто является лучшим способом, вам просто нужно правильно выбрать ресурсы. Я настоятельно рекомендую вам прочитать документацию PostgreSQL от корки до корки, она научит вас многому о SQL и базах данных в целом. - person Craig Ringer; 06.09.2012
comment
последний раздел -- ???????????????? - person Jeremy; 08.06.2018

отношение — это таблица (или что-то похожее на нее, например, представление), т. е. набор строк с одинаковыми полями и определенным именем для ссылки на них.

База данных — это набор отношений и других объектов (таких как триггеры, функции и правила), которые хранятся вместе в некоторой логической группе.

person SingleNegationElimination    schedule 02.09.2012
comment
+1 Обратите внимание, что это также обычная номенклатура реляционных баз данных; эти термины не относятся к PostgreSQL. - person Adam Robinson; 02.09.2012
comment
Есть еще промежуточный уровень, схема. На самом деле база данных — это набор схем, а схема — это набор отношений (таблицы + представления) и — в PostgreSQL — другие объекты, такие как определяемые пользователем функции, определения приведения, операторы, агрегаты и т. д. В Pg public схема содержит все пользовательские объекты, не размещенные явно в другом месте, схема pg_catalog содержит все системные объекты, а также есть схема information_schema и некоторые другие системные схемы pg_. - person Craig Ringer; 02.09.2012
comment
Оглядываясь спустя годы, это концептуальный ответ на мой вопрос, в то время как другой ответ был техническим. Спасибо - person boulder_ruby; 19.12.2018