Thread: Set role dynamically from proc
DO$$DECLARE act_dbowner varchar(100);BEGINSELECT u.usename into act_dbowner FROM pg_database dJOIN pg_user u ON (d.datdba = u.usesysid)WHERE d.datname = (SELECT current_database());raise notice 'DB owner: %', act_dbowner;set role to act_dbowner; -- THIS LINEEND$$;-------------
ERROR: role "act_dbowner" does not existCONTEXT: SQL statement "set role to act_dbowner"PL/pgSQL function inline_code_block line 10 at SQL statement
Hello
From: Durumdara [mailto:durumdara@gmail.com]
Sent: Mittwoch, 22. November 2017 14:56
To: pgsql-general@postgresql.org
Subject: Set role dynamically from proc
Hello!
May you know the way how to set role dynamically.
DO
$$
DECLARE act_dbowner varchar(100);
BEGIN
SELECT u.usename into act_dbowner FROM pg_database d
JOIN pg_user u ON (d.datdba = u.usesysid)
WHERE d.datname = (SELECT current_database());
raise notice 'DB owner: %', act_dbowner;
set role to act_dbowner; -- THIS LINE
END
$$;
-------------
ERROR: role "act_dbowner" does not exist
CONTEXT: SQL statement "set role to act_dbowner"
PL/pgSQL function inline_code_block line 10 at SQL statement
I try to use $act_dbowner, but it have no effect.
It seems that the user does not exist:
CREATE OR REPLACE FUNCTION set_role()
RETURNS VOID
AS $$
BEGIN
RAISE NOTICE 'CURRENT_USER: %', (select current_user);
SET ROLE blabla;
RAISE NOTICE 'CURRENT_USER: %', (select current_user);
END;
$$ LANGUAGE plpgsql;
db=> select * from set_role();
NOTICE: CURRENT_USER: kofadmin
ERROR: role "blabla" does not exist
CONTEXT: SQL statement "SET ROLE blabla"
PL/pgSQL function set_role() line 4 at SQL statement
db=> CREATE ROLE blabla;
CREATE ROLE
db=> select * from set_role();
NOTICE: CURRENT_USER: kofadmin
ERROR: permission denied to set role "blabla"
CONTEXT: SQL statement "SET ROLE blabla"
PL/pgSQL function set_role() line 4 at SQL statement
db=> GRANT blabla TO kofadmin;
GRANT ROLE
Now it works:
db=> select * from set_role();
NOTICE: CURRENT_USER: kofadmin
NOTICE: CURRENT_USER: blabla
[...]
Regards
Charles
Thank you for your help!
Best wishes
dd
I don't know how to force the system to use my variable value, and not my variable name in the routines.
Hello!May you know the way how to set role dynamically.DO$$DECLARE act_dbowner varchar(100);BEGINSELECT u.usename into act_dbowner FROM pg_database dJOIN pg_user u ON (d.datdba = u.usesysid)WHERE d.datname = (SELECT current_database());raise notice 'DB owner: %', act_dbowner;set role to act_dbowner; -- THIS LINEEND$$;-------------ERROR: role "act_dbowner" does not existCONTEXT: SQL statement "set role to act_dbowner"PL/pgSQL function inline_code_block line 10 at SQL statementI try to use $act_dbowner, but it have no effect.Thank you for your help!Best wishesdd
Now the "set role" uses the "variable name", and not the "value of the variable".This is what I don't like in this lang. I need to write a special variable name to "force" to use it, and not other thing.
I don't know how to force the system to use my variable value, and not my variable name in the routines.For example $var$, or <var>, or [var], etc.I can generate "set role" with string concat, but in PGAdmin this script would be good.