カテゴリ: PostgreSQL 更新日: 2026/02/20

PostgreSQLユーザーとロール作成完全ガイド!初心者でもわかるデータベース権限管理

PostgreSQLでユーザーとロールを作成する方法
PostgreSQLでユーザーとロールを作成する方法

先生と生徒の会話形式で理解しよう

生徒

「PostgreSQLでユーザーとかロールって聞くんですけど、何が違うんですか?」

先生

「PostgreSQLでは、ユーザーとロールはほぼ同じものです。会社の社員証のようなもので、誰がデータベースにアクセスできるかを管理するための仕組みですね。」

生徒

「なぜユーザーを分ける必要があるんですか?みんな同じユーザーじゃダメなんですか?」

先生

「セキュリティのためです。例えば、一般社員には見せられる情報と、経理担当者だけが見られる給与情報を分けたいですよね。それと同じで、データベースでも権限を分けて管理します。」

PostgreSQLのユーザーとロールの基本概念

<i class= PostgreSQLのユーザーとロールの基本概念" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
PostgreSQLのユーザーとロールの基本概念

PostgreSQLでは、データベースにアクセスする人や権限を管理するために「ロール」という仕組みを使います。ロールには二つの種類があります。一つはログインできるロール(これを一般的にユーザーと呼びます)、もう一つはログインできないロール(権限のグループとして使います)です。

例えるなら、会社の組織図のようなものです。「営業部」という部署(ロール)があって、その中に「田中さん」「佐藤さん」という社員(ユーザー)がいるイメージです。営業部に権限を与えれば、その部署に所属する全員がその権限を持つことができます。

PostgreSQLでは、ユーザーもロールも内部的には同じもので、ログイン権限があるかどうかの違いだけです。そのため、CREATE USERコマンドとCREATE ROLEコマンドは、ほとんど同じ機能を持っています。

基本的なユーザー作成方法

<i class= 基本的なユーザー作成方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
基本的なユーザー作成方法

PostgreSQLでユーザーを作成するには、CREATE USERコマンドまたはCREATE ROLEコマンドを使います。まずは最もシンプルなユーザー作成方法から見ていきましょう。

パスワード付きユーザーの作成

実際の運用では、セキュリティのためにパスワードを設定することが必須です。次のSQLコマンドで、パスワード付きのユーザーを作成できます。

パスワード付きユーザーの作成例

CREATE USER sales_user WITH PASSWORD 'secure_password123';

このコマンドは、「sales_user」という名前のユーザーを作成し、パスワードを「secure_password123」に設定します。WITHは「~と一緒に」という意味で、PASSWORDの後にシングルクォーテーション(')で囲んだパスワードを指定します。

ユーザー作成の確認方法

ユーザーが正しく作成されたか確認するには、psqlコマンドラインツールで「\du」というコマンドを使います。これはデータベースユーザーの一覧を表示するコマンドです。

ユーザー一覧の表示例

                                   List of roles
 Role name   |                         Attributes                         
-------------+------------------------------------------------------------
 postgres    | Superuser, Create role, Create DB, Replication, Bypass RLS
 sales_user  | 

このように、作成したsales_userが一覧に表示されていれば成功です。Attributesの欄には、そのユーザーが持っている特別な権限が表示されます。

ロールの作成と権限設定

<i class= ロールの作成と権限設定" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
ロールの作成と権限設定

ロールを作成する場合は、CREATE ROLEコマンドを使います。ただし、CREATE ROLEで作成したロールは、デフォルトではログインできません。ログイン権限を与えるには、明示的にLOGIN属性を付ける必要があります。

ログイン可能なロールの作成例

CREATE ROLE manager_role WITH LOGIN PASSWORD 'manager_pass456';

このコマンドは、「manager_role」という名前のロールを作成し、ログイン権限とパスワードを設定します。これは実質的にユーザーを作成したのと同じ結果になります。

グループロールの作成

ログインできないロールは、権限をまとめるグループとして使います。例えば、営業部門全員に共通の権限を与えたい場合、グループロールを作成すると便利です。

グループロール作成の例

CREATE ROLE sales_group;

このコマンドは、ログイン権限を持たない「sales_group」というロールを作成します。このロールに権限を設定してから、個別のユーザーをこのグループに所属させることで、権限管理が簡単になります。

ユーザーに様々な属性を付与する方法

<i class= ユーザーに様々な属性を付与する方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
ユーザーに様々な属性を付与する方法

PostgreSQLのユーザーには、様々な属性を付けることができます。これらの属性によって、ユーザーができることが決まります。

スーパーユーザー権限

スーパーユーザーは、データベース内で全ての操作ができる最高権限を持つユーザーです。会社でいえば社長のような存在で、何でもできる代わりに責任も重大です。通常の業務では、スーパーユーザー権限は必要最小限のユーザーにのみ与えます。

スーパーユーザーの作成例

CREATE USER admin_user WITH PASSWORD 'admin_pass789' SUPERUSER;

SUPERUSERキーワードを付けることで、全権限を持つユーザーが作成されます。

データベース作成権限

一般ユーザーでも、新しいデータベースを作成できる権限を与えることができます。これはCREATEDB属性で指定します。

データベース作成権限付きユーザーの例

CREATE USER developer_user WITH PASSWORD 'dev_pass321' CREATEDB;

このユーザーは、自分でデータベースを作成できるようになりますが、他のユーザーのデータベースを削除したりはできません。

ロール作成権限

CREATEROLE属性を付けると、そのユーザーは他のユーザーやロールを作成できるようになります。人事部門の担当者のように、他の社員の登録ができる権限です。

複数の属性を持つユーザーの作成例

CREATE USER hr_manager WITH PASSWORD 'hr_pass999' CREATEDB CREATEROLE;

このように、スペースで区切って複数の属性を同時に指定できます。このユーザーは、データベースの作成と、他のユーザーの作成の両方ができます。

ユーザーをグループロールに追加する方法

<i class= ユーザーをグループロールに追加する方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
ユーザーをグループロールに追加する方法

作成したグループロールに、個別のユーザーを所属させることで、権限管理を効率化できます。これはGRANTコマンドを使って行います。

ユーザーをグループに追加する例

GRANT sales_group TO sales_user;

このコマンドは、先ほど作成した「sales_user」を「sales_group」というグループロールに所属させます。GRANTは「与える」という意味で、グループの権限をユーザーに与えることになります。

複数のユーザーをまとめて管理する利点

グループロールを使うと、権限の管理がとても楽になります。例えば、営業部門の全員に顧客データベースへのアクセス権を与えたい場合、一人ひとりに権限を設定するのではなく、営業グループに一度だけ権限を設定すれば良いのです。

新しい営業担当者が入社したときも、その人をグループに追加するだけで、自動的に必要な権限が付与されます。退職するときも、グループから外すだけで全ての権限を一括で削除できます。

既存ユーザーの権限を変更する方法

<i class= 既存ユーザーの権限を変更する方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
既存ユーザーの権限を変更する方法

すでに作成したユーザーの権限を後から変更することもできます。これにはALTER USERコマンドまたはALTER ROLEコマンドを使います。

パスワードの変更

セキュリティのため、定期的にパスワードを変更することは重要です。次のコマンドでパスワードを変更できます。

パスワード変更の例

ALTER USER sales_user WITH PASSWORD 'new_secure_password456';

このコマンドで、sales_userのパスワードが新しいものに変更されます。

権限の追加と削除

既存のユーザーに新しい権限を追加したり、不要になった権限を削除したりすることもできます。

権限を追加する例

ALTER USER developer_user WITH CREATEROLE;

このコマンドで、既存のdeveloper_userにロール作成権限が追加されます。

権限を削除する例

ALTER USER developer_user WITH NOCREATEROLE;

NOCREATEROLEのように、属性の前に「NO」を付けると、その権限を削除できます。他にもNOSUPERUSER、NOCREATEDBなどがあります。

データベースやテーブルへのアクセス権限設定

<i class= データベースやテーブルへのアクセス権限設定" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
データベースやテーブルへのアクセス権限設定

ユーザーを作成しただけでは、まだデータベースやテーブルにアクセスできません。具体的なデータベースやテーブルに対する権限を、別途設定する必要があります。

データベースへの接続権限

ユーザーが特定のデータベースに接続できるようにするには、CONNECT権限を与えます。

データベース接続権限の付与例

GRANT CONNECT ON DATABASE sales_db TO sales_user;

このコマンドで、sales_userがsales_dbというデータベースに接続できるようになります。

テーブルへの操作権限

テーブルに対しては、SELECT(データの読み取り)、INSERT(データの追加)、UPDATE(データの更新)、DELETE(データの削除)などの権限を個別に設定できます。

テーブルの読み取り権限付与例

GRANT SELECT ON TABLE customers TO sales_user;

このコマンドで、sales_userはcustomersテーブルのデータを読み取ることができますが、追加・更新・削除はできません。

すべての操作権限を付与する例

GRANT ALL PRIVILEGES ON TABLE orders TO sales_group;

ALL PRIVILEGESを指定すると、そのテーブルに対する全ての操作権限が付与されます。sales_groupに所属するユーザーは、ordersテーブルに対して自由に操作できるようになります。

ユーザーとロールの削除方法

<i class= ユーザーとロールの削除方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
ユーザーとロールの削除方法

不要になったユーザーやロールは、セキュリティのために削除することが重要です。退職した社員のアカウントを放置しておくと、セキュリティリスクになります。

基本的な削除方法

ユーザーやロールを削除するには、DROP USERまたはDROP ROLEコマンドを使います。

ユーザー削除の例

DROP USER sales_user;

ただし、このコマンドが実行できるのは、そのユーザーがデータベース内のオブジェクト(テーブルなど)を所有していない場合だけです。

削除時の注意点

ユーザーがテーブルやデータベースを所有している場合、先にそれらのオブジェクトの所有権を別のユーザーに移すか、オブジェクトを削除する必要があります。所有権の移行にはALTER TABLEコマンドのOWNER TOオプションを使います。

テーブルの所有権変更例

ALTER TABLE customers OWNER TO postgres;

このコマンドで、customersテーブルの所有者をpostgresユーザーに変更できます。これにより、元の所有者だったユーザーを削除できるようになります。

実践的なユーザー管理の例

<i class= 実践的なユーザー管理の例" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
実践的なユーザー管理の例

ここでは、実際の運用を想定した、現実的なユーザー管理の流れを見ていきましょう。

会社のシステムを想定した権限設計

例えば、社内の販売管理システムを構築する場合を考えてみます。必要なロールとユーザーは次のようになります。

ロール構成の例
  • 管理者グループ:すべての操作が可能
  • 営業グループ:顧客情報と注文情報の読み取り・追加・更新が可能
  • 経理グループ:売上情報と請求情報の読み取り・更新が可能
  • 閲覧グループ:すべての情報の読み取りのみ可能

この構成を実現するには、まずグループロールを作成し、それぞれに適切な権限を設定します。そして、個別の社員アカウントを作成して、該当するグループに所属させます。

セキュリティのベストプラクティス

ユーザー管理では、セキュリティを考慮することが非常に重要です。以下のような点に注意してください。

セキュリティ上の注意点
  • パスワードは十分に複雑なものを設定する(文字・数字・記号を組み合わせる)
  • 必要最小限の権限だけを付与する(権限の最小化原則)
  • スーパーユーザー権限は本当に必要な管理者にのみ付与する
  • 定期的にユーザー一覧を確認し、不要なアカウントは削除する
  • 退職者のアカウントは速やかに削除または無効化する

よくあるトラブルと解決方法

<i class= よくあるトラブルと解決方法" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
よくあるトラブルと解決方法
ユーザーを作成したのにログインできない

CREATE ROLEで作成した場合、デフォルトではログイン権限がありません。WITH LOGINオプションを付けて作成するか、既存のロールにALTER ROLE ロール名 WITH LOGINで権限を追加してください。

データベースに接続できるのにテーブルが見えない

データベースへの接続権限と、テーブルへのアクセス権限は別です。GRANT SELECT ON TABLE テーブル名 TO ユーザー名のように、明示的にテーブルへの権限を付与する必要があります。

ユーザーを削除しようとするとエラーが出る

そのユーザーがテーブルやデータベースを所有している場合、削除できません。先に所有しているオブジェクトを削除するか、所有権を別のユーザーに移してから、ユーザーを削除してください。\dtコマンドでテーブル一覧と所有者を確認できます。

グループロールに権限を付与したのにメンバーが使えない

グループロールの権限を使うには、そのロールに明示的に切り替える必要がある場合があります。SET ROLE グループ名というコマンドでロールを切り替えるか、グループロールにINHERIT属性を付けることで、自動的に権限を継承できます。

カテゴリの一覧へ
新着記事
New1
PostgreSQL
PostgreSQLのLIMIT・OFFSETとパフォーマンス問題を完全解説|初心者でもわかる安全な使い方
New2
MySQL
MySQLのUPDATE文でデータを更新する基本を徹底解説|SQL初心者でもわかるデータベース更新入門
New3
PostgreSQL
PostgreSQLのOFFSET完全入門|並び替えと組み合わせてデータをスキップする方法を初心者向けに解説
New4
MySQL
MySQLで複数行INSERTを行う方法と注意点を徹底解説|SQL基礎から学ぶデータベース入門
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのDISTINCT完全ガイド|SQLで重複データを除外する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLの主キー・外部キーを完全解説!初心者でもわかる設定方法と考え方
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLのLEFT JOIN完全入門!不足データを補いながらテーブル結合する仕組みをやさしく解説
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLとは?初心者向けに特徴をわかりやすく解説
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLスキーマ設計のベストプラクティス完全ガイド|初心者でもわかるデータベース整理術
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLの権限管理を完全解説|スキーマ単位で理解するデータベースセキュリティの基礎
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLのpublicスキーマの役割と扱い方