📄 privileges.out
字号:
---- Test access privileges--CREATE USER regressuser1;CREATE USER regressuser2;CREATE USER regressuser3;CREATE USER regressuser4;CREATE USER regressuser4; -- duplicateERROR: role "regressuser4" already existsCREATE GROUP regressgroup1;CREATE GROUP regressgroup2 WITH USER regressuser1, regressuser2;ALTER GROUP regressgroup1 ADD USER regressuser4;ALTER GROUP regressgroup2 ADD USER regressuser2; -- duplicateNOTICE: role "regressuser2" is already a member of role "regressgroup2"ALTER GROUP regressgroup2 DROP USER regressuser2;ALTER GROUP regressgroup2 ADD USER regressuser4;-- test owner privilegesSET SESSION AUTHORIZATION regressuser1;SELECT session_user, current_user; session_user | current_user --------------+-------------- regressuser1 | regressuser1(1 row)CREATE TABLE atest1 ( a int, b text );SELECT * FROM atest1; a | b ---+---(0 rows)INSERT INTO atest1 VALUES (1, 'one');DELETE FROM atest1;UPDATE atest1 SET a = 1 WHERE b = 'blech';LOCK atest1 IN ACCESS EXCLUSIVE MODE;REVOKE ALL ON atest1 FROM PUBLIC;SELECT * FROM atest1; a | b ---+---(0 rows)GRANT ALL ON atest1 TO regressuser2;GRANT SELECT ON atest1 TO regressuser3, regressuser4;SELECT * FROM atest1; a | b ---+---(0 rows)CREATE TABLE atest2 (col1 varchar(10), col2 boolean);GRANT SELECT ON atest2 TO regressuser2;GRANT UPDATE ON atest2 TO regressuser3;GRANT INSERT ON atest2 TO regressuser4;SET SESSION AUTHORIZATION regressuser2;SELECT session_user, current_user; session_user | current_user --------------+-------------- regressuser2 | regressuser2(1 row)-- try various combinations of queries on atest1 and atest2SELECT * FROM atest1; -- ok a | b ---+---(0 rows)SELECT * FROM atest2; -- ok col1 | col2 ------+------(0 rows)INSERT INTO atest1 VALUES (2, 'two'); -- okINSERT INTO atest2 VALUES ('foo', true); -- failERROR: permission denied for relation atest2INSERT INTO atest1 SELECT 1, b FROM atest1; -- okUPDATE atest1 SET a = 1 WHERE a = 2; -- okUPDATE atest2 SET col2 = NOT col2; -- failERROR: permission denied for relation atest2SELECT * FROM atest1 FOR UPDATE; -- ok a | b ---+----- 1 | two 1 | two(2 rows)SELECT * FROM atest2 FOR UPDATE; -- failERROR: permission denied for relation atest2DELETE FROM atest2; -- failERROR: permission denied for relation atest2LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- failERROR: permission denied for relation atest2COPY atest2 FROM stdin; -- failERROR: permission denied for relation atest2GRANT ALL ON atest1 TO PUBLIC; -- failWARNING: no privileges were granted-- checks in subquery, both okSELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); a | b ---+---(0 rows)SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); col1 | col2 ------+------(0 rows)SET SESSION AUTHORIZATION regressuser3;SELECT session_user, current_user; session_user | current_user --------------+-------------- regressuser3 | regressuser3(1 row)SELECT * FROM atest1; -- ok a | b ---+----- 1 | two 1 | two(2 rows)SELECT * FROM atest2; -- failERROR: permission denied for relation atest2INSERT INTO atest1 VALUES (2, 'two'); -- failERROR: permission denied for relation atest1INSERT INTO atest2 VALUES ('foo', true); -- failERROR: permission denied for relation atest2INSERT INTO atest1 SELECT 1, b FROM atest1; -- failERROR: permission denied for relation atest1UPDATE atest1 SET a = 1 WHERE a = 2; -- failERROR: permission denied for relation atest1UPDATE atest2 SET col2 = NULL; -- okUPDATE atest2 SET col2 = NOT col2; -- fails; requires SELECT on atest2ERROR: permission denied for relation atest2UPDATE atest2 SET col2 = true FROM atest1 WHERE atest1.a = 5; -- okSELECT * FROM atest1 FOR UPDATE; -- failERROR: permission denied for relation atest1SELECT * FROM atest2 FOR UPDATE; -- failERROR: permission denied for relation atest2DELETE FROM atest2; -- failERROR: permission denied for relation atest2LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- okCOPY atest2 FROM stdin; -- failERROR: permission denied for relation atest2-- checks in subquery, both failSELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) );ERROR: permission denied for relation atest2SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) );ERROR: permission denied for relation atest2SET SESSION AUTHORIZATION regressuser4;COPY atest2 FROM stdin; -- okSELECT * FROM atest1; -- ok a | b ---+----- 1 | two 1 | two(2 rows)-- groupsSET SESSION AUTHORIZATION regressuser3;CREATE TABLE atest3 (one int, two int, three int);GRANT DELETE ON atest3 TO GROUP regressgroup2;SET SESSION AUTHORIZATION regressuser1;SELECT * FROM atest3; -- failERROR: permission denied for relation atest3DELETE FROM atest3; -- ok-- viewsSET SESSION AUTHORIZATION regressuser3;CREATE VIEW atestv1 AS SELECT * FROM atest1; -- ok/* The next *should* fail, but it's not implemented that way yet. */CREATE VIEW atestv2 AS SELECT * FROM atest2;CREATE VIEW atestv3 AS SELECT * FROM atest3; -- okSELECT * FROM atestv1; -- ok a | b ---+----- 1 | two 1 | two(2 rows)SELECT * FROM atestv2; -- failERROR: permission denied for relation atest2GRANT SELECT ON atestv1, atestv3 TO regressuser4;GRANT SELECT ON atestv2 TO regressuser2;SET SESSION AUTHORIZATION regressuser4;SELECT * FROM atestv1; -- ok a | b ---+----- 1 | two 1 | two(2 rows)SELECT * FROM atestv2; -- failERROR: permission denied for relation atestv2SELECT * FROM atestv3; -- ok one | two | three -----+-----+-------(0 rows)CREATE VIEW atestv4 AS SELECT * FROM atestv3; -- nested viewSELECT * FROM atestv4; -- ok one | two | three -----+-----+-------(0 rows)GRANT SELECT ON atestv4 TO regressuser2;SET SESSION AUTHORIZATION regressuser2;-- Two complex cases:SELECT * FROM atestv3; -- failERROR: permission denied for relation atestv3SELECT * FROM atestv4; -- ok (even though regressuser2 cannot access underlying atestv3) one | two | three -----+-----+-------(0 rows)SELECT * FROM atest2; -- ok col1 | col2 ------+------ bar | t(1 row)SELECT * FROM atestv2; -- fail (even though regressuser2 can access underlying atest2)ERROR: permission denied for relation atest2-- privileges on functions, languages-- switch to superuser\c -REVOKE ALL PRIVILEGES ON LANGUAGE sql FROM PUBLIC;GRANT USAGE ON LANGUAGE sql TO regressuser1; -- okGRANT USAGE ON LANGUAGE c TO PUBLIC; -- failERROR: language "c" is not trustedHINT: Only superusers may use untrusted languages.SET SESSION AUTHORIZATION regressuser1;GRANT USAGE ON LANGUAGE sql TO regressuser2; -- failWARNING: no privileges were grantedCREATE FUNCTION testfunc1(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql;CREATE FUNCTION testfunc2(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql;REVOKE ALL ON FUNCTION testfunc1(int), testfunc2(int) FROM PUBLIC;GRANT EXECUTE ON FUNCTION testfunc1(int), testfunc2(int) TO regressuser2;GRANT USAGE ON FUNCTION testfunc1(int) TO regressuser3; -- semantic errorERROR: invalid privilege type USAGE for functionGRANT ALL PRIVILEGES ON FUNCTION testfunc1(int) TO regressuser4;GRANT ALL PRIVILEGES ON FUNCTION testfunc_nosuch(int) TO regressuser4;ERROR: function testfunc_nosuch(integer) does not existCREATE FUNCTION testfunc4(boolean) RETURNS text AS 'select col1 from atest2 where col2 = $1;' LANGUAGE sql SECURITY DEFINER;GRANT EXECUTE ON FUNCTION testfunc4(boolean) TO regressuser3;SET SESSION AUTHORIZATION regressuser2;SELECT testfunc1(5), testfunc2(5); -- ok testfunc1 | testfunc2 -----------+----------- 10 | 15(1 row)CREATE FUNCTION testfunc3(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; -- failERROR: permission denied for language sqlSET SESSION AUTHORIZATION regressuser3;SELECT testfunc1(5); -- failERROR: permission denied for function testfunc1SELECT col1 FROM atest2 WHERE col2 = true; -- failERROR: permission denied for relation atest2SELECT testfunc4(true); -- ok testfunc4 ----------- bar(1 row)SET SESSION AUTHORIZATION regressuser4;SELECT testfunc1(5); -- ok testfunc1 ----------- 10(1 row)DROP FUNCTION testfunc1(int); -- failERROR: must be owner of function testfunc1\c -DROP FUNCTION testfunc1(int); -- ok-- restore to sanityGRANT ALL PRIVILEGES ON LANGUAGE sql TO PUBLIC;-- has_table_privilege function-- bad-input checksselect has_table_privilege(NULL,'pg_authid','select'); has_table_privilege --------------------- (1 row)select has_table_privilege('pg_shad','select');ERROR: relation "pg_shad" does not existselect has_table_privilege('nosuchuser','pg_authid','select');ERROR: role "nosuchuser" does not existselect has_table_privilege('pg_authid','sel');ERROR: unrecognized privilege type: "sel"select has_table_privilege(-999999,'pg_authid','update');ERROR: role with OID 4293967297 does not existselect has_table_privilege(1,'rule');ERROR: relation with OID 1 does not exist-- superuser\c -select has_table_privilege(current_user,'pg_authid','select'); has_table_privilege --------------------- t(1 row)select has_table_privilege(current_user,'pg_authid','insert'); has_table_privilege ---------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -