PostgreSQLの管理系コマンドまとめ

概要
DBの管理系コマンドは導入専門にやっていれば忘れることはないのだが、
分析目的でちょっとインストールした場合など、そんな頻繁に設定しない場合は忘れてしまう。
そんなPostgreSQLの管理コマンド、ユーザ管理など意外と落とし穴があるので復習しておく。
Cloud SQL、RDS、AlloyDBなどのマネージドDBを利用する場合はpg_ctlやinitdbは不要である。
導入手順は
- インストール
- データベースディレクトリの作成(
initdbコマンド) - 起動(
pg_ctlコマンド) - ユーザの登録(
createuserコマンド) - データベースの作成(
createdbコマンド) - データベースの権限管理
という順になる。
pg_ctlコマンド
起動、停止などのコマンド。 postgresユーザでないと実行できない。
その他管理コマンド
initdb
データディレクトリの生成。これがないと起動もできないし、データベースも作成できない。 新しく作るデータベースのデフォルトエンコーディング、ロケール(通常不要)を指定できる
データディレクトリを指定しない場合、環境変数PGDATA=/var/lib/postgres/dataの値が採用される。
createdb
データベースを作成。デフォルトでinitdbのエンコーディングが採用される。
デフォルトでない文字コードを採用する場合は文字コード、ロケールに加えて「-T template0」も必要。
dropdb
バックスラッシュコマンド
\d: テーブル一覧\l: データベース一覧\z: 権限一覧\c データベース名: 接続するデータベースの変更\du: ユーザ一覧\i SQLファイル名: SQLファイルの実行
権限
最初にやるべきこと
デフォルトで作成したすべてのユーザは
- すべてのデータベースに接続できる
- スキーマ
publicではすべての権限が与えられている
ということで、管理者が意図していない権限のテーブルにアクセスできてしまう。 そこでこれらの権限を削除する必要がある。
必要に応じてユーザに
ユーザの追加
パスワードの変更
データベースtemplate1に接続して
ユーザの削除
権限を付与
GRANT文の主な使い方
-- 特定のデータベースに対して(権限は{ CONNECT=読み専用の場合でも最低限必要 | TEMPORARY=一時テーブル作成 | CREATE | ALL })
GRANT 権限名 ON DATABASE データベース名 TO ユーザ名;
-- 特定のテーブルに対して(主な権限は{ CRUDの4つ | TRUNCATE | ALL })
GRANT 権限名 ON テーブル名 TO ユーザ名
GRANT 権限名 ON スキーマ名.テーブル名 TO ユーザ名
-- public以外のスキーマ(他のユーザが所有しているスキーマ)の場合はさらに以下が必要(権限は{ USAGE=読み込み | ALL=全権限 })
GRANT 権限名 ON SCHEMA スキーマ名 TO ユーザ名;
text
「最初にやるべきこと」で権限を削除している場合、以下の手順になる。
-- 1. まずすべての権限を削除しているので、データベースへの接続権限を付ける必要がある。
GRANT CONNECT ON DATABASE データベース名 TO ユーザ名;
-- 2. スキーマに対してアクセス権限を付ける。
GRANT USAGE ON SCHEMA スキーマ名 TO ユーザ名;
-- 3. 特定のテーブルに対して(主な権限は{ CRUDの4つ | TRUNCATE | ALL })
GRANT 権限名 ON テーブル名 TO ユーザ名
sql
権限を削除
GRANT→REVOKE, FROM→TO
-- 特定のデータベースに対して(権限は{ CONNECT=読み専用の場合でも最低限必要 | TEMPORARY=一時テーブル作成 | CREATE | ALL })
REVOKE 権限名 ON DATABASE データベース名 FROM ユーザ名;
-- 特定のテーブルに対して(主な権限は{ CRUDの4つ | TRUNCATE | ALL })
REVOKE 権限名 ON テーブル名 FROM ユーザ名
REVOKE 権限名 ON スキーマ名.テーブル名 FROM ユーザ名
-- public以外のスキーマ(他のユーザが所有しているスキーマ)の場合はさらに以下が必要(権限は{ USAGE=読み込み | ALL=全権限 })
REVOKE 権限名 ON SCHEMA スキーマ名 FROM ユーザ名;
text
