Предоставление доступа ко всем таблицам для пользователя


151

Я новичок в Postgres и пытаюсь перенести наши базы данных MySQL. В MySQL я могу предоставить SELECT, UPDATE, INSERTи DELETEльготы по низкому привилегированному пользователю , и чтобы эти гранты будут применяться ко всем таблицам в указанной базе данных. Я должен что-то упустить в Postgres, потому что похоже, что я должен предоставить эти привилегии для каждой таблицы по одному. Со многими базами данных и сотнями таблиц в каждой базе данных это кажется сложной задачей, просто начать работу. Кроме того, после того, как база данных работает, добавление таблиц происходит достаточно часто, поэтому я не хочу каждый раз предоставлять разрешения, если в этом нет крайней необходимости.

Как это лучше всего сделать?

Ответы:


175

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

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Это REVOKEнеобходимо, потому что

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

Если вы действительно хотите ограничить пользователя инструкциями DML, то вам нужно сделать немного больше:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Предполагается, что у вас будет только одна схема (по умолчанию она называется public).

Как отметил Джек Дуглас, вышесказанное дает привилегии только для уже существующих таблиц. Чтобы добиться того же для будущих таблиц, вы должны определить привилегии по умолчанию :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Здесь some_roleроль, которая создает таблицы, а user_nameта, которая получает привилегии. Определяя это, вы должны войти в систему как some_roleчлен или член.

И, наконец, вы должны сделать то же самое для последовательностей (спасибо PlaidFan за указание на это) - здесь USAGEвам нужна привилегия.


1
Спасибо, это FOR some_roleбыла ключевая часть, которую мне не хватало, чтобы она работала для моих таблиц, созданных позже. Но мне не нужно было входить в систему как some_role, это работало также, если я выполнял запрос в качестве администратора по умолчанию postgres.
JustAMartin

54

предполагая, что вы хотите дать им все привилегии - сделайте это:

grant all privileges on database dbname to dbuser;

где dbnameимя вашей базы данных и dbuserимя пользователя.


45
Это добавит следующие привилегии на базы данных : CREATE, CONNECT, TEMPORARY. Нет прав на таблицы.
Дезсо

13
Аналогичная команда для всех таблиц будет,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Долан

5
Я тоже нашел это полезным:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Паоло

19

Предоставление всех привилегий всем таблицам в базе данных достигается с помощью

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

Возможно, я что-то здесь не так делал, так как я очень плохо знаком с PostgreSQL. Но это решило только первую часть проблемы - установление привилегий для всех существующих таблиц.

Для того, чтобы разрешения были правильно установлены для моего пользователя в новых создаваемых таблицах, я должен установить разрешения по умолчанию для пользователя:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.