Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / create user - from plpgsql function / 5 сообщений из 5, страница 1 из 1
26.01.2008, 13:28
    #35089382
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create user - from plpgsql function
вот такую настрочил функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--INSERT FUNCTION:
CREATE OR REPLACE FUNCTION "admin".users_ins(
	p_usr text,p_psw text
) RETURNS "admin".vw_users AS 
$$
DECLARE
	rw "admin".vw_users;
BEGIN
	INSERT INTO "admin".users(
		usr,psw) 
	VALUES 
		(p_usr,p_psw);
	perform 'create user ' || p_usr || ' with password ''' || p_psw || '''';
	SELECT * FROM "admin".vw_users WHERE id=lastval() INTO rw;
	RETURN rw;
END
$$ LANGUAGE plpgsql;

хочу сделать механизм разграничения прав доступа. думал сделать свою таблицу юзеров, доступов и т.п. и при этом хотел, чтобы при вставке в мою таблицу юзеров создавался и в постгресе этот юзер. и потом при раздаче доступов чтобы делалось хранимками grant/revoke по объектам бд - там, где это нужно. всё это дело затевается для того, чтобы упростить потом это всё для конечного пользователя и главное из-за того, что не все доступы будут постгресом разруливаться. будут свои ещё - там по бизнеслогике всякие извращения.

ну и вобщем тут странно как-то себя ведёт вот эта строка кода:
perform 'create user ' || p_usr || ' with password ''' || p_psw || '''';

постгрес на неё не ругается - однако и юзера не создаёт :(. ну и ещё у меня 2 такие функции есть для изменения и удаления юзеров. и с ними картина та же - и не ругается и не делает ничего полезного :(. теряюсь в догадках что бы это значило... подскажите плз в чём тут прикол.

ну и ещё интересно заслушать мнения спецов кто такое что-то делал - правильным ли я путём изобретаю свой велосипед :). тут вот не считая этих глюков ещё слабое место имеется: при манипуляциях с юзерами в обход моих этих вот инструментов проблемы будут. но я не знаю как их избежать... мне кажется это не возможным... может кто подскажет как это всё красивее можно сделать?
...
Рейтинг: 0 / 0
26.01.2008, 13:55
    #35089401
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create user - from plpgsql function
Вот рабочий триггер, комментировать шас времени нет. Но, думаю, многое по именам понятно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CREATE OR REPLACE FUNCTION tr_user_create () RETURNS trigger AS
$body$
declare
 username text;
 createuserstr text;
 dropuserstr text;
 cur_schema text;
BEGIN
  /* Тело новой функции */
  username:=NewUserName(new.role_id);
  dropuserstr:='drop user if exists '|| username; 
  execute dropuserstr;
  new.password_text=COALESCE(new.password_text, '');
  createuserstr:='create user '|| username ||' encrypted password '''|| new.password_text||''' IN ROLE '; 

-- CREATE ROLE admin SUPERUSER; -- 1
-- CREATE ROLE SimpleUser;      -- 2
-- CREATE ROLE TheNextRole;     -- 3
-- CREATE ROLE Loginer;         -- 4

 IF new.Role_id= 1  THEN
     createuserstr:=createuserstr || 'UsrAdmin'; ELSIF
    new.Role_ID= 2  THEN
  createuserstr:=createuserstr || 'SimpleUser'; ELSIF
    new.Role_ID= 3  THEN
  createuserstr:=createuserstr || 'TheNextRole'; ELSIF
    new.Role_ID= 4  THEN
  createuserstr:=createuserstr || 'Loginer';

 END IF;
  execute createuserstr;
   IF new.Role_id= 1  THEN
     createuserstr:='ALTER USER '|| username ||' WITH CREATEROLE';
     execute createuserstr;
    END IF;
  SELECT current_setting('search_path') INTO cur_schema;
  createuserstr:='ALTER USER '|| username ||' SET search_path TO ' || cur_schema;
  execute createuserstr;

  new.password_text:=NULL;
  new.pg_username:=username;
  RETURN new;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


...
Рейтинг: 0 / 0
26.01.2008, 14:41
    #35089429
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create user - from plpgsql function
спасибо за пример. его ещё перевариваю. но в своих функциях заменил perform на execute - и всё заработало :). не знаю почему не работало... мне кажется должно было...
а в чём принципиальная разница триггером или хранимкой это делать - при учёте что доступов к таблицам ниукого не будет вообсче - кроме postgresа-суперюзера? ну вроде как теоретически правильнее триггером - но у меня вроде это без разницы при данном раскладе. лениво код этот разносить на триггеры/хранимки :). да и удобнее с этим всем мне будет работать если в одном месте всё - меньше вероятность ошибок, лучше читабельность/понимабельность и т.п. :)
...
Рейтинг: 0 / 0
26.01.2008, 22:40
    #35089801
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create user - from plpgsql function
aovспасибо за пример. его ещё перевариваю. но в своих функциях заменил perform на execute - и всё заработало :). не знаю почему не работало... мне кажется должно было... не должно было, PERFORM это эквивалент конструкции SELECT (причём именно SELECT, а не CREATE !) только вместо слова SELECT - пишется PERFORM
соответственно то что Вы написали у себя с PERFORM эквивалентно такому запросу (ес-сно с подстановкой соответствующих p_usr и p_psw):
Код: plaintext
1.
2.
3.
4.
seb=> select 'create user p_usr with password ''p_psw''';
                ?column?
-----------------------------------------
 create user p_usr with password 'p_psw'
то есть Вы просто собрали строку из параметров оператора || и выбрали её как строку :)

запрос должен был быть написан статически в коде функции, типа: perform 1+1*field1; а так как в данном случае это невозможно (логин/пароль являются изменяемым параметром да и вместо select нужно create) то Вам надо было использовать execute
...
Рейтинг: 0 / 0
27.01.2008, 16:48
    #35090160
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create user - from plpgsql function
да - тупанул я чёто. самому теперь смешно :).
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / create user - from plpgsql function / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]