0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQLでユーザー作成して権限の変更をするには?

Posted at

コマンドをついつい忘れてしまう。

GRANTを使うと作成したユーザーに権限を付与したり制限をすることができます。ローカル環境で作成するときは、全部つけると思いますが...

なぜ記事を書こうと思ったのか?

業務で、Active Recordを使うことがあったのですが、KubernetesのPodで定義されたマニフェストファイルの通り作成されているが、コマンドが実行する権限がないエラーがでた?

権限を作成してユーザーに付与すれば解決します😅

そこで詰まったので練習用に、Dockerを使用してローカル環境を汚さないコンテナを作成して、練習してみました。

もしDockerなくてもローカルに、PostgreSQLがあればそちら使っていただいても同じことができると思います。

postgre.mdを作成して以下の解説を記載

PostgreSQL References

DockerでPostgreSQLを使う。

- itオプションについて

exec -it オプションの説明
docker exec -it コマンドの -it は2つのオプションが組み合わさっています:

-i (interactive): コンテナの標準入力(STDIN)をオープンに保ちます。これにより、ユーザーからの入力をコンテナに送信できます。
-t (tty): 疑似TTY(ターミナル)を割り当てます。これによりプロンプトが正しく表示され、コマンド実行時のフォーマットが整います。
この2つを組み合わせることで、ターミナルでコンテナと対話的にやり取りできるようになります。

使用例
PostgreSQLコンテナに入るなら例えば:

-it なしで実行すると、単にコマンドを実行してその結果を返すだけで、対話的な操作ができません。対話的なシェルやDBクライアントを使う場合は -it が必要です。

コンテナ内部に入る

# コンテナ名を調べる
docker ps
# Postgre内部に入る
# NAMESの場合rails8-docker-exec-db-1
docker exec -it rails8-docker-exec-db-1 bash

PostgreSQL ユーザー管理コマンド

PostgreSQLコンテナ内に入った後、以下のコマンドでユーザー管理ができます。

PostgreSQLの対話モードに入る

まず、PostgreSQLの対話モードに入ります:

psql -U postgres

ユーザー作成コマンド

基本的なユーザー作成

CREATE USER username WITH PASSWORD 'password';

権限付きユーザー作成

CREATE USER username WITH PASSWORD 'password' CREATEDB;

一般ユーザー作成 (General User)

-- 基本的な一般ユーザーの作成
CREATE USER general_user WITH PASSWORD 'password';

-- 特定のデータベースへの接続権限を付与
GRANT CONNECT ON DATABASE database_name TO general_user;

-- テーブルへの読み取り権限のみを付与
GRANT SELECT ON ALL TABLES IN SCHEMA public TO general_user;

-- または特定のテーブルへの読み書き権限を付与
GRANT SELECT, INSERT, UPDATE ON table_name TO general_user;

ユーザーに全ての権限を付与

-- スーパーユーザー権限を付与する方法
ALTER USER general_user WITH SUPERUSER;

-- または、データベースごとに全ての権限を付与
GRANT ALL PRIVILEGES ON DATABASE database_name TO general_user;

-- スキーマ内のすべてのテーブルに対して全ての権限を付与
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO general_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO general_user;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO general_user;

-- 新規作成されるオブジェクトに対しても自動的に権限を付与
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO general_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO general_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO general_user;

ユーザー確認コマンド

\du

スクリーンショット 2025-05-09 7.22.56.png

特定のユーザーの権限を確認

SELECT usename, usecreatedb, usesuper FROM pg_user WHERE usename = 'username';

PostgreSQL対話モードを終了

\q

これらのコマンドはすべてPostgreSQLの対話モード内で実行します。

-- データベース新規作成
CREATE DATABASE dev_db;
-- 作成されているデータベースを確認
\l

データベース変更コマンド

PostgreSQLの対話モード内で、データベースを変更するには以下のコマンドを使用します:

\c database_name
-- dev_dbに変更
\c dev_db

テーブル作成コマンド

food_reservation テーブルを作成するには以下のクエリを使用します:

CREATE TABLE food_reservation (
    id SERIAL PRIMARY KEY,
    customer_name VARCHAR(100) NOT NULL,
    reservation_date DATE NOT NULL,
    number_of_guests INT NOT NULL,
    special_requests TEXT
);

テーブル一覧表示コマンド

現在のデータベース内のテーブル一覧を表示するには以下のコマンドを使用します:

\dt

ダミーデータ挿入コマンド

food_reservation テーブルにダミーの予約情報を追加するには以下のクエリを使用します:

INSERT INTO food_reservation (customer_name, reservation_date, number_of_guests, special_requests)
VALUES 
    ('山田 太郎', '2023-11-01', 4, '誕生日ケーキあり'),
    ('佐藤 花子', '2023-11-02', 2, '誕生日ケーキなし'),
    ('鈴木 一郎', '2023-11-03', 3, '誕生日ケーキあり');

これにより、3件のダミー予約情報がテーブルに追加されます。

追加されたデータの確認

-- もし仮にデータが100件あって取得すると良くないので3件と指定
SELECT * FROM food_reservation LIMIT 3;

スクリーンショット 2025-05-09 7.41.50.png

最後に

普段はモバイルアプリのお仕事が専門なのですが、横断的な業務とやらをすることが多いです。SQLなんて使わずに、PrismaなどのORMを使うことが最近は多かったのですが、プログラミングスクールで学んでいた昔からある知識は意外と多く使われていたので、枯れた技術を学んでおいてよかったなと思いました。

変な話、NoSQLしかわからない人は死にますね😇

昔学習で使っていた本

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?