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


151

私はPostgresが初めてで、MySQLデータベースを移行しようとしています。MySQLでは私が付与できSELECTUPDATEINSERT、およびDELETE低特権ユーザの権限を、指定したデータベース内のすべてのテーブルに適用するには、これらの助成金を有効にします。Postgresで何かを見逃しているに違いありません。各テーブルにこれらの特権を一度に1つずつ付与する必要があるように見えるからです。多くのデータベースと、データベースごとに数百のテーブルがあるため、地面から降りるのは大変な作業のようです。さらに、データベースが動作し始めると、テーブルの追加が頻繁に発生するため、絶対に必要な場合を除き、毎回アクセス許可を付与する必要はありません。

これはどのように達成されますか?

回答:


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;

これらは、スキーマが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必要な特権があります。


1
おかげで、FOR some_role後で作成したテーブルで機能させるために欠けていた重要な部分でした。ただし、としてログインする必要はありませんでした。some_roleデフォルトのadmin postgresユーザーとしてクエリを実行した場合にも機能しました。
-JustAMartin

54

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

grant all privileges on database dbname to dbuser;

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


44
これはデータベースに以下の特権を追加しますCREATE, CONNECT, TEMPORARY。テーブルに対する特権はありません。
dezso

13
すべてのテーブルに対する同様のコマンドは次のようになりますGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
:私は、この便利すぎたGRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
パオロ・

18

データベース内のすべてのテーブルにすべての特権を付与するには、次のようにします。

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.