PostgreSQLでデータベースを使っていると、必ず出会うのが「権限」の問題です。
「ERROR: permission denied」というエラーメッセージを見て、頭を抱えたことはありませんか?
実は、このエラーは適切な権限設定で簡単に解決できるんです。権限管理をマスターすれば、チーム開発もセキュリティ対策もバッチリになります。
この記事では、PostgreSQLの権限について、基本から実践的な使い方まで、具体例を交えながら分かりやすく解説していきます。
権限の基本 – そもそも権限って何?

データベースの世界の「鍵」みたいなもの
PostgreSQLの権限は、家の鍵のようなものだと考えてください。
部屋(テーブル)に入るには鍵(権限)が必要で、持っている鍵の種類によって、できることが変わってきます。
権限の基本的な種類:
- SELECT権限 → データを見る(読み取り専用の鍵)
- INSERT権限 → 新しいデータを追加する(書き込みの鍵)
- UPDATE権限 → 既存のデータを変更する(編集の鍵)
- DELETE権限 → データを削除する(削除の鍵)
ユーザーとロール – 誰に権限を与えるの?
PostgreSQLでは、「ユーザー」と「ロール」という2つの概念があります。
でも実は、PostgreSQLの内部では、この2つはほぼ同じものなんです。
覚えておくポイント:
- ロール = 権限のセット(役割)
- ユーザー = ログインできるロール
つまり、ユーザーは「ログインできる特別なロール」と考えれば分かりやすいですね。
実践!権限の設定方法
1. 新しいユーザー(ロール)を作る
まずは、新しいユーザーを作ってみましょう。
-- ログインできるユーザーを作成
CREATE USER yamada WITH PASSWORD 'secure_password123';
-- ロールとして作成する場合
CREATE ROLE developer;
説明: CREATE USER
でユーザーを作成します。パスワードは必ず強力なものを設定しましょう。
CREATE ROLE
の場合、デフォルトではログインできないので、チーム開発で「開発者用の権限セット」みたいに使います。
2. GRANTコマンドで権限を付与
権限を与えるときは、GRANT
コマンドを使います。
-- 特定のテーブルへのSELECT権限を付与
GRANT SELECT ON TABLE products TO yamada;
-- 複数の権限をまとめて付与
GRANT SELECT, INSERT, UPDATE ON TABLE orders TO yamada;
-- すべての権限を付与(注意して使用)
GRANT ALL PRIVILEGES ON TABLE customers TO yamada;
説明: 必要な権限だけを与えるのがセキュリティの基本です。
ALL PRIVILEGES
は便利ですが、本番環境では慎重に使いましょう。
3. スキーマレベルの権限設定
データベース全体やスキーマ単位で権限を設定することもできます。
-- スキーマ内のすべてのテーブルに対する権限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO developer;
-- 今後作成されるテーブルにも自動的に権限を付与
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO developer;
説明: ALTER DEFAULT PRIVILEGES
は超便利!新しいテーブルを作るたびに権限設定する手間が省けます。
4. REVOKEで権限を取り消す
間違えて権限を与えてしまった場合や、権限を削除したい場合はREVOKE
を使います。
-- 特定の権限を取り消す
REVOKE INSERT ON TABLE products FROM yamada;
-- すべての権限を取り消す
REVOKE ALL PRIVILEGES ON TABLE customers FROM yamada;
よくあるトラブルと解決法
「permission denied」エラーが出たとき
このエラーは権限不足が原因です。以下の手順で確認しましょう。
チェックポイント:
- 現在の権限を確認
-- テーブルの権限を確認
\dp products
-- ユーザーの権限一覧を確認
\du yamada
- 必要な権限を付与
-- 管理者ユーザーで実行
GRANT SELECT, INSERT ON TABLE products TO yamada;
- スキーマへのアクセス権限も確認
-- スキーマへのUSAGE権限が必要
GRANT USAGE ON SCHEMA public TO yamada;
「must be owner of table」エラーの対処法
テーブルの構造を変更する際によく出るエラーです。
解決方法:
- テーブルの所有者を変更する
- またはスーパーユーザー権限で実行する
-- テーブルの所有者を変更
ALTER TABLE products OWNER TO yamada;
チーム開発での権限管理ベストプラクティス
役割ごとにロールを作る
開発チームでは、役割に応じたロールを作ると管理が楽になります。
-- 読み取り専用ロール
CREATE ROLE readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
-- 開発者ロール
CREATE ROLE developer;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO developer;
-- ユーザーをロールに追加
GRANT readonly TO yamada;
GRANT developer TO tanaka;
メリット:
- 権限管理が一元化できる
- 新メンバーの追加が簡単
- 権限の変更も一括で可能
本番環境での安全な設定
本番環境では、セキュリティを最優先に考えましょう。
重要なポイント:
- 最小権限の原則
- 必要最小限の権限だけを付与
- 読み取りだけで済むなら、SELECT権限のみ
- 定期的な権限の見直し
- 不要になった権限は削除
- 退職者のアカウントは無効化
- 監査ログの活用
- 誰がいつ何をしたか記録
- 不正アクセスの早期発見
データベース接続権限の設定
pg_hba.confファイルの基本
PostgreSQLへの接続自体も制御できます。
# ローカル接続を許可
local all all md5
# 特定IPからの接続を許可
host all all 192.168.1.0/24 md5
# すべての外部接続を拒否
host all all 0.0.0.0/0 reject
説明: pg_hba.confファイルで、どこから誰が接続できるかを細かく制御できます。
設定変更後は、必ずPostgreSQLを再起動するのを忘れずに!
権限管理のトラブルシューティング

権限があるはずなのにエラーが出る場合
確認すべきポイント:
- 継承設定の確認
-- ロールの継承設定を確認
\du+
- デフォルト権限の確認
-- デフォルト権限の設定を確認
\ddp
- オブジェクトの所有者確認
-- テーブルの所有者を確認
\dt+ products
まとめ – 権限管理をマスターしよう!
PostgreSQLの権限管理は、最初は複雑に感じるかもしれません。
でも、基本的な概念を理解すれば、意外とシンプルなんです。
今日学んだ重要ポイント:
✅ 権限は「データベースの鍵」のようなもの ✅ GRANTで権限を付与、REVOKEで取り消し ✅ ロールを使って効率的に管理 ✅ 最小権限の原則でセキュリティ確保 ✅ エラーが出たら、権限・所有者・継承を確認
これらの知識があれば、もう「permission denied」エラーも怖くありません!
次のステップとして、実際にテスト環境で権限設定を練習してみることをおすすめします。
実践することで、より深い理解が得られるはずです。
セキュアで効率的なデータベース管理を目指して、一緒に頑張りましょう!
コメント