создал две функции с plpg sql для создания роли пользователя, но возникли проблемы с созданным паролем - PullRequest
0 голосов
/ 28 апреля 2020
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}
...