<entry><type>text[]</type></entry>
<entry></entry>
<entry>
- User mapping specific options, as <quote>keyword=value</>
- strings. This column will show as null unless the current user
- is the user being mapped, or the mapping is for
- <literal>PUBLIC</literal> and the current user is the server
- owner, or the current user is a superuser. The intent is
- to protect password information stored as user mapping option.
+ User mapping specific options, as <quote>keyword=value</> strings
</entry>
</row>
</tbody>
</tgroup>
</table>
+
+ <para>
+ To protect password information stored as a user mapping option,
+ the <structfield>umoptions</structfield> column will read as null
+ unless one of the following applies:
+ <itemizedlist>
+ <listitem>
+ <para>
+ current user is the user being mapped, and owns the server or
+ holds <literal>USAGE</> privilege on it
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ current user is the server owner and mapping is for <literal>PUBLIC</>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ current user is a superuser
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
</sect1>
ALTER SERVER s9 VERSION '1.1';
GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role;
CREATE USER MAPPING FOR current_user SERVER s9;
+-- We use terse mode to avoid ordering issues in cascade detail output.
+\set VERBOSITY terse
DROP SERVER s9 CASCADE;
NOTICE: drop cascades to 2 other objects
-DETAIL: drop cascades to user mapping for public on server s9
-drop cascades to user mapping for regress_unprivileged_role on server s9
+\set VERBOSITY default
RESET ROLE;
CREATE SERVER s9 FOREIGN DATA WRAPPER foo;
GRANT USAGE ON FOREIGN SERVER s9 TO regress_unprivileged_role;
SET ROLE regress_test_role;
CREATE SERVER s10 FOREIGN DATA WRAPPER foo;
CREATE USER MAPPING FOR public SERVER s10 OPTIONS (user 'secret');
-GRANT USAGE ON FOREIGN SERVER s10 TO regress_unprivileged_role;
--- owner of server can see option fields
+CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret');
+-- owner of server can see some option fields
\deu+
List of user mappings
Server | User name | FDW options
--------+---------------------------+-------------------
s10 | public | ("user" 'secret')
+ s10 | regress_unprivileged_role |
s4 | regress_foreign_data_user |
s5 | regress_test_role | (modified '1')
s6 | regress_test_role |
s8 | regress_foreign_data_user |
s9 | regress_unprivileged_role |
t1 | public | (modified '1')
-(8 rows)
+(9 rows)
RESET ROLE;
--- superuser can see option fields
+-- superuser can see all option fields
\deu+
List of user mappings
Server | User name | FDW options
--------+---------------------------+---------------------
s10 | public | ("user" 'secret')
+ s10 | regress_unprivileged_role | ("user" 'secret')
s4 | regress_foreign_data_user |
s5 | regress_test_role | (modified '1')
s6 | regress_test_role |
s8 | regress_foreign_data_user | (password 'public')
s9 | regress_unprivileged_role |
t1 | public | (modified '1')
-(8 rows)
+(9 rows)
--- unprivileged user cannot see option fields
+-- unprivileged user cannot see any option field
SET ROLE regress_unprivileged_role;
\deu+
List of user mappings
Server | User name | FDW options
--------+---------------------------+-------------
s10 | public |
+ s10 | regress_unprivileged_role |
s4 | regress_foreign_data_user |
s5 | regress_test_role |
s6 | regress_test_role |
s8 | regress_foreign_data_user |
s9 | regress_unprivileged_role |
t1 | public |
-(8 rows)
+(9 rows)
RESET ROLE;
+\set VERBOSITY terse
DROP SERVER s10 CASCADE;
-NOTICE: drop cascades to user mapping for public on server s10
+NOTICE: drop cascades to 2 other objects
+\set VERBOSITY default
-- Triggers
CREATE FUNCTION dummy_trigger() RETURNS TRIGGER AS $$
BEGIN
Child tables: ct3,
ft3
+\set VERBOSITY terse
DROP FOREIGN TABLE ft2; -- ERROR
ERROR: cannot drop foreign table ft2 because other objects depend on it
-DETAIL: table ct3 depends on foreign table ft2
-foreign table ft3 depends on foreign table ft2
-HINT: Use DROP ... CASCADE to drop the dependent objects too.
DROP FOREIGN TABLE ft2 CASCADE;
NOTICE: drop cascades to 2 other objects
-DETAIL: drop cascades to table ct3
-drop cascades to foreign table ft3
+\set VERBOSITY default
CREATE FOREIGN TABLE ft2 (
c1 integer NOT NULL,
c2 text,
DROP SERVER t1 CASCADE;
NOTICE: drop cascades to user mapping for public on server t1
DROP USER MAPPING FOR regress_test_role SERVER s6;
--- This test causes some order dependent cascade detail output,
--- so switch to terse mode for it.
\set VERBOSITY terse
DROP FOREIGN DATA WRAPPER foo CASCADE;
NOTICE: drop cascades to 5 other objects
-\set VERBOSITY default
DROP SERVER s8 CASCADE;
NOTICE: drop cascades to 2 other objects
-DETAIL: drop cascades to user mapping for regress_foreign_data_user on server s8
-drop cascades to user mapping for public on server s8
+\set VERBOSITY default
DROP ROLE regress_test_indirect;
DROP ROLE regress_test_role;
DROP ROLE regress_unprivileged_role; -- ERROR
ALTER SERVER s9 VERSION '1.1';
GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role;
CREATE USER MAPPING FOR current_user SERVER s9;
+-- We use terse mode to avoid ordering issues in cascade detail output.
+\set VERBOSITY terse
DROP SERVER s9 CASCADE;
+\set VERBOSITY default
RESET ROLE;
CREATE SERVER s9 FOREIGN DATA WRAPPER foo;
GRANT USAGE ON FOREIGN SERVER s9 TO regress_unprivileged_role;
SET ROLE regress_test_role;
CREATE SERVER s10 FOREIGN DATA WRAPPER foo;
CREATE USER MAPPING FOR public SERVER s10 OPTIONS (user 'secret');
-GRANT USAGE ON FOREIGN SERVER s10 TO regress_unprivileged_role;
--- owner of server can see option fields
+CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret');
+-- owner of server can see some option fields
\deu+
RESET ROLE;
--- superuser can see option fields
+-- superuser can see all option fields
\deu+
--- unprivileged user cannot see option fields
+-- unprivileged user cannot see any option field
SET ROLE regress_unprivileged_role;
\deu+
RESET ROLE;
+\set VERBOSITY terse
DROP SERVER s10 CASCADE;
+\set VERBOSITY default
-- Triggers
CREATE FUNCTION dummy_trigger() RETURNS TRIGGER AS $$
-- child does not inherit NO INHERIT constraints
\d+ pt1
\d+ ft2
+\set VERBOSITY terse
DROP FOREIGN TABLE ft2; -- ERROR
DROP FOREIGN TABLE ft2 CASCADE;
+\set VERBOSITY default
CREATE FOREIGN TABLE ft2 (
c1 integer NOT NULL,
c2 text,
DROP ROLE regress_test_role; -- ERROR
DROP SERVER t1 CASCADE;
DROP USER MAPPING FOR regress_test_role SERVER s6;
--- This test causes some order dependent cascade detail output,
--- so switch to terse mode for it.
\set VERBOSITY terse
DROP FOREIGN DATA WRAPPER foo CASCADE;
-\set VERBOSITY default
DROP SERVER s8 CASCADE;
+\set VERBOSITY default
DROP ROLE regress_test_indirect;
DROP ROLE regress_test_role;
DROP ROLE regress_unprivileged_role; -- ERROR