Estoy buscando una manera de crear una función que tome dos parámetros para el nombre de usuario y la contraseña y cree un rol de solo lectura con él. He intentado algo como:
create or replace function create_user_readonly ( unm varchar, pwd varchar ) returns varchar(10) as $$ begin create role unm login password @pwd; return 'success'; end; $$ language plpgsql;Esto arroja el error:
[42601] ERROR: error de sintaxis en o cerca de la posición "@": 151
Pensé en usar SQL dinámico para construir la consulta, pero encontré esto aquí ( https://www.postgresql.org/docs/9.1/static/plpgsql-statements.html ):
Otra restricción de los símbolos de parámetros es que solo funcionan en los comandos SELECCIONAR, INSERTAR, ACTUALIZAR y ELIMINAR. En otros tipos de declaraciones (genéricamente llamadas declaraciones de utilidad), debe insertar valores textualmente, incluso si son solo valores de datos.
Aquí hay un ejemplo:
create or replace function create_user_readonly ( unm varchar, pwd varchar ) returns varchar(10) as $$ begin execute format($f$create role %I login password '%s'$f$,unm,pwd); execute format('alter role %I set transaction_read_only to on',unm); return 'success'; end; $$ language plpgsql; tenga en cuenta que deberá modificar el usuario para establecer la transaction_read_only también para que sea de solo lectura. también :
CREATE ROLE no ofrece establecer el valor predeterminado de RO en el rol.
ALTER ROLE hace
Y tenga en cuenta que superar la configuración de uset transaction_read_only es tan fácil como ejecutar una declaración.
y crear un rol no le dará permiso de CONNECT , use CREATE USER en su lugar si desea uno.