用語集のすべての用語

行レベルセキュリティ(RLS)

PostgreSQL の行レベルセキュリティ(RLS)とは?

行レベルセキュリティを使うと、CREATE POLICY で作成したポリシーにより、各ロールがどの行を参照・変更できるかをテーブルが行単位で決められます。

行レベルセキュリティ(RLS)は、クエリが返したり変更したりできる行を、ロールごとに制限する機能です。テーブルに対して ALTER TABLE ... ENABLE ROW LEVEL SECURITY で有効化し、CREATE POLICY でポリシーを追加します。ポリシーの USING 式はロールが参照できる行を絞り込み、WITH CHECK 式は新規の行や更新後の行を許可するかどうかを決めます。

RLS が有効で適用されるポリシーがない場合、PostgreSQL はデフォルト拒否のポリシーを使います。つまり、どの行も参照・変更できません。スーパーユーザーと BYPASSRLS 属性を持つロールは常に行セキュリティをバイパスし、テーブルの所有者も、テーブルに FORCE ROW LEVEL SECURITY が設定されていない限り通常はバイパスします。ポリシーのテストは、アプリケーションが実際に接続に使うロールで行ってください。

例

この例では、テーブルの RLS を有効化し、owner 列を current_user と比較するポリシーを追加して、ロール alice としてテーブルをクエリします。返ってくるのは alice の行だけです。セットアップは RLS をバイパスするスーパーユーザーで実行するため、最後のクエリの前にロールを切り替えています。

CREATE TABLE notes (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  owner text NOT NULL,
  body text NOT NULL
);
INSERT INTO notes (owner, body) VALUES ('alice', 'hello'), ('bob', 'hi');

ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY notes_owner ON notes USING (owner = current_user);

CREATE ROLE alice;
GRANT SELECT ON notes TO alice;

SET ROLE alice;
SELECT * FROM notes;
RESET ROLE;

拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。

出典

PostgreSQL 公式ドキュメント(英語)。

関連用語