PostgreSQL でユーザーに権限を付与する

Bilal Shahid 2023年6月20日
  1. PostgreSQL の特権の簡単な紹介
  2. PostgreSQL での GRANT キーワードの使用
PostgreSQL でユーザーに権限を付与する

PostgreSQL では、テーブルやビューなどのすべてのデータベース オブジェクトに所有者がいます。 通常、所有者はオブジェクトを作成したユーザーです。

したがって、所有者だけが作成したオブジェクトを変更または削除する権利を持ち、デフォルトでは他のユーザーはこれを行うことができません。 所有者が他のユーザーが自分のオブジェクトに対して特定のアクションを実行できるようにする場合は、そのユーザーに権限を付与する必要があります。

このチュートリアルでは、所有者が PostgreSQL の別のユーザーにすべての権限を付与する方法を示します。 基本から始めて、特権とは何かを学びましょう。

PostgreSQL の特権の簡単な紹介

権限は、特定のデータベース オブジェクトに関連する権限です。 PostgreSQL には、次の種類の権限があります。

特典名 特典の説明
SELECT テーブルのようなオブジェクトの列から任意の値を選択できるようにする
INSERT テーブルへのデータ行の挿入を許可する
UPDATE テーブル内の既存のデータの変更を許可します
DELETE テーブル内の既存のデータの削除を許可します
TRUNCATE テーブルへの行の追加\追加を許可します
REFERENCES テーブル内の外部キーを参照できます
TRIGGER イベントのトリガーを作成できます
CREATE データベース内でさまざまなオブジェクトを作成できます
CONNECT データベース サーバーとの接続を確立できるようにする
TEMPORARY 一時オブジェクトの宣言を許可します
EXECUTE データベース内でのクエリの実行を許可します
USAGE データベース内のオブジェクトの使用方法の定義

注: オブジェクトを DROP したり、その定義を変更したりする権限をユーザーに付与することはできません。

これらの権限はすべて、ユーザーがデータベースに対して実行できるさまざまなアクションを表しています。 たとえば、CREATE 権限が付与されていない場合、ユーザーは特定のデータベースでテーブルを CREATE できません。

では、ユーザーにすべての権限を付与するにはどうすればよいでしょうか。 たとえば、次のコマンドを実行して一時ユーザーを作成します。

CREATE USER myuser WITH PASSWORD 'password';

次に、サンプル テーブルを作成し、いくつかのデータを入力します。

create table person(
    name varchar(30) not null,
    age int not null
);

insert into person values ('Ali', 20), ('Fatima', 19), ('Hassan', 22);

postgresql でユーザーに権限を付与 - 出力 1

すべての特権は、以下で説明する GRANT キーワードを使用してユーザーに付与されます。

PostgreSQL での GRANT キーワードの使用

GRANT キーワードの基本的な構文は次のとおりです。

GRANT privilege
ON object
TO {PUBLIC | GROUP group | username}

構文の各コンポーネントを 1つずつ見てみましょう。

  • privilege - ここでは、ユーザーに付与する権限を記述します。 この場合、すべての権限を付与する方法を学習しているため、ALL PRIVILEGES と記述します。
  • object - データベース オブジェクトには、テーブル、ビュー、シーケンス、データベース、関数、プロシージャ、またはスキーマが含まれますが、これらに限定されません。
  • PUBLIC - このキーワードを記述すると、すべてのロールとグループのすべてのユーザーに権限が付与されます。
  • GROUP - グループは PostgreSQL のロールの一種です。 ロールは、データベース オブジェクトを所有するグループまたは個々のユーザーです。 名前を指定することで、PostgreSQL のグループにすべての権限を付与できます。
  • username - 個々のユーザーにすべての権限を付与する場合は、ここに username を書き込みます。

この構文の使用法を例を挙げて説明します。 定義済みのテーブル person 上で作成した myuser にすべての権限を付与するとします。

このために、次のクエリを実行できます。

GRANT ALL PRIVILEGES ON person TO myuser;

出力には次のテキストが表示されます。

postgresql でユーザーに権限を付与 - 出力 2

これは、指定された権限が正常に付与されたことを意味します。 PostgreSQL では、上記のクエリで記述されているように、PRIVILEGES を記述することはオプションです。 したがって、代替手段は次のとおりです。

GRANT ALL ON person TO myuser;

これも同様に機能します。 同様に、他のデータベース オブジェクトを作成し、それらに対するすべての権限をユーザーに付与することもできます。 例として、サンプル プロシージャを作成してみましょう。

create procedure just_an_example()
language plpgsql
as $$
begin
select * from person;
end; $$

次に、以下のクエリを実行して、すべての権限を myuser に付与します。

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser;

正常に付与されます:

postgresql でユーザーに権限を付与 - 出力 2

すべての権限を付与しながら、WITH GRANT OPTION を追加することもできます。 これは、ユーザーが他のユーザーに権限を付与する権限も持っていることを意味します。 例えば:

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser WITH GRANT OPTION;

このクエリが実行された後、myuser は必要なユーザーにさらに権限を付与することができますが、最初は just_an_example() の所有者のみが資格を与えられています。

上記で説明した方法には、すべての権限をユーザーに直接付与することが含まれます。 ただし、より適切な方法は、すべての権限をグループに付与し、ユーザーをメンバーにすることです。

この手法は、複数のユーザーを扱うときに特権を整理したり、特権を取り消したりするのに役立つため、より優れています。 これがどのように行われるか見てみましょう。

まず、次の方法でグループを作成します。

CREATE GROUP mygroup;

以下の出力に示すように、正常に作成されます。

postgresql でユーザーに権限を付与 - 出力 3

ここで、次のクエリを使用して、テーブル person のすべての権限をグループ mygroup に付与します。

GRANT ALL PRIVILEGES ON person TO mygroup;

出力は、権限が正常に付与されたことを示しています。

postgresql でユーザーに権限を付与 - 出力 2

次に、次の構文を使用して、myusermygroup のメンバーとして追加します。

GRANT mygroup TO myuser;

次の出力が得られ、メンバーシップが確認されます。

postgresql でユーザーに権限を付与 - 出力 4

このようにして、テーブル person に対するすべての権限をグループ mygroup に付与しました。myusermygroup の一部であるため、person に対するすべての権限も持っています。

これは、データベース オブジェクトに対するすべての権限を PostgreSQL のユーザーに付与する方法についての説明をまとめたものです。 GRANT キーワードの使用法と構文、およびユーザーにすべての権限を付与するために使用できるさまざまな方法を学習していただければ幸いです。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub