postgresql について
PostgreSQLの開発・運用向けリファレンスで、マルチテナントの行レベルセキュリティ、マイグレーション、バージョン変更、安全な操作を扱います。スキーマやテナント分離、アップグレード検証を担うチーム向けです。
主な機能
- 01トランザクション単位のRLSテナントコンテキスト設定
- 02マルチテナントテーブルとインデックスの設計
- 03Alembicマイグレーション手順の確認
- 04テナントデータ分離のテスト
- 05PostgreSQLのバージョンとアップグレード情報
- 06破壊的操作前の対象確認
活用シーン
- 01テナントクエリ向けRLSの設定
- 02テナント間のデータ可視性の確認
- 03スキーマ変更とダウングレードの計画
- 04削除やスキーマ操作の安全な実施
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itechmeat/ llm-code --skill postgresqlインストール後、Claude Code で/postgresqlを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/authentication-oauth.mdauthentication.mdcharset-encoding.mdconnection-settings.mderror-handling.mdinternals.mdpostgresql-19.mdprotocol.mdquery-tuning.mdreplication.mdtable-design.mduser-management.mdvacuum.md詳細
PostgreSQL
RLS のマルチテナントパターン
必須事項
- テナント単位のクエリには、必ず RLS コンテキストを設定します
- コンテキストは、クエリと同じトランザクション内で設定します
- テナント ID のフォールバックはありません(欠落している場合は即座に失敗させます)
- 非同期フレームワークを使用する場合、DB アクセスは非同期のみにします
RLS コンテキストの設定
RLS が機能するのは、現在のトランザクションにコンテキストが設定されている場合のみです。
SET LOCAL app.current_tenant_id = '<tenant_uuid>';
そのトランザクションで最初のテナント単位のクエリを実行する前に設定する必要があります。
よくある失敗パターン
- 最初の
select()の後にSET LOCAL ...を設定する - あるセッションでコンテキストを設定し、別のセッションでクエリを実行する
- 想定されるトランザクションの範囲外でクエリを実行する
典型的な RLS ポリシー
ALTER TABLE some_table ENABLE ROW LEVEL SECURITY;
CREATE POLICY some_table_tenant_isolation
ON some_table
USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);
マルチテナントテーブルのチェックリスト
- テナント ID 列は UUID
- tenants テーブルへの FK に
ON DELETE CASCADEを指定 - アクセスパターンに合わせてインデックスを作成(通常は tenant_id を先頭にする)
- PostgreSQL は FK 列に自動でインデックスを作成しません。明示的に追加してください
NULLS NOT DISTINCTを使用しない限り、UNIQUE では複数の NULL が許可されます(PG15+)
- RLS が有効で、ポリシーが存在する
- アプリケーションコードでトランザクション開始時に RLS コンテキストを設定する
Alembic マイグレーションのチェックリスト
- スキーマを追加/変更する(列、制約、FK)
- インデックスを作成/更新する
- RLS を有効にして、ポリシーを作成/調整する
- 分離性を検証するテストを追加する
- 実際に機能する downgrade を用意する(スタブは不可)
バージョンに関する注意事項
PostgreSQL 19(ベータ)
- 19 は Beta 3(2026-08-13) の段階です。GA は 2026 年 9 月/10 月の予定で、詳細は今後変更される可能性があります。最新の安定版系列は
18.6です。 - 主な変更点:
VACUUM FULLとCLUSTERに代わるREPACK/REPACK CONCURRENTLY、スコアリングシステムを用いた並列 autovacuum、シーケンスの論理レプリケーション、SQL/PGQ プロパティグラフ、GROUP BY ALL、FOR PORTION OF、チェックサムのオンラインでの有効化/無効化。 - 事前に対応が必要な、互換性のない変更は 18 件あります。これには
standard_conforming_stringsの強制、RADIUS の削除、デフォルトでjitがオフになること、default_toast_compressionがlz4に切り替わること、max_locks_per_transactionのデフォルトが 128 になり、サイズ設定が変更されることが含まれます。 - 詳細とアップグレードのチェックリスト:postgresql-19.md
PostgreSQL 18.4
18.4はセキュリティ/堅牢性のパッチリリースです。既存の18.xクラスターでダンプ/リストアは不要です。- このパッチ系列では、起動パケットの解析、バックアップツール(
pg_basebackup、pg_rewind、pg_verifybackup)、複数の論理レプリケーションのコードパスが強化されています。 MERGE、非決定的照合順序、生成列のほか、さまざまな集約/ウィンドウ関数のエッジケースについて、プランナー/エグゼキューターの修正も行われています。
RLS 分離性のテスト手順
目的:
- テナント A のデータはテナント A から参照できる
- テナント A のデータはテナント B からは参照できない
標準的な手順:
- テナント A と B のデータを管理者セッション(RLS をバイパス)でセットアップする
- RLS セッションで確認する:
- コンテキストをテナント A に設定 → テナント A のデータのみが表示される
- コンテキストをテナント B に設定 → テナント A のデータは表示されない
破壊的操作の安全対策
厳守事項:
- 特定のデータを対象とする狭い
WHERE条件なしでDELETEを実行しない - 明示的な確認なしで
TRUNCATE/DROPを実行しない
破壊的操作の実行前に行うこと:
- 正確な対象(テーブル/ID/日付範囲)を確認する
- 先に
SELECT/行数の確認を実行し、結果を提示する - 最終確認を求めてから実行する
参考資料
バージョン
- postgresql-19.md — PostgreSQL 19(ベータ):分野別の新機能、互換性のない変更の全一覧、アップグレードのチェックリスト
スキーマと設計
- table-design.md — データ型、制約、インデックス、パーティショニング、JSONB、安全なスキーマ変更
- charset-encoding.md — 文字セット、エンコーディング、照合順序、ICU、ロケール設定
認証
- authentication.md — pg_hba.conf、SCRAM-SHA-256、md5、peer、cert、LDAP、GSSAPI
- authentication-oauth.md — OAuth 2.0(PostgreSQL 18+)、SASL OAUTHBEARER、バリデーター
- user-management.md — CREATE/ALTER/DROP ROLE、メンバーシップ、GRANT/REVOKE、定義済みロール
ランタイム設定
- connection-settings.md — listen_addresses、max_connections、SSL、TCP キープアライブ
- query-tuning.md — プランナーの設定、work_mem、並列クエリ、コスト定数
- replication.md — ストリーミングレプリケーション、WAL、同期コミット、論理レプリケーション
- vacuum.md — 自動バキューム、バキュームのコストモデル、フリーズの経過時間、テーブル単位のチューニング
- error-handling.md — exit_on_error、restart_after_crash、data_sync_retry
内部構造
- internals.md — クエリ処理パイプライン、パーサー/リライター/プランナー/エグゼキューター、システムカタログ、ワイヤプロトコル、アクセスメソッド
- protocol.md — ワイヤプロトコル v3.2:メッセージ形式、起動、認証、クエリ、COPY、レプリケーション
リンク
関連項目
- sql-expert — クエリパターン、EXPLAIN ワークフロー、最適化
コメント
Markdown 対応