Ошибка нет доступа к схеме public

I'm trying to view the raw data from the AACT Database in pgAdmin 4. I'm on a Mac computer. When I just try to view the first 100 rows from the 'complete_oncology' table, I get the below error: ERR...

I’m trying to view the raw data from the AACT Database in pgAdmin 4. I’m on a Mac computer. When I just try to view the first 100 rows from the ‘complete_oncology’ table, I get the below error:

ERROR: permission denied for schema public
LINE 1: SELECT * FROM public.complete_oncology
                      ^
SQL state: 42501
Character: 15

Do I have insufficient permissions? If yes, how do I grant myself permissions to view this table? I am able to see other tables from different Schemas in the AACT database. I’ve read some users suggest granting myself permissions with something like the below, but no luck:

GRANT SELECT ON complete_oncology TO PUBLIC

This just turns up an error:

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

asked Apr 27, 2021 at 2:57

cpburke94's user avatar

If you get a «permission denied» for public.complete_oncology, but a «relation does not exist» for oncology, that can only mean only one thing: you do not have USAGE permissions on the public schema.

Get the owner of the schema to run

GRANT USAGE ON SCHEMA public TO your_user;

Then you should be able to see the table. If you still lack permissions on the table itself, get the owner to grant you SELECT on the table as well.

answered Apr 27, 2021 at 3:19

Laurenz Albe's user avatar

Laurenz AlbeLaurenz Albe

192k17 gold badges178 silver badges234 bronze badges

1

  1. go to preferences setting on popsql
  2. connections
  3. delete connection that you have
  4. add new connection
    fill the form
    -connection name ( up to you)
    -Turn on Connection type «connect directly from my computer»
    -hostname : localhost (before you can type localhost, turn on the connection type «connect directly from mycomputer»)
    -port : 3306
    -database name : same as you create before on cmd sql
    -username : root

answered Oct 9, 2022 at 10:58

Tienho's user avatar

1

Логический уровень: база данных, пользователи, права.

1. создайте новый кластер PostgresSQL 13
2. зайти в кластер под postgres:
3. Создайте новую базу данных testdb и коннектимся:
CREATE DATABASE testdb;
c testdb
# Ответ: Вы подключены к базе данных "testdb" как пользователь "postgres".
5. создайте новую схему testnm
Просмотр схем:
postgres=# dn+
                            Список схем
  Имя   | Владелец |    Права доступа     |        Описание
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         |
 testnm | postgres |                      |
Права супервользователя:
postgres=# select rolname from pg_roles where rolsuper;
 rolname
----------
 postgres
6. Создайте новую таблицу t1 с одной колонкой c1 типа integer
CREATE TABLE t1(c1 integer);
7. Вставьте строку со значением c1=1
INSERT INTO t1 values(1);
  1. Создать новую роль readonly:
Просмотр ролей:
Имя роли Список ролей и Атрибутов Член ролей
postgres Суперпользователь, Создает: роли, БД, Репликация, Пропускать RLS {}
readonly Вход запрещен {}
  1. Дать роли «readonly» право на подключение к базе данных testdb:
GRANT connect on DATABASE testdb TO readonly;
Ответ: Grant
10. Дать роли «readonly» право на использование схемы testnm:
grant usage on SCHEMA testnm to readonly;
11. Дать роли «readonly» право на select для всех таблиц схемы testnm:
grant SELECT on all TABLEs in SCHEMA testnm TO readonly;

12. Создать пользователя testread с паролем 12345;

# USER - это роль с правом входа:
CREATE USER evsemkin WITH PASSWORD '12345';
# ROLE - без дефолтного права на логин:
CREATE ROLE evsemkin password '12345';
CREATE ROLE evsemkin LOGIN password '12345';
DROP ROLE evsemkin;
postgres=# du                                          
 Имя роли |                                Атрибуты                                 | Член ролей
----------+-------------------------------------------------------------------------+------------
 dbowner  | Суперпользователь                                                       | {}
 evsemkin |                                                                         | {}
 postgres | Суперпользователь, Создаёт роли, Создаёт БД, Репликация, Пропускать RLS | {}
 replica  | Репликация                                                              | {}
 rewind   | Суперпользователь                                                       | {}
 testsu   | Суперпользователь   

13. Права на существующие таблицы:

CREATE ROLE evsemkin  password '12345';
CREATE DATABASE prod;
c prod
GRANT SELECT, INSERT, UPDATE, DELETE on ALL TABLES in SCHEMA public to evsemkin;
GRANT CONNECT on DATABASE "prod" to evsemkin;
14. Права на вновь созданные таблицы: через alter default:
c prod
ALTER default PRIVILEGES in schema public GRANT SELECT, DELETE, UPDATE, INSERT on tables to evsemkin;
ALTER DEFAULT PRIVILEGES FOR USER username IN SCHEMA schema_name GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO username;
# GRANT SELECT, INSERT, UPDATE, DELETE on database prod TO evsemkin;
GRANT ALL PRIVILEGES ON DATABASE "prod" from evsemkin;
REVOKE ALL PRIVILEGES ON DATABASE "prod" from evsemkin;
grant all privileges on prod to  identified by 'mypasswd';
postgres-# l
                                  Список баз данных
    Имя    | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа
-----------+----------+-----------+-------------+-------------+-----------------------
 otttus    | dbowner  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 otus      | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 postgres  | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 priz      | dbowner  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 prod      | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 template0 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
GRANT ALL PRIVILEGES ON DATABASE "prod" to evsemkin;
psql -p 5432 -d otus -h 192.168.0.16 -U postgres
psql -p 5432 -d prod -h 192.168.0.16 -U evsemkin

Права

c prod
GRANT SELECT, UPDATE, INSERT, DELETE on ALL TABLES in SCHEMA public to evsemkin;

sudo adduser testread sudo
passwd testread
vim /etc/postgresql/14/main/pg_hba.conf
host all dbowner 0.0.0.0/0 scram-sha-256
psql -U dbowner -h 192.168.0.16 -d postgres
select pg_reload_conf();
postgres=# CREATE DATABASE priz;
# Ответ: CREATE DATABASE
CREATE USER dbowner with password '12345';
CREATE USER testread with password '12345';
CREATE USER v7UserDev;
CREATE DATABASE priz2 OWNER v7UserDev;
# Права на директорию, для запуска БД:
chmod 0750 /backup/restore
Просмотр пользователей из представления:
select usename, usesuper from pg_catalog.pg_user;
usename usesuper
postgres t
testread f
  1. Дать роль readonly пользователю testread:
ALTER USER dbowner WITH SUPERUSER;
GRANT superuser TO dbowner;
grant readonly TO testread;
  1. Зайди под пользователем testread в б.д. testdb;
Ответ: подключиться к серверу через UNIX сокет «/var/run/postgresql/.s.PGSQL.5432» не удалось
ALTER USER testread LOGIN;
Ответ: подключиться к серверу через UNIX сокет «/var/run/postgresql/.s.PGSQL.5432» не удалось
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
Ответ: SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, бит: 256, сжатие: выкл.)
15.
select * from t1;
# Ответ: нет доступа к таблице t1
dt
Схема|Имя|Тип|Владелец|
:----|:--------|:--------|:--------:
public|t1|таблица|postgres
Дадим доступ из-под postgres:
c testdb
GRANT SELECT, UPDATE, INSERT ON t1 TO testread;
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
dt
Схема Имя Тип Владелец Права для столбцов Политики
public t1 таблица postgres=arwdDxt/postgres+testread=arw/postgres
Ответ: с1 / 1 строка
  1. Создадим таблицу t1 заново с явным указанием имени схемы testnm
su postgres
psql
drop table t1;
CREATE TABLE testnm.t1(i int);
INSERT INTO testnm.t1 values (1), (2);
Ответ: INSERT 0 2
Ответ: ОШИБКА: отношение «testnm.t1» не существует СТРОКА 1: select * from testnm.t1;
Ответ: «$user», public
SET search_path TO testnm,public;
SHOW search_path;
Ответ: testnm, public
Схема Имя Тип Владелец Права для столбцов Политики
testnm t1 таблица
Ответ: i 1 2 (2 строки)
grant connect on DATABASE testdb TO testread;
grant SELECT, UPDATE, INSERT on all TABLEs in SCHEMA testnm TO testread;
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
select * from t1;
Ответ: ОШИБКА: отношение «t1» не существует
Ответ: i 1 2 (2 строки)
create table t2(c1 integer); 
insert into t2 values (2);
Ответ: i 2 (1 строка)
  1. Как убрать эти права?
c testdb postgres; 
revoke CREATE on SCHEMA public FROM public; 
revoke all on DATABASE testdb FROM public; 
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
create table t3(c1 integer);
ОШИБКА: нет доступа к схеме public.
Все задания выполнены.

I’m trying to view the raw data from the AACT Database in pgAdmin 4. I’m on a Mac computer. When I just try to view the first 100 rows from the ‘complete_oncology’ table, I get the below error:

ERROR: permission denied for schema public
LINE 1: SELECT * FROM public.complete_oncology
                      ^
SQL state: 42501
Character: 15

Do I have insufficient permissions? If yes, how do I grant myself permissions to view this table? I am able to see other tables from different Schemas in the AACT database. I’ve read some users suggest granting myself permissions with something like the below, but no luck:

GRANT SELECT ON complete_oncology TO PUBLIC

This just turns up an error:

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

asked Apr 27, 2021 at 2:57

cpburke94's user avatar

If you get a «permission denied» for public.complete_oncology, but a «relation does not exist» for oncology, that can only mean only one thing: you do not have USAGE permissions on the public schema.

Get the owner of the schema to run

GRANT USAGE ON SCHEMA public TO your_user;

Then you should be able to see the table. If you still lack permissions on the table itself, get the owner to grant you SELECT on the table as well.

answered Apr 27, 2021 at 3:19

Laurenz Albe's user avatar

Laurenz AlbeLaurenz Albe

190k17 gold badges175 silver badges229 bronze badges

1

  1. go to preferences setting on popsql
  2. connections
  3. delete connection that you have
  4. add new connection
    fill the form
    -connection name ( up to you)
    -Turn on Connection type «connect directly from my computer»
    -hostname : localhost (before you can type localhost, turn on the connection type «connect directly from mycomputer»)
    -port : 3306
    -database name : same as you create before on cmd sql
    -username : root

answered Oct 9, 2022 at 10:58

Tienho's user avatar

1

Логический уровень: база данных, пользователи, права.

1. создайте новый кластер PostgresSQL 13
2. зайти в кластер под postgres:
3. Создайте новую базу данных testdb и коннектимся:
CREATE DATABASE testdb;
c testdb
# Ответ: Вы подключены к базе данных "testdb" как пользователь "postgres".
5. создайте новую схему testnm
Просмотр схем:
имя владелец
public postgres
testnm postgres
Права супервользователя:
postgres=# select rolname from pg_roles where rolsuper;
 rolname
----------
 postgres
6. Создайте новую таблицу t1 с одной колонкой c1 типа integer
CREATE TABLE t1(c1 integer);
7. Вставьте строку со значением c1=1
INSERT INTO t1 values(1);
  1. Создать новую роль readonly:
Просмотр ролей:
Имя роли Список ролей и Атрибутов Член ролей
postgres Суперпользователь, Создает: роли, БД, Репликация, Пропускать RLS {}
readonly Вход запрещен {}
  1. Дать роли «readonly» право на подключение к базе данных testdb:
grant connect on DATABASE testdb TO readonly;
Ответ: Grant
  1. Дать роли «readonly» право на использование схемы testnm:
grant usage on SCHEMA testnm to readonly;
11. Дать роли «readonly» право на select для всех таблиц схемы testnm:
grant SELECT on all TABLEs in SCHEMA testnm TO readonly;
12. Создать пользователя testread с паролем 12345;
sudo adduser testread sudo
passwd testread
vim /etc/postgresql/14/main/pg_hba.conf
host all dbowner 0.0.0.0/0 scram-sha-256
psql -U dbowner -h 192.168.0.16 -d postgres
select pg_reload_conf();
postgres=# CREATE DATABASE priz;
# Отвте: CREATE DATABASE
CREATE USER dbowner with password '12345';
CREATE USER testread with password '12345';
CREATE USER v7UserDev;
CREATE DATABASE priz2 OWNER v7UserDev;
# Права на директорию, для запуска БД:
chmod 0750 /backup/restore
Просмотр пользователей из представления:
select usename, usesuper from pg_catalog.pg_user;
usename usesuper
postgres t
testread f
  1. Дать роль readonly пользователю testread:
ALTER USER dbowner WITH SUPERUSER;
GRANT superuser TO dbowner;
grant readonly TO testread;
  1. Зайди под пользователем testread в б.д. testdb;
Ответ: подключиться к серверу через UNIX сокет «/var/run/postgresql/.s.PGSQL.5432» не удалось
ALTER USER testread LOGIN;
Ответ: подключиться к серверу через UNIX сокет «/var/run/postgresql/.s.PGSQL.5432» не удалось
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
Ответ: SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, бит: 256, сжатие: выкл.)
15.
select * from t1;
# Ответ: нет доступа к таблице t1
dt
Схема|Имя|Тип|Владелец|
:----|:--------|:--------|:--------:
public|t1|таблица|postgres
Дадим доступ из-под postgres:
c testdb
GRANT SELECT, UPDATE, INSERT ON t1 TO testread;
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
dt
Схема Имя Тип Владелец Права для столбцов Политики
public t1 таблица postgres=arwdDxt/postgres+testread=arw/postgres
Ответ: с1 / 1 строка
  1. Создадим таблицу t1 заново с явным указанием имени схемы testnm
su postgres
psql
drop table t1;
CREATE TABLE testnm.t1(i int);
INSERT INTO testnm.t1 values (1), (2);
Ответ: INSERT 0 2
Ответ: ОШИБКА: отношение «testnm.t1» не существует СТРОКА 1: select * from testnm.t1;
Ответ: «$user», public
SET search_path TO testnm,public;
SHOW search_path;
Ответ: testnm, public
Схема Имя Тип Владелец Права для столбцов Политики
testnm t1 таблица
Ответ: i 1 2 (2 строки)
grant connect on DATABASE testdb TO testread;
grant SELECT, UPDATE, INSERT on all TABLEs in SCHEMA testnm TO testread;
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
select * from t1;
Ответ: ОШИБКА: отношение «t1» не существует
Ответ: i 1 2 (2 строки)
create table t2(c1 integer); 
insert into t2 values (2);
Ответ: i 2 (1 строка)
  1. Как убрать эти права?
c testdb postgres; 
revoke CREATE on SCHEMA public FROM public; 
revoke all on DATABASE testdb FROM public; 
q
exit
sudo -u postgres psql -U testread -h 127.0.0.1 -W -d testdb
create table t3(c1 integer);
ОШИБКА: нет доступа к схеме public.
Все задания выполнены.

This happens when not having USAGE privilege on any of the schemas of search_path. By default the pseudo-role public (all users) has this privilege on the publicschema, so this error happens only after revoking it explicitly with:

revoke usage on schema public from public;

This is required when it’s not desirable that people peek into other people schemas, even without selecting data from tables (which is granted through different privileges).

If this REVOKE hasn’t been done in that database, it may have happened in the template database by which new databases are modelled (see CREATE DATABASE).


When a user has USAGE privilege, but lacks CREATE privilege on the schema, it’s a different error when trying to create an object: permission denied for schema public.

To check the privileges inside psql, use dn+ public.

By default (shown with extended display x for readability):

# dn+ public
List of schemas
-[ RECORD 1 ]-----+-----------------------
Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =UC/postgres
Description       | standard public schema

lack of a rolename before = means it’s for all roles (=public)

Without public USAGE privilege

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =C/postgres
Description       | standard public schema

Without public USAGE or CREATE privileges

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
Description       | standard public schema

This happens when not having USAGE privilege on any of the schemas of search_path. By default the pseudo-role public (all users) has this privilege on the publicschema, so this error happens only after revoking it explicitly with:

revoke usage on schema public from public;

This is required when it’s not desirable that people peek into other people schemas, even without selecting data from tables (which is granted through different privileges).

If this REVOKE hasn’t been done in that database, it may have happened in the template database by which new databases are modelled (see CREATE DATABASE).


When a user has USAGE privilege, but lacks CREATE privilege on the schema, it’s a different error when trying to create an object: permission denied for schema public.

To check the privileges inside psql, use dn+ public.

By default (shown with extended display x for readability):

# dn+ public
List of schemas
-[ RECORD 1 ]-----+-----------------------
Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =UC/postgres
Description       | standard public schema

lack of a rolename before = means it’s for all roles (=public)

Without public USAGE privilege

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =C/postgres
Description       | standard public schema

Without public USAGE or CREATE privileges

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
Description       | standard public schema

Я запускаю Postgres 10.4 и в настоящее время сбит с толку, поскольку не могу предоставить доступ к схеме другой роли.

Что я хочу сделать:

У меня одна роль с одной схемой, и я хочу получить доступ к схеме и ее таблицам из другой роли. Итак, я сделал как обычно (что работало с другими схемами):

grant usage on schema myschema to newuser;

grant select on all tables in schema myschema to newuser;

Оба этих оператора выполнялись как владелец схемы. При этом я не столкнулся с какими-либо ошибками.

Когда я вхожу в систему как новый пользователь и пытаюсь выбрать некоторые данные:

select * from myschema.table;

Я получаю сообщение об ошибке:

SQL Error [42501]: ERROR: permission denied for schema myschema

Я вижу, что у нового пользователя есть нужные привилегии в таблице «information_schema.role_table_grants»

Он также работал с другой ролью и другой схемой. Я невежественен.


Ответы
2

Это определенно работает, как указано в моем вопросе, проблема заключалась в том, что я не использовал владельца схемы.

Поэтому всегда убедитесь, что вы предоставляете доступ к схеме от роли владельца.

Шаг 1
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA name_schema TO name_user;

Шаг 2
GRANT USAGE ON SCHEMA name_schema TO name_user;

Другие вопросы по теме

In Postgres I created the following table inside a db called testing:

CREATE TABLE category_google_taxonomy (
    category_id integer references category ON UPDATE CASCADE ON DELETE CASCADE,
    google_taxonomy_id integer references google_taxonomy ON UPDATE CASCADE ON DELETE     CASCADE
);

When I try to populate the table:

INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);

I get the following error:

ERROR:  permission denied for schema public
LINE 1: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id"...
                       ^
QUERY:  SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x

I read up a bit and eventually granted ALL PRIVILEGES out of exasperation, but it still doesn’t work:

testing=# GRANT ALL PRIVILEGES ON public.category TO testing;
GRANT

testing=# dp category_google_taxonomy
                                   Access privileges
 Schema |           Name           | Type  |    Access privileges    | Column access privileges 
--------+--------------------------+-------+-------------------------+--------------------------
 public | category_google_taxonomy | table | testing=arwdDxt/testing | 
                                           : super=arwdDxt/testing 


testing=# dp category
                           Access privileges
 Schema |   Name   | Type  |   Access privileges    | Column access privileges 
--------+----------+-------+------------------------+--------------------------
 public | category | table | testing=arwdDxt/super | category_id:
                                                :   testing=arwx/super
(1 row)

On @Daniel’s suggestion I tried GRANT USAGE ON schema public TO super;, now when I run the INSERT command I get:

ERROR:  permission denied for relation category
CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

Here is the relevant part of d:

public | category                               | table    | super
public | category_google_taxonomy               | table    | testing

NataNov

0 / 0 / 0

Регистрация: 09.04.2021

Сообщений: 4

1

Создание пользователя с правами на таблицы в схеме

09.04.2021, 14:54. Показов 4679. Ответов 1

Метки нет (Все метки)


Добрый день!
Изучаю PostgreSql и не могу разобраться в следующем.
Хочу создать пользователя с правами выбора из всех таблиц некоторой схемы в БД.
Все дальнейшие действия делаю в утилите psql под суперпользователем postgres:

SQL
1
2
3
4
5
6
7
8
CREATE DATABASE my_db;
c my_db
CREATE schema my_schema;
SET search_path TO my_schema,public;
CREATE TABLE my_table (f1 int2,f2 text);
INSERT INTO my_table VALUES (1,'aaa');
CREATE ROLE user1 login password 'user1';
GRANT SELECT ON ALL TABLES IN schema my_schema TO user1;

Затем подключаюсь к базе my_db под пользователем user1:

c my_db user1

До сих пор все шло прекрасно. Но дальше пытаюсь сделать select от имени пользователя user1:

SQL
1
SELECT * FROM my_schema.my_table;

выходит ошибка — нет доступа к схеме my_schema

пытаюсь по другому:

SQL
1
2
SET search_path TO my_schema,public;
SELECT * FROM my_table;

Ошибка — нет доступа к таблице my_table!

Что я делаю не так?!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

grgdvo

1184 / 914 / 367

Регистрация: 02.09.2012

Сообщений: 2,785

10.04.2021, 09:09

2

Лучший ответ Сообщение было отмечено NataNov как решение

Решение

Схема — такой же объект базы, как и таблицы.
Вы дали доступ на все таблицы в схеме, но не дали доступ к самой схеме.
См. что-то типа

SQL
1
GRANT USAGE ON SCHEMA my_schema TO user1;

1

Настройка:

Я подключен к автономному (база данных в файле) HSQLDB с JDBC. Соединение открывается при запуске программы и закрывается при выходе. Пользователь был создан с правами ADMIN.

Я использовал диспетчер базы данных hsqldb.jar, чтобы создать в своей базе данных таблицу под названием КОМПОНЕНТЫ. Он находится в схеме PUBLIC, и я смог добавлять и вычитать из него записи с помощью диспетчера баз данных.

Я использую следующий код, который вызывается в основном методе, чтобы доказать, что я могу правильно запрашивать свою базу данных:

public static void displayAllRows() {
    String sql = "SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {

        System.out.println("Authorizations Table:");
        while(rs.next()) {
        StringBuilder bf = new StringBuilder();
        bf.append(rs.getString("AUTHORIZATION_NAME")).append(": ");
        bf.append(rs.getString("AUTHORIZATION_TYPE")).append(", ");
        System.out.println(bf.toString());
        }
    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Выходные данные приведенного выше кода верны на основе использования оператора SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS в средстве диспетчера баз данных.

Проблема:

Затем я запускаю упрощенный код ниже. Единственные изменения коснулись оператора SELECT, и я удалил все из блока try (чтобы ничто не могло случайно вызвать ошибку).

private static final Connection CONN = ConnectionManager.getInstance().getConnection();

public static void displayAllRows() {
    String sql = "SELECT * FROM COMPONENTS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {


    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Это вызывает исключение: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: COMPONENTS.

Я также пробовал использовать PUBLIC.COMPONENTS в заявлении. Однако, когда я копирую / вставляю этот оператор в диспетчер баз данных, он работает нормально (я вошел в систему с одним и тем же пользователем в обоих местах).

Вопрос:

Я, наверное, делаю что-то не так, учитывая, насколько я новичок в базах данных. Что я могу сделать, чтобы второй запрос был успешным?

Я искал SO и Интернет и нашел сотни сообщений об этом конкретном исключении, но оно выбрасывается в таких широких обстоятельствах, что решения не помогли.

Ответ:

Каким-то образом я случайно подключился к другой базе данных с помощью своей программы, чем с помощью диспетчера баз данных. Решение помещало весь путь к файлу в строку подключения к базе данных вместо использования относительной ссылки

Вы подключаетесь к двум разным базам данных. Вероятно, URL-адрес вашей базы данных указывает путь к файлу относительно каталогов, в которых вы запускаете DatabaseManager и ваше приложение. Используйте абсолютные пути или пути, в которых используется символ ~ для обозначения каталога user.home.

Поскольку вы новичок в базах данных, было бы проще запустить сервер HSQLDB и подключиться к нему из вашего приложения и из DatabaseManager, используя один и тот же URL-адрес.


1

fredt
1 Май 2016 в 23:57

In Postgres I created the following table inside a db called testing:

CREATE TABLE category_google_taxonomy (
    category_id integer references category ON UPDATE CASCADE ON DELETE CASCADE,
    google_taxonomy_id integer references google_taxonomy ON UPDATE CASCADE ON DELETE     CASCADE
);

When I try to populate the table:

INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);

I get the following error:

ERROR:  permission denied for schema public
LINE 1: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id"...
                       ^
QUERY:  SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x

I read up a bit and eventually granted ALL PRIVILEGES out of exasperation, but it still doesn’t work:

testing=# GRANT ALL PRIVILEGES ON public.category TO testing;
GRANT

testing=# dp category_google_taxonomy
                                   Access privileges
 Schema |           Name           | Type  |    Access privileges    | Column access privileges 
--------+--------------------------+-------+-------------------------+--------------------------
 public | category_google_taxonomy | table | testing=arwdDxt/testing | 
                                           : super=arwdDxt/testing 


testing=# dp category
                           Access privileges
 Schema |   Name   | Type  |   Access privileges    | Column access privileges 
--------+----------+-------+------------------------+--------------------------
 public | category | table | testing=arwdDxt/super | category_id:
                                                :   testing=arwx/super
(1 row)

On @Daniel’s suggestion I tried GRANT USAGE ON schema public TO super;, now when I run the INSERT command I get:

ERROR:  permission denied for relation category
CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

Here is the relevant part of d:

public | category                               | table    | super
public | category_google_taxonomy               | table    | testing

NataNov

0 / 0 / 0

Регистрация: 09.04.2021

Сообщений: 4

1

Создание пользователя с правами на таблицы в схеме

09.04.2021, 14:54. Показов 4920. Ответов 1

Метки нет (Все метки)


Добрый день!
Изучаю PostgreSql и не могу разобраться в следующем.
Хочу создать пользователя с правами выбора из всех таблиц некоторой схемы в БД.
Все дальнейшие действия делаю в утилите psql под суперпользователем postgres:

SQL
1
2
3
4
5
6
7
8
CREATE DATABASE my_db;
c my_db
CREATE schema my_schema;
SET search_path TO my_schema,public;
CREATE TABLE my_table (f1 int2,f2 text);
INSERT INTO my_table VALUES (1,'aaa');
CREATE ROLE user1 login password 'user1';
GRANT SELECT ON ALL TABLES IN schema my_schema TO user1;

Затем подключаюсь к базе my_db под пользователем user1:

c my_db user1

До сих пор все шло прекрасно. Но дальше пытаюсь сделать select от имени пользователя user1:

SQL
1
SELECT * FROM my_schema.my_table;

выходит ошибка — нет доступа к схеме my_schema

пытаюсь по другому:

SQL
1
2
SET search_path TO my_schema,public;
SELECT * FROM my_table;

Ошибка — нет доступа к таблице my_table!

Что я делаю не так?!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



grgdvo

1187 / 917 / 367

Регистрация: 02.09.2012

Сообщений: 2,796

10.04.2021, 09:09

2

Лучший ответ Сообщение было отмечено NataNov как решение

Решение

Схема — такой же объект базы, как и таблицы.
Вы дали доступ на все таблицы в схеме, но не дали доступ к самой схеме.
См. что-то типа

SQL
1
GRANT USAGE ON SCHEMA my_schema TO user1;



1



Понравилась статья? Поделить с друзьями:
  • Ошибка нет доступа к платформе интерактивного тв
  • Ошибка нет документов для запуска фонового перехода
  • Ошибка нет доверия сертификату для dl astralinux ru
  • Ошибка нет данных для счета фактуры на аванс 1с
  • Ошибка нет данных для импорта import xml