diff options
Diffstat (limited to 'doc/src')
| -rw-r--r-- | doc/src/sgml/catalogs.sgml | 100 | ||||
| -rw-r--r-- | doc/src/sgml/config.sgml | 40 | ||||
| -rw-r--r-- | doc/src/sgml/event-trigger.sgml | 18 | ||||
| -rw-r--r-- | doc/src/sgml/keywords.sgml | 7 | ||||
| -rw-r--r-- | doc/src/sgml/ref/allfiles.sgml | 3 | ||||
| -rw-r--r-- | doc/src/sgml/ref/alter_policy.sgml | 135 | ||||
| -rw-r--r-- | doc/src/sgml/ref/alter_role.sgml | 3 | ||||
| -rw-r--r-- | doc/src/sgml/ref/alter_table.sgml | 17 | ||||
| -rw-r--r-- | doc/src/sgml/ref/create_policy.sgml | 318 | ||||
| -rw-r--r-- | doc/src/sgml/ref/create_role.sgml | 20 | ||||
| -rw-r--r-- | doc/src/sgml/ref/drop_policy.sgml | 109 | ||||
| -rw-r--r-- | doc/src/sgml/reference.sgml | 3 | 
12 files changed, 773 insertions, 0 deletions
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 68f84343520..76d64050618 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -239,6 +239,11 @@       </row>       <row> +      <entry><link linkend="catalog-pg-rowsecurity"><structname>pg_rowsecurity</structname></link></entry> +      <entry>table row-level security policies</entry> +     </row> + +     <row>        <entry><link linkend="catalog-pg-seclabel"><structname>pg_seclabel</structname></link></entry>        <entry>security labels on database objects</entry>       </row> @@ -1936,6 +1941,15 @@       </row>       <row> +      <entry><structfield>relhasrowsecurity</structfield></entry> +      <entry><type>bool</type></entry> +      <entry> +       True if table has row-security enabled; see +       <link linkend="catalog-pg-rowsecurity"><structname>pg_rowsecurity</structname></link> catalog +      </entry> +     </row> + +     <row>        <entry><structfield>relhassubclass</structfield></entry>        <entry><type>bool</type></entry>        <entry></entry> @@ -5328,6 +5342,86 @@    </table>   </sect1> + <sect1 id="catalog-pg-rowsecurity"> +  <title><structname>pg_rowsecurity</structname></title> + +  <indexterm zone="catalog-pg-rowsecurity"> +   <primary>pg_rowsecurity</primary> +  </indexterm> + +  <para> +   The catalog <structname>pg_rowsecurity</structname> stores row-level +   security policies for each table.  A policy includes the kind of +   command which it applies to (or all commands), the roles which it +   applies to, the expression to be added as a security-barrier +   qualification to queries which include the table and the expression +   to be added as a with-check option for queries which attempt to add +   new records to the table. +  </para> + +  <table> + +   <title><structname>pg_rowsecurity</structname> Columns</title> + +   <tgroup cols="4"> +    <thead> +     <row> +      <entry>Name</entry> +      <entry>Type</entry> +      <entry>References</entry> +      <entry>Description</entry> +     </row> +    </thead> + +    <tbody> +     <row> +      <entry><structfield>rsecpolname</structfield></entry> +      <entry><type>name</type></entry> +      <entry></entry> +      <entry>The name of the row-security policy</entry> +     </row> + +     <row> +      <entry><structfield>rsecrelid</structfield></entry> +      <entry><type>oid</type></entry> +      <entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry> +      <entry>The table to which the row-security policy belongs</entry> +     </row> + +     <row> +      <entry><structfield>rseccmd</structfield></entry> +      <entry><type>char</type></entry> +      <entry></entry> +      <entry>The command type to which the row-security policy is applied.</entry> +     </row> + +     <row> +      <entry><structfield>rsecqual</structfield></entry> +      <entry><type>pg_node_tree</type></entry> +      <entry></entry> +      <entry>The expression tree to be added to the security barrier qualifications for queries which use the table.</entry> +     </row> + +     <row> +      <entry><structfield>rsecwithcheck</structfield></entry> +      <entry><type>pg_node_tree</type></entry> +      <entry></entry> +      <entry>The expression tree to be added to the with check qualifications for queries which attempt to add rows to the table.</entry> +     </row> + +    </tbody> +   </tgroup> +  </table> + +  <note> +   <para> +    <literal>pg_class.relhasrowsecurity</literal> +    True if the table has row-security enabled. +    Must be true if the table has a row-security policy in this catalog. +   </para> +  </note> + + </sect1>   <sect1 id="catalog-pg-seclabel">    <title><structname>pg_seclabel</structname></title> @@ -9133,6 +9227,12 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx        <entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.relhastriggers</literal></entry>        <entry>True if table has (or once had) triggers</entry>       </row> +     <row> +      <entry><structfield>hasrowsecurity</structfield></entry> +      <entry><type>boolean</type></entry> +      <entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.relhasrowsecurity</literal></entry> +      <entry>True if table has row security enabled</entry> +     </row>      </tbody>     </tgroup>    </table> diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 5be8fdcc252..70e47aaa3a1 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5429,6 +5429,46 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;        </listitem>       </varlistentry> +     <varlistentry id="guc-row-security" xreflabel="row_security"> +      <term><varname>row_security</varname> (<type>enum</type>) +      <indexterm> +       <primary><varname>row_security</> configuration parameter</primary> +      </indexterm> +      </term> +      <listitem> +       <para> +        This variable controls if row security policies are to be applied +        to queries which are run against tables that have row security enabled. +        The default is 'on'.  When set to 'on', all users, except superusers +        and the owner of the table, will have the row policies for the table +        applied to their queries.  The table owner and superuser can request +        that row policies be applied to their queries by setting this to +        'force'.  Lastly, this can also be set to 'off' which will bypass row +        policies for the table, if possible, and error if not. +       </para> + +       <para> +        For a user who is not a superuser and not the table owner to bypass +        row policies for the table, they must have the BYPASSRLS role attribute. +        If this is set to 'off' and the user queries a table which has row +        policies enabled and the user does not have the right to bypass +        row policies then a permission denied error will be returned. +       </para> + +       <para> +        The allowed values of <varname>row_security</> are +        <literal>on</> (apply normally- not to superuser or table owner), +        <literal>off</> (fail if row security would be applied), and +        <literal>force</> (apply always- even to superuser and table owner). +       </para> + +       <para> +        For more information on row security policies, +        see <xref linkend="SQL-CREATEPOLICY">. +       </para> +      </listitem> +     </varlistentry> +       <varlistentry id="guc-default-tablespace" xreflabel="default_tablespace">        <term><varname>default_tablespace</varname> (<type>string</type>)        <indexterm> diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml index 3db8ef1a132..6f71a27855e 100644 --- a/doc/src/sgml/event-trigger.sgml +++ b/doc/src/sgml/event-trigger.sgml @@ -196,6 +196,12 @@          <entry align="center"><literal>-</literal></entry>         </row>         <row> +        <entry align="left"><literal>ALTER POLICY</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>-</literal></entry> +       </row> +       <row>          <entry align="left"><literal>ALTER SCHEMA</literal></entry>          <entry align="center"><literal>X</literal></entry>          <entry align="center"><literal>X</literal></entry> @@ -352,6 +358,12 @@          <entry align="center"><literal>-</literal></entry>         </row>         <row> +        <entry align="left"><literal>CREATE POLICY</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>-</literal></entry> +       </row> +       <row>          <entry align="left"><literal>CREATE RULE</literal></entry>          <entry align="center"><literal>X</literal></entry>          <entry align="center"><literal>X</literal></entry> @@ -526,6 +538,12 @@          <entry align="center"><literal>X</literal></entry>         </row>         <row> +        <entry align="left"><literal>DROP POLICY</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>X</literal></entry> +        <entry align="center"><literal>X</literal></entry> +       </row> +       <row>          <entry align="left"><literal>DROP RULE</literal></entry>          <entry align="center"><literal>X</literal></entry>          <entry align="center"><literal>X</literal></entry> diff --git a/doc/src/sgml/keywords.sgml b/doc/src/sgml/keywords.sgml index 1c93b7c148d..b0dfd5ff75b 100644 --- a/doc/src/sgml/keywords.sgml +++ b/doc/src/sgml/keywords.sgml @@ -3423,6 +3423,13 @@      <entry>non-reserved</entry>     </row>     <row> +    <entry><token>POLICY</token></entry> +    <entry>non-reserved</entry> +    <entry></entry> +    <entry></entry> +    <entry></entry> +   </row> +   <row>      <entry><token>PORTION</token></entry>      <entry></entry>      <entry>reserved</entry> diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index b685e16a0fa..7aa3128090d 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -25,6 +25,7 @@ Complete list of usable sgml source files in this directory.  <!ENTITY alterOperator      SYSTEM "alter_operator.sgml">  <!ENTITY alterOperatorClass SYSTEM "alter_opclass.sgml">  <!ENTITY alterOperatorFamily SYSTEM "alter_opfamily.sgml"> +<!ENTITY alterPolicy        SYSTEM "alter_policy.sgml">  <!ENTITY alterRole          SYSTEM "alter_role.sgml">  <!ENTITY alterRule          SYSTEM "alter_rule.sgml">  <!ENTITY alterSchema        SYSTEM "alter_schema.sgml"> @@ -69,6 +70,7 @@ Complete list of usable sgml source files in this directory.  <!ENTITY createOperator     SYSTEM "create_operator.sgml">  <!ENTITY createOperatorClass SYSTEM "create_opclass.sgml">  <!ENTITY createOperatorFamily SYSTEM "create_opfamily.sgml"> +<!ENTITY createPolicy       SYSTEM "create_policy.sgml">  <!ENTITY createRole         SYSTEM "create_role.sgml">  <!ENTITY createRule         SYSTEM "create_rule.sgml">  <!ENTITY createSchema       SYSTEM "create_schema.sgml"> @@ -110,6 +112,7 @@ Complete list of usable sgml source files in this directory.  <!ENTITY dropOperatorClass  SYSTEM "drop_opclass.sgml">  <!ENTITY dropOperatorFamily  SYSTEM "drop_opfamily.sgml">  <!ENTITY dropOwned          SYSTEM "drop_owned.sgml"> +<!ENTITY dropPolicy         SYSTEM "drop_policy.sgml">  <!ENTITY dropRole           SYSTEM "drop_role.sgml">  <!ENTITY dropRule           SYSTEM "drop_rule.sgml">  <!ENTITY dropSchema         SYSTEM "drop_schema.sgml"> diff --git a/doc/src/sgml/ref/alter_policy.sgml b/doc/src/sgml/ref/alter_policy.sgml new file mode 100644 index 00000000000..37615fcab5d --- /dev/null +++ b/doc/src/sgml/ref/alter_policy.sgml @@ -0,0 +1,135 @@ +<!-- +doc/src/sgml/ref/alter_policy.sgml +PostgreSQL documentation +--> + +<refentry id="SQL-ALTERPOLICY"> + <indexterm zone="sql-alterpolicy"> +  <primary>ALTER POLICY</primary> + </indexterm> + + <refmeta> +  <refentrytitle>ALTER POLICY</refentrytitle> +  <manvolnum>7</manvolnum> +  <refmiscinfo>SQL - Language Statements</refmiscinfo> + </refmeta> + + <refnamediv> +  <refname>ALTER POLICY</refname> +  <refpurpose>change the definition of a row-security policy</refpurpose> + </refnamediv> + + <refsynopsisdiv> +<synopsis> +ALTER POLICY <replaceable class="parameter">name</replaceable> ON <replaceable class="parameter">table_name</replaceable> +    [ RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ] +    [ TO { <replaceable class="parameter">role_name</replaceable> | PUBLIC } [, ...] ] +    [ USING ( <replaceable class="parameter">expression</replaceable> ) ] +    [ WITH CHECK ( <replaceable class="parameter">check_expression</replaceable> ) ] +</synopsis> + </refsynopsisdiv> + + <refsect1> +  <title>Description</title> + +  <para> +   <command>ALTER POLICY</command> changes the <replaceable class="parameter"> +   definition</replaceable> of an existing row-security policy. +  </para> + +  <para> +   To use <command>ALTER POLICY</command>, you must own the table that +   the policy applies to. +  </para> + </refsect1> + + <refsect1> +  <title>Parameters</title> + +  <variablelist> +   <varlistentry> +    <term><replaceable class="parameter">name</replaceable></term> +    <listitem> +     <para> +      The name of an existing policy to alter. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">table_name</replaceable></term> +    <listitem> +     <para> +      The name (optionally schema-qualified) of the table that the +      policy is on. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">new_name</replaceable></term> +    <listitem> +     <para> +      The new name for the policy. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">role_name</replaceable></term> +    <listitem> +     <para> +      The role to which the policy applies.  Multiple roles can be specified at one time. +      To apply the policy to all roles, use <literal>PUBLIC</literal>, which is also +      the default. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">expression</replaceable></term> +    <listitem> +     <para> +      The USING expression for the policy.  This expression will be added as a +      security-barrier qualification to queries which use the table +      automatically.  If multiple policies are being applied for a given +      table then they are all combined and added using OR.  The USING +      expression applies to records which are being retrived from the table. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">check_expression</replaceable></term> +    <listitem> +     <para> +      The with-check expression for the policy.  This expression will be +      added as a WITH CHECK OPTION qualification to queries which use the +      table automatically.  If multiple policies are being applied for a +      given table then they are all combined and added using OR.  The WITH +      CHECK expression applies to records which are being added to the table. +     </para> +    </listitem> +   </varlistentry> + +  </variablelist> + </refsect1> + + <refsect1> +  <title>Compatibility</title> + +  <para> +   <command>ALTER POLICY</command> is a <productname>PostgreSQL</productname> extension. +  </para> + </refsect1> + + <refsect1> +  <title>See Also</title> + +  <simplelist type="inline"> +   <member><xref linkend="sql-createpolicy"></member> +   <member><xref linkend="sql-droppolicy"></member> +  </simplelist> + </refsect1> + +</refentry> diff --git a/doc/src/sgml/ref/alter_role.sgml b/doc/src/sgml/ref/alter_role.sgml index bcd46d5e4dc..0471daa1cce 100644 --- a/doc/src/sgml/ref/alter_role.sgml +++ b/doc/src/sgml/ref/alter_role.sgml @@ -32,6 +32,7 @@ ALTER ROLE <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replace      | INHERIT | NOINHERIT      | LOGIN | NOLOGIN      | REPLICATION | NOREPLICATION +    | BYPASSRLS | NOBYPASSRLS      | CONNECTION LIMIT <replaceable class="PARAMETER">connlimit</replaceable>      | [ ENCRYPTED | UNENCRYPTED ] PASSWORD '<replaceable class="PARAMETER">password</replaceable>'      | VALID UNTIL '<replaceable class="PARAMETER">timestamp</replaceable>' @@ -142,6 +143,8 @@ ALTER ROLE { <replaceable class="PARAMETER">name</replaceable> | ALL } [ IN DATA        <term><literal>NOLOGIN</literal></term>        <term><literal>REPLICATION</literal></term>        <term><literal>NOREPLICATION</literal></term> +      <term><literal>BYPASSRLS</literal></term> +      <term><literal>NOBYPASSRLS</literal></term>        <term><literal>CONNECTION LIMIT</literal> <replaceable class="parameter">connlimit</replaceable></term>        <term><literal>PASSWORD</> <replaceable class="parameter">password</replaceable></term>        <term><literal>ENCRYPTED</></term> diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 5bbf4fb3595..1b35756c295 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -59,6 +59,8 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>      ENABLE RULE <replaceable class="PARAMETER">rewrite_rule_name</replaceable>      ENABLE REPLICA RULE <replaceable class="PARAMETER">rewrite_rule_name</replaceable>      ENABLE ALWAYS RULE <replaceable class="PARAMETER">rewrite_rule_name</replaceable> +    DISABLE ROW LEVEL SECURITY +    ENABLE ROW LEVEL SECURITY      CLUSTER ON <replaceable class="PARAMETER">index_name</replaceable>      SET WITHOUT CLUSTER      SET WITH OIDS @@ -421,6 +423,21 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>     </varlistentry>     <varlistentry> +    <term><literal>DISABLE</literal>/<literal>ENABLE ROW LEVEL SECURITY</literal></term> +    <listitem> +     <para> +      These forms control the application of row security policies belonging +      to the table.  If enabled and no policies exist for the table, then a +      default-deny policy is applied.  Note that policies can exist for a table +      even if row level security is disabled- in this case, the policies will +      NOT be applied and the policies will be ignored. +      See also +      <xref linkend="SQL-CREATEPOLICY">. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry>      <term><literal>CLUSTER ON</literal></term>      <listitem>       <para> diff --git a/doc/src/sgml/ref/create_policy.sgml b/doc/src/sgml/ref/create_policy.sgml new file mode 100644 index 00000000000..c6599eda1c0 --- /dev/null +++ b/doc/src/sgml/ref/create_policy.sgml @@ -0,0 +1,318 @@ +<!-- +doc/src/sgml/ref/create_policy.sgml +PostgreSQL documentation +--> + +<refentry id="SQL-CREATEPOLICY"> + <indexterm zone="sql-createpolicy"> +  <primary>CREATE POLICY</primary> + </indexterm> + + <refmeta> +  <refentrytitle>CREATE POLICY</refentrytitle> +  <manvolnum>7</manvolnum> +  <refmiscinfo>SQL - Language Statements</refmiscinfo> + </refmeta> + + <refnamediv> +  <refname>CREATE POLICY</refname> +  <refpurpose>define a new row-security policy for a table</refpurpose> + </refnamediv> + + <refsynopsisdiv> +<synopsis> +CREATE POLICY <replaceable class="parameter">name</replaceable> ON <replaceable class="parameter">table_name</replaceable> +    [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] +    [ TO { <replaceable class="parameter">role_name</replaceable> | PUBLIC } [, ...] ] +    [ USING ( <replaceable class="parameter">expression</replaceable> ) ] +    [ WITH CHECK ( <replaceable class="parameter">check_expression</replaceable> ) ] +</synopsis> + </refsynopsisdiv> + + <refsect1> +  <title>Description</title> + +  <para> +   The <command>CREATE POLICY</command> command defines a new row-security +   policy for a table.  Note that row-security must also be enabled on the +   table using <command>ALTER TABLE</command> in order for created policies +   to be applied. +  </para> + +  <para> +   A row-security policy is an expression which is added to the security-barrier +   qualifications of queries which are run against the table the policy is on, +   or an expression which is added to the with-check options for a table and +   which is applied to rows which would be added to the table. +   The security-barrier qualifications will always be evaluated prior to any +   user-defined functions or user-provided WHERE clauses, while the with-check +   expression will be evaluated against the rows which are going to be added to +   the table.  By adding policies to a table, a user can limit the rows which a +   given user can select, insert, update, or delete.  This capability is also +   known as Row-Level Security or RLS. +  </para> + +  <para> +   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. +  </para> + +  <para> +   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.  If multiple policies apply to a given +   query, they will be combined using OR. +  </para> + +  <para> +   Note that while row-security policies will be applied for explicit queries +   against tables in the system, they are not applied when the system is +   performing internal referential integrity checks or validating constraints. +   This means there are indirect ways to determine that a given value exists. +   An example of this is attempting to insert a duplicate value +   into a column which is the primary key or has a unique constraint.  If the +   insert fails then the user can infer that the value already exists (this +   example assumes that the user is permitted by policy to insert +   records which they are not allowed to see).  Another example is where a user +   is allowed to insert into a table which references another, otherwise hidden +   table.  Existence can be determined by the user inserting values into the +   referencing table, where success would indicate that the value exists in the +   referenced table.  These issues can be addressed by carefully crafting +   policies which prevent users from being able to insert, delete, or update +   records at all which might possibly indicate a value they are not otherwise +   able to see, or by using generated values (eg: surrogate keys) instead. +  </para> + +  <para> +   Regarding how policy expressions interact with the user: as the expressions +   are added to the user's query directly, they will be run with the rights of +   the user running the overall query.  Therefore, users who are using a given +   policy must be able to access any tables or functions referenced in the +   expression or they will simply receive a permission denied error when +   attempting to query the RLS-enabled table.  This does not change how views +   work, however.  As with normal queries and views, permission checks and +   policies for the tables which are referenced by a view will use the view +   owner's rights and any policies which apply to the view owner. +  </para> + + </refsect1> + + <refsect1> +  <title>Parameters</title> + +  <variablelist> +   <varlistentry> +    <term><replaceable class="parameter">name</replaceable></term> +    <listitem> +     <para> +      The name of the policy to be created.  This must be distinct from the +      name of any other policy for the table. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">table_name</replaceable></term> +    <listitem> +     <para> +      The name (optionally schema-qualified) of the table the +      policy applies to. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">command</replaceable></term> +    <listitem> +     <para> +      The command to which the policy applies.  Valid options are +      <command>ALL</command>, <command>SELECT</command>, +      <command>INSERT</command>, <command>UPDATE</command>, +      and <command>DELETE</command>. +      <command>ALL</command> is the default. +      See below for specifics regarding how these are applied. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">role_name</replaceable></term> +    <listitem> +     <para> +      The roles to which the policy is to be applied.  The default is +      <literal>PUBLIC</literal>, which will apply the policy to all roles. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">expression</replaceable></term> +    <listitem> +     <para> +      Any <acronym>SQL</acronym> conditional expression (returning +      <type>boolean</type>).  The conditional expression cannot contain +      any aggregate or window functions.  This expression will be added +      to queries to filter out the records which are visible to the query. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">check_expression</replaceable></term> +    <listitem> +     <para> +      Any <acronym>SQL</acronym> conditional expression (returning +      <type>boolean</type>).  The condition expression cannot contain +      any aggregate or window functions.  This expression will be added +      to queries which are attempting to add records to the table as +      with-check options, and an error will be thrown if this condition +      returns false for any records being added. +     </para> +    </listitem> +   </varlistentry> + +  </variablelist> + </refsect1> + + <refsect1> +   <title>Per-Command policies</title> + +   <variablelist> + +     <varlistentry id="SQL-CREATEPOLICY-ALL"> +      <term><literal>ALL</></term> +      <listitem> +       <para> +         Using <literal>ALL</literal> for a policy means that it will apply +         to all commands, regardless of the type of command.  If an +         <literal>ALL</literal> policy exists and more specific policies +         exist, then both the <literal>ALL</literal> policy and the more +         specific policy (or policies) will be combined using +         <literal>OR</literal>, as usual for overlapping policies. +         Additionally, <literal>ALL</literal> policies will be applied to +         both the selection side of a query and the modification side, using +         the USING policy for both if only a USING policy has been defined. + +         As an example, if an <literal>UPDATE</literal> is issued, then the +         <literal>ALL</literal> policy will be applicable to both what the +         <literal>UPDATE</literal> will be able to select out as rows to be +         updated (with the USING expression being applied), and it will be +         applied to rows which result from the <literal>UPDATE</literal> +         statement, to check if they are permitted to be added to the table +         (using the WITH CHECK expression, if defined, and the USING expression +         otherwise).  If an INSERT or UPDATE command attempts to add rows to +         the table which do not pass the <literal>ALL</literal> WITH CHECK +         (or USING, if no WITH CHECK expression is defined) expression, the +         command will error. +       </para> +      </listitem> +     </varlistentry> + +     <varlistentry id="SQL-CREATEPOLICY-SELECT"> +      <term><literal>SELECT</></term> +      <listitem> +       <para> +         Using <literal>SELECT</literal> for a policy means that it will apply +         to <literal>SELECT</literal> commands.  The result is that only those +         records from the relation which pass the <literal>SELECT</literal> +         policy will be returned, even if other records exist in the relation. +         The <literal>SELECT</literal> policy only accepts the USING expression +         as it only ever applies in cases where records are being retrived from +         the relation. +       </para> +      </listitem> +     </varlistentry> + +     <varlistentry id="SQL-CREATEPOLICY-INSERT"> +      <term><literal>INSERT</></term> +      <listitem> +       <para> +         Using <literal>INSERT</literal> for a policy means that it will apply +         to <literal>INSERT</literal> commands.  Rows being inserted which do +         not pass this policy will result in a policy violation ERROR and the +         entire <literal>INSERT</literal> command will be aborted.  The +         <literal>INSERT</literal> policy only accepts the WITH CHECK expression +         as it only ever applies in cases where records are being added to the +         relation. +       </para> +      </listitem> +     </varlistentry> + +     <varlistentry id="SQL-CREATEPOLICY-UPDATE"> +      <term><literal>DELETE</></term> +      <listitem> +       <para> +         Using <literal>UPDATE</literal> for a policy means that it will apply +         to <literal>UPDATE</literal> commands.  As <literal>UPDATE</literal> +         involves pulling an existing record and then making changes to some +         portion (but possibly not all) of the record, the +         <literal>UPDATE</literal> policy accepts both a USING expression and +         a WITH CHECK expression.  The USING expression will be used to +         determine which records the <literal>UPDATE</literal> command will +         see to operate against, while the <literal>WITH CHECK</literal> +         expression defines what rows are allowed to be added back into the +         relation (similar to the <literal>INSERT</literal> policy). +         Any rows whose resulting values do not pass the +         <literal>WITH CHECK</literal> expression will cause an ERROR and the +         entire command will be aborted. +       </para> +      </listitem> +     </varlistentry> + +     <varlistentry id="SQL-CREATEPOLICY-DELETE"> +      <term><literal>DELETE</></term> +      <listitem> +       <para> +         Using <literal>DELETE</literal> for a policy means that it will apply +         to <literal>DELETE</literal> commands.  Only rows which pass this +         policy will be seen by a <literal>DELETE</literal> command.  Rows may +         be visible through a <literal>SELECT</literal> which are not seen by a +         <literal>DELETE</literal>, as they do not pass the USING expression +         for the <literal>DELETE</literal>, and rows which are not visible +         through the <literal>SELECT</literal> policy may be deleted if they +         pass the <literal>DELETE</literal> USING policy.  The +         <literal>DELETE</literal> policy only accept the USING expression as +         it only ever applies in cases where records are being extracted from +         the relation for deletion. +       </para> +      </listitem> +     </varlistentry> + +   </variablelist> + </refsect1> + + <refsect1> +  <title>Notes</title> + +  <para> +   You must be the owner of a table to create or change policies for it. +  </para> + +  <para> +   In order to maintain <firstterm>referential integrity</firstterm> between +   two related tables, row-security policies are not applied when the system +   performs checks on foreign key constraints. +  </para> + + </refsect1> + + <refsect1> +  <title>Compatibility</title> + +  <para> +   <command>CREATE POLICY</command> is a <productname>PostgreSQL</productname> +   extension. +  </para> + </refsect1> + + <refsect1> +  <title>See Also</title> + +  <simplelist type="inline"> +   <member><xref linkend="sql-alterpolicy"></member> +   <member><xref linkend="sql-droppolicy"></member> +  </simplelist> + </refsect1> + +</refentry> diff --git a/doc/src/sgml/ref/create_role.sgml b/doc/src/sgml/ref/create_role.sgml index 641e3500c9a..ea260275114 100644 --- a/doc/src/sgml/ref/create_role.sgml +++ b/doc/src/sgml/ref/create_role.sgml @@ -32,6 +32,7 @@ CREATE ROLE <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replac      | INHERIT | NOINHERIT      | LOGIN | NOLOGIN      | REPLICATION | NOREPLICATION +    | BYPASSRLS | NOBYPASSRLS      | CONNECTION LIMIT <replaceable class="PARAMETER">connlimit</replaceable>      | [ ENCRYPTED | UNENCRYPTED ] PASSWORD '<replaceable class="PARAMETER">password</replaceable>'      | VALID UNTIL '<replaceable class="PARAMETER">timestamp</replaceable>' @@ -191,6 +192,25 @@ CREATE ROLE <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replac       </varlistentry>       <varlistentry> +      <term><literal>BYPASSRLS</literal></term> +      <term><literal>NOBYPASSRLS</literal></term> +      <listitem> +       <para> +        These clauses determine whether a role is allowed to bypass row-security +        policies.  A role having the <literal>BYPASSRLS</literal> attribute will +        be allowed to bypass row-security policies by setting +        <literal>row_security</literal> to +        <literal>OFF</literal>. <literal>NOBYPASSRLS</literal> is the default. +        Note that pg_dump will set <literal>row_security</literal> to +        <literal>OFF</literal> by default, to ensure all contents of a table are +        dumped out.  If the user running pg_dump does not have appropriate +        permissions, an error will be returned.  The superuser and owner of the +        table being dumped are considered to always have the right to bypass RLS. +       </para> +      </listitem> +     </varlistentry> + +     <varlistentry>        <term><literal>CONNECTION LIMIT</literal> <replaceable class="parameter">connlimit</replaceable></term>        <listitem>         <para> diff --git a/doc/src/sgml/ref/drop_policy.sgml b/doc/src/sgml/ref/drop_policy.sgml new file mode 100644 index 00000000000..31ca9db220e --- /dev/null +++ b/doc/src/sgml/ref/drop_policy.sgml @@ -0,0 +1,109 @@ +<!-- +doc/src/sgml/ref/drop_policy.sgml +PostgreSQL documentation +--> + +<refentry id="SQL-DROPPOLICY"> + <indexterm zone="sql-droppolicy"> +  <primary>DROP POLICY</primary> + </indexterm> + + <refmeta> +  <refentrytitle>DROP POLICY</refentrytitle> +  <manvolnum>7</manvolnum> +  <refmiscinfo>SQL - Language Statements</refmiscinfo> + </refmeta> + + <refnamediv> +  <refname>DROP POLICY</refname> +  <refpurpose>remove a row-security policy from a table</refpurpose> + </refnamediv> + + <refsynopsisdiv> +<synopsis> +DROP POLICY [ IF EXISTS ] <replaceable class="parameter">name</replaceable> ON <replaceable class="parameter">table_name</replaceable> +</synopsis> + </refsynopsisdiv> + + <refsect1> +  <title>Description</title> + +  <para> +   <command>DROP POLICY</command> removes the specified row-security policy +   from the table.  Note that if the last policy is removed for a table and +   the table still has ROW POLICY enabled via <command>ALTER TABLE</command>, +   then the default-deny policy will be used.  <command>ALTER TABLE</command> +   can be used to disable row security for a table using +   <literal>DISABLE ROW SECURITY</literal>, whether policies for the table +   exist or not. +  </para> + </refsect1> + + <refsect1> +  <title>Parameters</title> + +  <variablelist> + +   <varlistentry> +    <term><literal>IF EXISTS</literal></term> +    <listitem> +     <para> +      Do not throw an error if the policy does not exist. A notice is issued +      in this case. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">name</replaceable></term> +    <listitem> +     <para> +      The name of the policy to drop. +     </para> +    </listitem> +   </varlistentry> + +   <varlistentry> +    <term><replaceable class="parameter">table_name</replaceable></term> +    <listitem> +     <para> +      The name (optionally schema-qualified) of the table that +      the policy is on. +     </para> +    </listitem> +   </varlistentry> + +  </variablelist> + </refsect1> + + <refsect1> +  <title>Examples</title> + +  <para> +   To drop the row-security policy called <literal>p1</literal> on the +   table named <literal>my_table</literal>: + +   <programlisting> +    DROP POLICY p1 ON my_table; +   </programlisting> +  </para> + </refsect1> + + <refsect1> +  <title>Compatibility</title> + +  <para> +   <command>DROP POLICY</command> is a <productname>PostgreSQL</productname> extension. +  </para> + </refsect1> + + <refsect1> +  <title>See Also</title> + +  <simplelist type="inline"> +   <member><xref linkend="sql-createpolicy"></member> +   <member><xref linkend="sql-alterpolicy"></member> +  </simplelist> + </refsect1> + +</refentry> diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index 6ec126381c3..10c9a6d4030 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -53,6 +53,7 @@     &alterOperator;     &alterOperatorClass;     &alterOperatorFamily; +   &alterPolicy;     &alterRole;     &alterRule;     &alterSchema; @@ -97,6 +98,7 @@     &createOperator;     &createOperatorClass;     &createOperatorFamily; +   &createPolicy;     &createRole;     &createRule;     &createSchema; @@ -138,6 +140,7 @@     &dropOperatorClass;     &dropOperatorFamily;     &dropOwned; +   &dropPolicy;     &dropRole;     &dropRule;     &dropSchema;  | 
