MacYosemiteでpgAdminIIIを使用しています。役割「割引」を作成し、データベース「割引」を作成しました。 pgadminツールで、データベースの「割引」への「割引」接続権限(およびテーブルの読み取り/書き込み権限)をユーザーに与えるにはどうすればよいですか?現在、コマンドラインでログインしようとすると、このエラーが発生します
davea$ psql -h localhost -d discount -U discount
Password for user discount:
psql: FATAL: permission denied for database "discount"
DETAIL: User does not have CONNECT privilege.
テーブルへの読み取り/書き込みアクセス権を取得するには、次の3つのレベルで GRANT
コマンド を使用する必要があります。
まず、データベースに対するCONNECT
特権が必要です。
GRANT CONNECT ON DATABASE <dbname> TO <username>;
次に、データベース内のスキーマに対するUSAGE
特権が必要です(データベースを実行する前にデータベースに接続する必要があります)。
GRANT USAGE ON SCHEMA <schemaname> TO <username>;
最後に、テーブルに対する特権を与えることができます。スキーマ内のすべてのテーブルに共通のDMLとSELECTが必要な場合、およびその他のアクセス許可が必要です。
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA <schemaname> TO <username>;
-- and the sequences, for INSERT to work
GRANT USAGE ON ALL SEQUENCES IN SCHEMA <schemaname> TO <username>;
-- and the functions
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA <schemaname> TO <username>;
あなたは今何かに気づかなければなりません。各データベース、各スキーマ、および各オブジェクト(テーブル、関数など)には所有者がいます。の所有者は、その上でDDLコマンドを管理および実行するユーザーです。このユーザーはすでにすべての権限を持っているため、通常、上記のすべてのコマンドは、すべてを所有するユーザーとして接続しているときに実行する必要があります(SUPERUSER
も使用できますが、DBAタスクにのみ保持することをお勧めします)。
上記のGRANT ... ON ALL ... IN SCHEMA
コマンドは、データベースにすでに存在するオブジェクトにアクセス許可を与えますが、作成された新しいオブジェクトには適用されません。これを行うには、 ALTER DEFAULT PRIVILEGES
(これをADP
と呼びます)コマンド を使用できます。以前と同様に、所有者として接続しているときに実行する必要があります。ADPは、新しいオブジェクトの所有者がここで使用されているものと一致する(または FOR ROLE
に設定されている)場合にのみ適用されることに注意する必要があるためです。節 ):
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO <username>;
-- and the sequences, for INSERT to work
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT USAGE ON SEQUENCES TO <username>;
-- and the functions
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT EXECUTE ON FUNCTIONS TO <username>;
上からIN SCHEMA <schemaname>
をスキップして、既存のスキーマまたは将来作成するスキーマに適用することもできます。ただし、注意してくださいFOR ROLE <rolename>
を指定しなくても、に適用されます。 )現在のユーザーが接続しているので、その<rolename>
が所有する作成されたオブジェクトのみがADPコマンドを考慮します。
権限を適切に管理するために、どのユーザーがオブジェクトを所有しているかを監視することを強くお勧めします。ほとんどの場合、データベース内のすべての所有者を1人だけにすることもお勧めします(上級ユーザーであり、何をしているかを知っている場合を除く)。そうすれば、アクセス許可の管理が簡単になります。