CREATE POLICY — define a new row level security policy for a table
CREATE POLICYname
ONtable_name
[ AS { PERMISSIVE | RESTRICTIVE } ] [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] [ TO {role_name
| PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] [ USING (using_expression
) ] [ WITH CHECK (check_expression
) ]
The CREATE POLICY
command defines a new row-level security policy for a table. Note that row-level security must be enabled on the table (using ALTER TABLE ... ENABLE ROW LEVEL SECURITY
) in order for created policies to be applied.
A policy grants the permission to select, insert, update, or delete rows that match the relevant policy expression. Existing table rows are checked against the expression specified in USING
, while new rows that would be created via INSERT
or UPDATE
are checked against the expression specified in WITH CHECK
. When a USING
expression returns true for a given row then that row is visible to the user, while if false or null is returned then the row is not visible. When a WITH CHECK
expression returns true for a row then that row is inserted or updated, while if false or null is returned then an error occurs.
For INSERT
and UPDATE
statements, WITH CHECK
expressions are enforced after BEFORE
triggers are fired, and before any actual data modifications are made. Thus a BEFORE ROW
trigger may modify the data to be inserted, affecting the result of the security policy check. WITH CHECK
expressions are enforced before any other constraints.
Policy names are per-table. Therefore, one policy name can be used for many different tables and have a definition for each table which is appropriate to that table.
Policies can be applied for specific commands or for specific roles. The default for newly created policies is that they apply for all commands and roles, unless otherwise specified. Multiple policies may apply to a single command; see below for more details.