作成日:2024-06-20, 更新日:2024-07-23
経緯
- pgAdminにスーパーユーザーでログイン
- pgAdminでテーブル作成
- laravelから「pgAdminで作成したテーブル」にアクセス → 「権限が無い」って怒られた
対応
権限のみ付与するか、所有者にするか…
- 各テーブルで、対象となるユーザーに権限を付与
- 各テーブルで、所有者を対象となるユーザーに変更
各テーブルで、対象となるユーザーに権限を付与
対象テーブルに対象クエリに対する権限を付与
select文のみ権限付与
GRANT SELECT ON TABLE 対象テーブル TO ユーザー名;
「ユーザー名」は識別子として扱われるそうだ…
▼文字列リテラルという扱いで「'」で囲むとエラー
GRANT SELECT ON TABLE 対象テーブル TO 'recatnap';
▼識別子という扱いなのでそのまま使うのが正解
GRANT SELECT ON TABLE 対象テーブル TO recatnap;
select文以外も権限付与
▼対象すべてをマルっとセット
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE 対象テーブル TO ユーザー名;
権限の確認
SELECT
grantee,
privilege_type
FROM
information_schema.role_table_grants
WHERE
table_name = '対象テーブル'
AND table_schema = '対象スキーマ' # 特に設定していないと「public」
AND grantee = 'ユーザー名';
各テーブルで、所有者を対象となるユーザーに変更
- ひとつずつ変更
- マルっと作り直す
データベース、スキーマへの権限付与
-- データベースへの接続権限を付与 GRANT CONNECT ON DATABASE データベース名 TO ユーザー名; -- スキーマへの使用権限を付与。特に指定をしていないなら「public」 GRANT USAGE ON SCHEMA public TO ユーザー名;
ひとつずつ変更
ALTER TABLE スキマー.対象テーブル OWNER TO ユーザー名;
▼スキマーは何もしてなければ「public」になる
ALTER TABLE public.対象テーブル OWNER TO ユーザー名;
マルっと作り直す: テーブルを作り直すことが可能な場合のみ…
対象ユーザーでログインして作成すればOK
(pgAdminなど)スーパーユーザーでログインしている場合
-- 一時的に対象ユーザーに切り替える
SET ROLE ユーザー名;
-- テーブルを作成する
CREATE TABLE public.〇〇〇 (
〇〇〇 SERIAL PRIMARY KEY,
〇〇〇 TEXT NOT NULL
);
-- スーパーユーザーに戻る
RESET ROLE;