私はPostgresを初めて使い、MySQLデータベースを移行しようとしています。 MySQLでは、低い権限を持つユーザーにSELECT
、UPDATE
、INSERT
、およびDELETE
の権限を付与し、これらの権限を有効にして、指定されたデータベース。私はPostgresで何かを欠落している必要があります。それは、各テーブルに対して一度に1つずつこれらの特権を付与する必要があるように見えるためです。多くのデータベースとデータベースごとに数百のテーブルがあるため、地面を離れるだけで困難な作業のように見えます。さらに、データベースが稼働状態になると、テーブルの追加が頻繁に発生するため、どうしても必要な場合を除いて、毎回権限を付与する必要はありません。
これはどのようにして最良に達成されますか?
まず、クエリを実行するためにデータベースに接続できる必要があります。これは、
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
特権を使用します。
あなたに彼らにすべての特権を与えたいと思っている-これをしてください:
grant all privileges on database dbname to dbuser;
ここで、dbname
はデータベースの名前、dbuser
はユーザーの名前です。
データベース内のすべてのテーブルにすべての権限を付与するには、
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
私は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;
--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;