Berend,   Thank you for the function code. It helped me a lot! Regards,   Zlatko    -------Original Message-------   Date: 06/15/05 18:08:22 Subject: Re: [GENERAL] enebling regular user to create new users ?   Zlatko Matić wrote:   > I know that superusers are allowed to do everything on the database, > but I consider this as dangerous. I want to  have some user group with > rights of creating new users and giving them some authorizations, but > without such wide power as superusers have. So, > I was thinking about two possible scenarios: > a) to allow regular users  to create new users > b) to restrict superuser's permissions > > What is possible and what do you suggest ?   CREATE OR REPLACE FUNCTION create_user(name)   RETURNS bool AS ' DECLARE   PWD VARCHAR;   CMD VARCHAR; BEGIN   PWD := \'\'\'\' || get_random_string(8) || \'\'\'\';   IF EXISTS(SELECT 1 FROM pg_user WHERE usename = $1) THEN     RETURN FALSE;   END IF;   CMD := \'CREATE USER "\' || $1 || \'" WITH ENCRYPTED PASSWORD \' || PWD || \' IN GROUP gen_user\';   EXECUTE CMD;   RETURN TRUE; END; '   LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER; REVOKE ALL ON FUNCTION create_user(name) FROM public; GRANT EXECUTE ON FUNCTION create_user(name) TO GROUP pseudo_dba;     CREATE OR REPLACE FUNCTION alter_group(name, bool, name)   RETURNS bool AS ' DECLARE   l_group ALIAS FOR $1;   l_create_user ALIAS FOR $2;   l_username ALIAS FOR $3;   CMD VARCHAR;   MIN_SUPER_USER INTEGER := 1; BEGIN   IF (l_create_user NOTNULL)  THEN     IF (l_create_user) THEN       PERFORM create_user(l_username);       CMD := \'ALTER GROUP \' || l_group || \' ADD USER "\' || l_username || \'"\';       EXECUTE CMD;     ELSIF (l_group = \'gen_user\') THEN       PERFORM drop_user(l_username);     ELSE       CMD := \'ALTER GROUP \' || l_group || \' DROP USER "\' || l_username || \'"\';       EXECUTE CMD;     END IF;     IF (SELECT COUNT(*) FROM group_members WHERE groname = \'pseudo_dba\') < MIN_SUPER_USER THEN       RAISE EXCEPTION \'At least % super user(s) must be defined in order to create new user accounts.\', MIN_SUPER_USER;     END IF;   END IF;   RETURN TRUE; END; '   LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER; REVOKE ALL ON FUNCTION alter_group(name, bool, name) FROM public; GRANT EXECUTE ON FUNCTION alter_group(name, bool, name) TO GROUP pseudo_dba;   -- etc., etc., etc.,  |