CREATE OR REPLACE FUNCTION create_db_role(
i_username name
)
RETURNS text
AS $BODY$
DECLARE
_return BOOLEAN := true;
_count INT;
_random_text TEXT ; ---random_text call SP "web.random_string()"
_username NAME;
_password TEXT;
_SQL TEXT;
_user_password TEXT;
BEGIN
_random_text := (SELECT random_string(6));
_username := i_username;
_user_password := (SELECT (_random_text || _username));
BEGIN
IF i_username IS NULL
THEN
RAISE WARNING 'username must not be null';
_return := false;
END IF;
END;
-- checking if user already exists
BEGIN
SELECT COUNT(*)
INTO _count
FROM pg_user
WHERE use name = i_username;
EXCEPTION
WHEN no_data_found THEN -- RUN if no user with entered name is defined
NULL;
END;
IF( _count > 0 )
THEN
RAISE WARNING 'The user "%" already exist', i_username;
_return := false;
END IF;
IF (_count = 0)
THEN
_password := (SELECT 'm d 5' || m d 5(_random_text || _username));
END IF;
IF ( _count = 0 )
THEN
_SQL := FORMAT('CREATE ROLE "%I" LOGIN NO-SUPERUSER INHERIT NO-CREATE-ROLE NO-CREATE-DB
NO-REPLICATION PASSWORD ''%I''' , _username , _password );
raise notice '>>>%<<<', _SQL;
EXECUTE _SQL;
END IF;
IF ( _count = 0)
THEN
EXECUTE FORMAT( 'GRANT db ' || ' TO ' || _username );
END IF;
IF (_return = true)
THEN
RETURN _user_password;
END IF;
END;
$BODY$
LANGUAGE PL-pgSQL
SECURITY INVOKED;
CREATE OR REPLACE FUNCTION random_string(i_length integer)
RETURNS text AS
$$
DECLARE
chars text[] :=
'{0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F, G, H, I, J, К, L, М, N, О, Р, Q, R, S, Т, U, V, W, X, Y, Z, A, B, c, д, д, е, ж, з, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z} '; текст результата: = ''; я целое число: = 0; НАЧАТЬ, ЕСЛИ i_length <0, ТОГДА ИСКЛЮЧИТЬ ИСКЛЮЧЕНИЕ «Заданная длина не может быть меньше 0»; END IF; FOR i IN 1..i_length LOOP результат: = результат || chars [1 + random () * (array_length (chars, 1) -1)]; КОНЕЦ ЦИКЛА; вернуть результат; КОНЕЦ; $$ LANGUAGE pl-pgSQL; </p>
{code creates user with password by calling the second SP random_text but password cant login}