はい、これは実行可能です。
「スーパーユーザー」は実際のsuperuser
である可能性があります 、postgres
デフォルトでは、プレーンユーザーのロールの名前をusr
に変更します。 、user
予約語です。識別子として使用しないでください。
CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser; -- poweruser can do everything usr can.
CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;
CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;
REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;
REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;
CREATE FUNCTION
...
SECURITY DEFINER;
REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;
または、ログインなしでデーモンロールを作成して、関数を所有し、テーブルに対するそれぞれの権限を保持することもできます。それはさらに安全です。
このルートに行く場合は、大好き ALTER DEFAULT PRIVILEGES
(PostgreSQL 9.0で導入されました)。 この関連回答の詳細
。
SECURITY DEFINER
安全に機能する
マニュアルで。