web-dev-qa-db-ja.com

ユーザーにすべてのテーブルへのアクセスを許可する

私はPostgresを初めて使い、MySQLデータベースを移行しようとしています。 MySQLでは、低い権限を持つユーザーにSELECTUPDATEINSERT、およびDELETEの権限を付与し、これらの権限を有効にして、指定されたデータベース。私はPostgresで何かを欠落している必要があります。それは、各テーブルに対して一度に1つずつこれらの特権を付与する必要があるように見えるためです。多くのデータベースとデータベースごとに数百のテーブルがあるため、地面を離れるだけで困難な作業のように見えます。さらに、データベースが稼働状態になると、テーブルの追加が頻繁に発生するため、どうしても必要な場合を除いて、毎回権限を付与する必要はありません。

これはどのようにして最良に達成されますか?

158
PlaidFan

まず、クエリを実行するためにデータベースに接続できる必要があります。これは、

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;

これらは、スキーマが1つしかないことを前提としています(デフォルトでは「public」という名前です)。

Jack Douglasが指摘したように、上記はすでに存在するテーブルにのみ特権を与えます。将来のテーブルでも同じことを行うには、 デフォルトの特権を定義する にする必要があります。

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特権を使用します。

180
dezso

あなたに彼らにすべての特権を与えたいと思っている-これをしてください:

grant all privileges on database dbname to dbuser;

ここで、dbnameはデータベースの名前、dbuserはユーザーの名前です。

54
alxkls

データベース内のすべてのテーブルにすべての権限を付与するには、

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

私は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;
18
Will
--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;
3