CREATE FUNCTION chkrolattr()
RETURNS TABLE ("role" name, rolekeyword text, canlogin bool, replication bool) AS $$ SELECT r.rolname, v.keyword, r.rolcanlogin, r.rolreplication FROM pg_roles r JOIN (VALUES(CURRENT_ROLE, 'current_role'),
(CURRENT_USER, 'current_user'),
(SESSION_USER, 'session_user'),
('current_role', '-'),
('current_user', '-'),
('session_user', '-'),
('Public', '-'),
('None', '-')) AS v(uname, keyword) ON (r.rolname = v.uname) ORDERBY1, 2;
$$ LANGUAGE SQL;
CREATE FUNCTION chksetconfig()
RETURNS TABLE (db name, "role" name, rolkeyword text, setconfig text[]) AS $$ SELECT COALESCE(d.datname, 'ALL'), COALESCE(r.rolname, 'ALL'),
COALESCE(v.keyword, '-'), s.setconfig FROM pg_db_role_setting s LEFTJOIN pg_roles r ON (r.oid = s.setrole) LEFTJOIN pg_database d ON (d.oid = s.setdatabase) LEFTJOIN (VALUES(CURRENT_ROLE, 'current_role'),
(CURRENT_USER, 'current_user'),
(SESSION_USER, 'session_user')) AS v(uname, keyword) ON (r.rolname = v.uname) WHERE (r.rolname) IN ('Public', 'current_user', 'regress_testrol1', 'regress_testrol2') ORDERBY1, 2, 3;
$$ LANGUAGE SQL;
CREATE FUNCTION chkumapping()
RETURNS TABLE (umname name, umserver name, umoptions text[]) AS $$ SELECT r.rolname, s.srvname, m.umoptions FROM pg_user_mapping m LEFTJOIN pg_roles r ON (r.oid = m.umuser) JOIN pg_foreign_server s ON (s.oid = m.umserver) ORDERBY2, 1;
$$ LANGUAGE SQL;
-- -- We test creation and use of these role names to ensure that the server -- correctly distinguishes role keywords from quoted names that look like -- those keywords. In a test environment, creation of these roles may -- provoke warnings, so hide the warnings by raising client_min_messages. -- SET client_min_messages = ERROR;
CREATE ROLE "Public"; CREATE ROLE "None"; CREATE ROLE "current_role"; CREATE ROLE "current_user"; CREATE ROLE "session_user"; CREATE ROLE "user";
RESET client_min_messages;
CREATE ROLE current_user; -- error CREATE ROLE current_role; -- error CREATE ROLE session_user; -- error CREATE ROLE user; -- error CREATE ROLE all; -- error
CREATE ROLE public; -- error CREATE ROLE "public"; -- error CREATE ROLE none; -- error CREATE ROLE "none"; -- error
CREATE ROLE pg_abc; -- error CREATE ROLE "pg_abc"; -- error CREATE ROLE pg_abcdef; -- error CREATE ROLE "pg_abcdef"; -- error
CREATE ROLE regress_testrol0 SUPERUSER LOGIN; CREATE ROLE regress_testrolx SUPERUSER LOGIN; CREATE ROLE regress_testrol2 SUPERUSER; CREATE ROLE regress_testrol1 SUPERUSER LOGIN IN ROLE regress_testrol2;
\c - SET SESSION AUTHORIZATION regress_testrol1; SET ROLE regress_testrol2;
-- ALTER ROLE
BEGIN; SELECT * FROM chkrolattr(); ALTER ROLE CURRENT_ROLE WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER ROLE "current_role"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER ROLE CURRENT_ROLE WITH NOREPLICATION; ALTER ROLE CURRENT_USERWITH REPLICATION; SELECT * FROM chkrolattr(); ALTER ROLE "current_user"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER ROLE SESSION_USER WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER ROLE "session_user"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER "Public"WITH REPLICATION; ALTER USER "None"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER regress_testrol1 WITH NOREPLICATION; ALTER USER regress_testrol2 WITH NOREPLICATION; SELECT * FROM chkrolattr();
ROLLBACK;
ALTER ROLE USER WITH LOGIN; -- error ALTER ROLE ALLWITH REPLICATION; -- error ALTER ROLE SESSION_ROLE WITH NOREPLICATION; -- error ALTER ROLE PUBLIC WITH NOREPLICATION; -- error ALTER ROLE "public"WITH NOREPLICATION; -- error ALTER ROLE NONE WITH NOREPLICATION; -- error ALTER ROLE "none"WITH NOREPLICATION; -- error ALTER ROLE nonexistent WITH NOREPLICATION; -- error
-- ALTER USER
BEGIN; SELECT * FROM chkrolattr(); ALTER USER CURRENT_ROLE WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER "current_role"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER CURRENT_ROLE WITH NOREPLICATION; ALTER USER CURRENT_USERWITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER "current_user"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER SESSION_USER WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER "session_user"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER "Public"WITH REPLICATION; ALTER USER "None"WITH REPLICATION; SELECT * FROM chkrolattr(); ALTER USER regress_testrol1 WITH NOREPLICATION; ALTER USER regress_testrol2 WITH NOREPLICATION; SELECT * FROM chkrolattr();
ROLLBACK;
ALTER USER USER WITH LOGIN; -- error ALTER USER ALLWITH REPLICATION; -- error ALTER USER SESSION_ROLE WITH NOREPLICATION; -- error ALTER USER PUBLIC WITH NOREPLICATION; -- error ALTER USER "public"WITH NOREPLICATION; -- error ALTER USER NONE WITH NOREPLICATION; -- error ALTER USER "none"WITH NOREPLICATION; -- error ALTER USER nonexistent WITH NOREPLICATION; -- error
-- ALTER ROLE SET/RESET SELECT * FROM chksetconfig(); ALTER ROLE CURRENT_ROLE SET application_name to 'BAZ'; ALTER ROLE CURRENT_USERSET application_name to 'FOO'; ALTER ROLE SESSION_USER SET application_name to 'BAR'; ALTER ROLE "current_user"SET application_name to 'FOOFOO'; ALTER ROLE "Public"SET application_name to 'BARBAR'; ALTER ROLE ALLSET application_name to 'SLAP'; SELECT * FROM chksetconfig(); ALTER ROLE regress_testrol1 SET application_name to 'SLAM'; SELECT * FROM chksetconfig(); ALTER ROLE CURRENT_ROLE RESET application_name; ALTER ROLE CURRENT_USER RESET application_name; ALTER ROLE SESSION_USER RESET application_name; ALTER ROLE "current_user" RESET application_name; ALTER ROLE "Public" RESET application_name; ALTER ROLE ALL RESET application_name; SELECT * FROM chksetconfig();
ALTER ROLE USER SET application_name to 'BOOM'; -- error ALTER ROLE PUBLIC SET application_name to 'BOMB'; -- error ALTER ROLE nonexistent SET application_name to 'BOMB'; -- error
-- ALTER USER SET/RESET SELECT * FROM chksetconfig(); ALTER USER CURRENT_ROLE SET application_name to 'BAZ'; ALTER USER CURRENT_USERSET application_name to 'FOO'; ALTER USER SESSION_USER SET application_name to 'BAR'; ALTER USER "current_user"SET application_name to 'FOOFOO'; ALTER USER "Public"SET application_name to 'BARBAR'; ALTER USER ALLSET application_name to 'SLAP'; SELECT * FROM chksetconfig(); ALTER USER regress_testrol1 SET application_name to 'SLAM'; SELECT * FROM chksetconfig(); ALTER USER CURRENT_ROLE RESET application_name; ALTER USER CURRENT_USER RESET application_name; ALTER USER SESSION_USER RESET application_name; ALTER USER "current_user" RESET application_name; ALTER USER "Public" RESET application_name; ALTER USER ALL RESET application_name; SELECT * FROM chksetconfig();
ALTER USER USER SET application_name to 'BOOM'; -- error ALTER USER PUBLIC SET application_name to 'BOMB'; -- error ALTER USER NONE SET application_name to 'BOMB'; -- error ALTER USER nonexistent SET application_name to 'BOMB'; -- error
SELECT n.nspname, r.rolname FROM pg_namespace n JOIN pg_roles r ON (r.oid = n.nspowner) WHERE n.nspname LIKE'newschema_'ORDERBY1;
-- ALTER TABLE OWNER TO
\c - SET SESSION AUTHORIZATION regress_testrol0; CREATETABLE testtab1 (a int); CREATETABLE testtab2 (a int); CREATETABLE testtab3 (a int); CREATETABLE testtab4 (a int); CREATETABLE testtab5 (a int); CREATETABLE testtab6 (a int); CREATETABLE testtab7 (a int);
\c - SET SESSION AUTHORIZATION regress_testrol1; SET ROLE regress_testrol2;
ALTERTABLE testtab1 OWNER TOCURRENT_USER; ALTERTABLE testtab2 OWNER TO"current_user"; ALTERTABLE testtab3 OWNER TO CURRENT_ROLE; ALTERTABLE testtab4 OWNER TO SESSION_USER; ALTERTABLE testtab5 OWNER TO regress_testrolx; ALTERTABLE testtab6 OWNER TO"Public";
ALTERTABLE testtab7 OWNER TO USER; --error ALTERTABLE testtab7 OWNER TO PUBLIC; -- error ALTERTABLE testtab7 OWNER TO"public"; -- error ALTERTABLE testtab7 OWNER TO nonexistent; -- error
SELECT c.relname, r.rolname FROM pg_class c JOIN pg_roles r ON (r.oid = c.relowner) WHERE relname LIKE'testtab_' ORDERBY1;
-- ALTER TABLE, VIEW, MATERIALIZED VIEW, FOREIGN TABLE, SEQUENCE are -- changed their owner in the same way.
\c - SET SESSION AUTHORIZATION regress_testrol1; SET ROLE regress_testrol2;
ALTER AGGREGATE testagg1(int2) OWNER TOCURRENT_USER; ALTER AGGREGATE testagg2(int2) OWNER TO"current_user"; ALTER AGGREGATE testagg3(int2) OWNER TO CURRENT_ROLE; ALTER AGGREGATE testagg4(int2) OWNER TO SESSION_USER; ALTER AGGREGATE testagg5(int2) OWNER TO regress_testrolx; ALTER AGGREGATE testagg6(int2) OWNER TO"Public";
ALTER AGGREGATE testagg6(int2) OWNER TO USER; -- error ALTER AGGREGATE testagg6(int2) OWNER TO PUBLIC; -- error ALTER AGGREGATE testagg6(int2) OWNER TO"public"; -- error ALTER AGGREGATE testagg6(int2) OWNER TO nonexistent; -- error
SELECT p.proname, r.rolname FROM pg_proc p JOIN pg_roles r ON (r.oid = p.proowner) WHERE proname LIKE'testagg_' ORDERBY1;
-- CREATE USER MAPPING CREATEFOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv1 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv2 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv3 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv4 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv5 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv6 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv7 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv8 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv9 FOREIGN DATA WRAPPER test_wrapper; CREATE SERVER sv10 FOREIGN DATA WRAPPER test_wrapper;
CREATE USER MAPPING FORCURRENT_USER SERVER sv1 OPTIONS (user 'CURRENT_USER'); CREATE USER MAPPING FOR"current_user" SERVER sv2 OPTIONS (user '"current_user"'); CREATE USER MAPPING FOR CURRENT_ROLE SERVER sv3 OPTIONS (user 'CURRENT_ROLE'); CREATE USER MAPPING FOR USER SERVER sv4 OPTIONS (user 'USER'); CREATE USER MAPPING FOR"user" SERVER sv5 OPTIONS (user '"USER"'); CREATE USER MAPPING FOR SESSION_USER SERVER sv6 OPTIONS (user 'SESSION_USER'); CREATE USER MAPPING FOR PUBLIC SERVER sv7 OPTIONS (user 'PUBLIC'); CREATE USER MAPPING FOR"Public" SERVER sv8 OPTIONS (user '"Public"'); CREATE USER MAPPING FOR regress_testrolx SERVER sv9 OPTIONS (user 'regress_testrolx');
CREATE USER MAPPING FOR nonexistent SERVER sv10 OPTIONS (user 'nonexistent'); -- error;
SELECT * FROM chkumapping();
-- ALTER USER MAPPING ALTER USER MAPPING FORCURRENT_USER SERVER sv1
OPTIONS (SET user 'CURRENT_USER_alt'); ALTER USER MAPPING FOR"current_user" SERVER sv2
OPTIONS (SET user '"current_user"_alt'); ALTER USER MAPPING FOR CURRENT_ROLE SERVER sv3
OPTIONS (SET user 'CURRENT_ROLE_alt'); ALTER USER MAPPING FOR USER SERVER sv4
OPTIONS (SET user 'USER_alt'); ALTER USER MAPPING FOR"user" SERVER sv5
OPTIONS (SET user '"user"_alt'); ALTER USER MAPPING FOR SESSION_USER SERVER sv6
OPTIONS (SET user 'SESSION_USER_alt'); ALTER USER MAPPING FOR PUBLIC SERVER sv7
OPTIONS (SET user 'public_alt'); ALTER USER MAPPING FOR"Public" SERVER sv8
OPTIONS (SET user '"Public"_alt'); ALTER USER MAPPING FOR regress_testrolx SERVER sv9
OPTIONS (SET user 'regress_testrolx_alt');
ALTER USER MAPPING FOR nonexistent SERVER sv10
OPTIONS (SET user 'nonexistent_alt'); -- error
SELECT * FROM chkumapping();
-- DROP USER MAPPING DROP USER MAPPING FORCURRENT_USER SERVER sv1; DROP USER MAPPING FOR"current_user" SERVER sv2; DROP USER MAPPING FOR CURRENT_ROLE SERVER sv3; DROP USER MAPPING FOR USER SERVER sv4; DROP USER MAPPING FOR"user" SERVER sv5; DROP USER MAPPING FOR SESSION_USER SERVER sv6; DROP USER MAPPING FOR PUBLIC SERVER sv7; DROP USER MAPPING FOR"Public" SERVER sv8; DROP USER MAPPING FOR regress_testrolx SERVER sv9;
DROP USER MAPPING FOR nonexistent SERVER sv10; -- error SELECT * FROM chkumapping();
CREATE USER MAPPING FORCURRENT_USER SERVER sv1 OPTIONS (user 'CURRENT_USER'); CREATE USER MAPPING FOR"current_user" SERVER sv2 OPTIONS (user '"current_user"'); CREATE USER MAPPING FOR CURRENT_ROLE SERVER sv3 OPTIONS (user 'CURRENT_ROLE'); CREATE USER MAPPING FOR USER SERVER sv4 OPTIONS (user 'USER'); CREATE USER MAPPING FOR"user" SERVER sv5 OPTIONS (user '"USER"'); CREATE USER MAPPING FOR SESSION_USER SERVER sv6 OPTIONS (user 'SESSION_USER'); CREATE USER MAPPING FOR PUBLIC SERVER sv7 OPTIONS (user 'PUBLIC'); CREATE USER MAPPING FOR"Public" SERVER sv8 OPTIONS (user '"Public"'); CREATE USER MAPPING FOR regress_testrolx SERVER sv9 OPTIONS (user 'regress_testrolx'); SELECT * FROM chkumapping();
-- DROP USER MAPPING IF EXISTS DROP USER MAPPING IFEXISTSFORCURRENT_USER SERVER sv1; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR"current_user" SERVER sv2; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFORCURRENT_USER SERVER sv3; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR USER SERVER sv4; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR"user" SERVER sv5; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR SESSION_USER SERVER sv6; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR PUBLIC SERVER sv7; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR"Public" SERVER sv8; SELECT * FROM chkumapping(); DROP USER MAPPING IFEXISTSFOR regress_testrolx SERVER sv9; SELECT * FROM chkumapping();
DROP USER MAPPING IFEXISTSFOR nonexistent SERVER sv10; -- error
-- GRANT/REVOKE GRANT regress_testrol0 TO pg_signal_backend; -- success
SET ROLE pg_signal_backend; --success
RESET ROLE; CREATESCHEMA test_roles_schema AUTHORIZATION pg_signal_backend; --success SET ROLE regress_testrol2;
UPDATE pg_proc SET proacl = null WHERE proname LIKE'testagg_'; SELECT proname, proacl FROM pg_proc WHERE proname LIKE'testagg_';
REVOKEALL PRIVILEGES ON FUNCTION testagg1(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg2(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg3(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg4(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg5(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg6(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg7(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg8(int2) FROM PUBLIC;
GRANTALL PRIVILEGES ON FUNCTION testagg1(int2) TO PUBLIC; GRANTALL PRIVILEGES ON FUNCTION testagg2(int2) TOCURRENT_USER; GRANTALL PRIVILEGES ON FUNCTION testagg3(int2) TO"current_user"; GRANTALL PRIVILEGES ON FUNCTION testagg4(int2) TO CURRENT_ROLE; GRANTALL PRIVILEGES ON FUNCTION testagg5(int2) TO SESSION_USER; GRANTALL PRIVILEGES ON FUNCTION testagg6(int2) TO"Public"; GRANTALL PRIVILEGES ON FUNCTION testagg7(int2) TO regress_testrolx; GRANTALL PRIVILEGES ON FUNCTION testagg8(int2) TO"public"; GRANTALL PRIVILEGES ON FUNCTION testagg9(int2) TO current_user, public, regress_testrolx;
SELECT proname, proacl FROM pg_proc WHERE proname LIKE'testagg_';
GRANTALL PRIVILEGES ON FUNCTION testagga(int2) TO USER; --error GRANTALL PRIVILEGES ON FUNCTION testagga(int2) TO NONE; --error GRANTALL PRIVILEGES ON FUNCTION testagga(int2) TO"none"; --error
SELECT proname, proacl FROM pg_proc WHERE proname LIKE'testagg_';
REVOKEALL PRIVILEGES ON FUNCTION testagg1(int2) FROM PUBLIC; REVOKEALL PRIVILEGES ON FUNCTION testagg2(int2) FROMCURRENT_USER; REVOKEALL PRIVILEGES ON FUNCTION testagg3(int2) FROM"current_user"; REVOKEALL PRIVILEGES ON FUNCTION testagg4(int2) FROM CURRENT_ROLE; REVOKEALL PRIVILEGES ON FUNCTION testagg5(int2) FROM SESSION_USER; REVOKEALL PRIVILEGES ON FUNCTION testagg6(int2) FROM"Public"; REVOKEALL PRIVILEGES ON FUNCTION testagg7(int2) FROM regress_testrolx; REVOKEALL PRIVILEGES ON FUNCTION testagg8(int2) FROM"public"; REVOKEALL PRIVILEGES ON FUNCTION testagg9(int2) FROM current_user, public, regress_testrolx;
SELECT proname, proacl FROM pg_proc WHERE proname LIKE'testagg_';
REVOKEALL PRIVILEGES ON FUNCTION testagga(int2) FROM USER; --error REVOKEALL PRIVILEGES ON FUNCTION testagga(int2) FROM NONE; --error REVOKEALL PRIVILEGES ON FUNCTION testagga(int2) FROM"none"; --error
SELECT proname, proacl FROM pg_proc WHERE proname LIKE'testagg_';
-- DEFAULT MONITORING ROLES CREATE ROLE regress_role_haspriv; CREATE ROLE regress_role_nopriv;
-- pg_read_all_stats GRANT pg_read_all_stats TO regress_role_haspriv; SET SESSION AUTHORIZATION regress_role_haspriv; -- returns true with role member of pg_read_all_stats SELECT COUNT(*) = 0AS haspriv FROM pg_stat_activity WHERE query = '<insufficient privilege>'; SET SESSION AUTHORIZATION regress_role_nopriv; -- returns false with role not member of pg_read_all_stats SELECT COUNT(*) = 0AS haspriv FROM pg_stat_activity WHERE query = '<insufficient privilege>';
RESET SESSION AUTHORIZATION; REVOKE pg_read_all_stats FROM regress_role_haspriv;
-- pg_read_all_settings GRANT pg_read_all_settings TO regress_role_haspriv;
BEGIN; -- A GUC using GUC_SUPERUSER_ONLY is useful for negative tests. SET LOCAL session_preload_libraries TO'path-to-preload-libraries'; SET SESSION AUTHORIZATION regress_role_haspriv; -- passes with role member of pg_read_all_settings SHOW session_preload_libraries; SET SESSION AUTHORIZATION regress_role_nopriv; -- fails with role not member of pg_read_all_settings SHOW session_preload_libraries;
RESET SESSION AUTHORIZATION;
ROLLBACK; REVOKE pg_read_all_settings FROM regress_role_haspriv;
-- clean up
\c
DROPSCHEMA test_roles_schema; DROP OWNED BY regress_testrol0, "Public", "current_role", "current_user", regress_testrol1, regress_testrol2, regress_testrolx CASCADE; DROP ROLE regress_testrol0, regress_testrol1, regress_testrol2, regress_testrolx; DROP ROLE "Public", "None", "current_role", "current_user", "session_user", "user"; DROP ROLE regress_role_haspriv, regress_role_nopriv;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.