mirror of
https://github.com/postgres/postgres.git
synced 2025-12-19 17:02:53 +03:00
Code review for row security.
Buildfarm member tick identified an issue where the policies in the relcache for a relation were were being replaced underneath a running query, leading to segfaults while processing the policies to be added to a query. Similar to how TupleDesc RuleLocks are handled, add in a equalRSDesc() function to check if the policies have actually changed and, if not, swap back the rsdesc field (using the original instead of the temporairly built one; the whole structure is swapped and then specific fields swapped back). This now passes a CLOBBER_CACHE_ALWAYS for me and should resolve the buildfarm error. In addition to addressing this, add a new chapter in Data Definition under Privileges which explains row security and provides examples of its usage, change \d to always list policies (even if row security is disabled- but note that it is disabled, or enabled with no policies), rework check_role_for_policy (it really didn't need the entire policy, but it did need to be using has_privs_of_role()), and change the field in pg_class to relrowsecurity from relhasrowsecurity, based on Heikki's suggestion. Also from Heikki, only issue SET ROW_SECURITY in pg_restore when talking to a 9.5+ server, list Bypass RLS in \du, and document --enable-row-security options for pg_dump and pg_restore. Lastly, fix a number of minor whitespace and typo issues from Heikki, Dimitri, add a missing #include, per Peter E, fix a few minor variable-assigned-but-not-used and resource leak issues from Coverity and add tab completion for role attribute bypassrls as well.
This commit is contained in:
@@ -429,7 +429,7 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>
|
||||
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
|
||||
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">.
|
||||
|
||||
@@ -240,7 +240,7 @@ CREATE POLICY <replaceable class="parameter">name</replaceable> ON <replaceable
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id="SQL-CREATEPOLICY-UPDATE">
|
||||
<term><literal>DELETE</></term>
|
||||
<term><literal>UPDATE</></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Using <literal>UPDATE</literal> for a policy means that it will apply
|
||||
|
||||
@@ -687,6 +687,23 @@ PostgreSQL documentation
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--enable-row-security</></term>
|
||||
<listitem>
|
||||
<para>
|
||||
This option is relevant only when dumping the contents of a table
|
||||
which has row security. By default, pg_dump will set
|
||||
<literal>ROW_SECURITY</literal> to <literal>OFF</literal>, to ensure
|
||||
that all data is dumped from the table. If the user does not have
|
||||
sufficient privileges to bypass row security, then an error is thrown.
|
||||
This parameter instructs <application>pg_dump</application> to set
|
||||
row_security to 'ON' instead, allowing the user to dump the contents
|
||||
of the table which they have access to.
|
||||
</para>
|
||||
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--exclude-table-data=<replaceable class="parameter">table</replaceable></option></term>
|
||||
<listitem>
|
||||
|
||||
@@ -490,6 +490,29 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--enable-row-security</></term> <listitem>
|
||||
<para>
|
||||
This option is relevant only when restoring the contents of a table
|
||||
which has row security. By default, pg_restore will set
|
||||
<literal>ROW_SECURITY</literal> to <literal>OFF</literal>, to ensure
|
||||
that all data is restored in to the table. If the user does not have
|
||||
sufficient privileges to bypass row security, then an error is thrown.
|
||||
This parameter instructs <application>pg_restore</application> to set
|
||||
row_security to 'ON' instead, allowing the user to attempt to restore
|
||||
the contents of the table with row security enabled. This may still
|
||||
fail if the user does not have the right to insert the rows from the
|
||||
dump into the table.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Note that this option currently also requires the dump be in INSERT
|
||||
format as COPY TO does not support row security.
|
||||
</para>
|
||||
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--if-exists</option></term>
|
||||
<listitem>
|
||||
|
||||
Reference in New Issue
Block a user