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);
すべての特権は、以下で説明する 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 では、上記のクエリで記述されているように、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;
正常に付与されます:
すべての権限を付与しながら、WITH GRANT OPTION
を追加することもできます。 これは、ユーザーが他のユーザーに権限を付与する権限も持っていることを意味します。 例えば:
GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser WITH GRANT OPTION;
このクエリが実行された後、myuser
は必要なユーザーにさらに権限を付与することができますが、最初は just_an_example()
の所有者のみが資格を与えられています。
上記で説明した方法には、すべての権限をユーザーに直接付与することが含まれます。 ただし、より適切な方法は、すべての権限をグループに付与し、ユーザーをメンバーにすることです。
この手法は、複数のユーザーを扱うときに特権を整理したり、特権を取り消したりするのに役立つため、より優れています。 これがどのように行われるか見てみましょう。
まず、次の方法でグループを作成します。
CREATE GROUP mygroup;
以下の出力に示すように、正常に作成されます。
ここで、次のクエリを使用して、テーブル person
のすべての権限をグループ mygroup
に付与します。
GRANT ALL PRIVILEGES ON person TO mygroup;
出力は、権限が正常に付与されたことを示しています。
次に、次の構文を使用して、myuser
を mygroup
のメンバーとして追加します。
GRANT mygroup TO myuser;
次の出力が得られ、メンバーシップが確認されます。
このようにして、テーブル person
に対するすべての権限をグループ mygroup
に付与しました。myuser
は mygroup
の一部であるため、person
に対するすべての権限も持っています。
これは、データベース オブジェクトに対するすべての権限を PostgreSQL のユーザーに付与する方法についての説明をまとめたものです。 GRANT
キーワードの使用法と構文、およびユーザーにすべての権限を付与するために使用できるさまざまな方法を学習していただければ幸いです。
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