まず、クエリを実行するためにデータベースに接続できる必要があります。これは次の方法で実現できます
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
必要な特権があります。
FOR some_role
後で作成したテーブルで機能させるために欠けていた重要な部分でした。ただし、としてログインする必要はありませんでした。some_role
デフォルトのadminpostgres
ユーザーとしてクエリを実行した場合にも機能しました。