Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Включение одной роли в другую  [new]
mariem
Member

Откуда:
Сообщений: 9
Здравствуйте!
Мною создано две роли: групповая customer и персонализированная client_name_surname
Необходимо включить роль клиента в роль customer
Явно это делается следующим образом
GRANT customer TO client_name_surname


Но задача состоит в том, что мне неизвестно имя роли клиента и я хочу передать в такой запрос последнюю добавленную роль на место client_name_surname

выглядело бы это так:
GRANT customer TO (SELECT rolname FROM pg_roles WHERE oid=(SELECT max(oid) FROM pg_roles)); 


такой вариант к сожалению не работает, посоветуйте пожалуйста способ решения
18 фев 21, 12:09    [22282680]     Ответить | Цитировать Сообщить модератору
 Re: Включение одной роли в другую  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4571
mariem,

Чей то мне кажется что вы где то нашли SQL INJECTION и пытаетесь его для управления ролями и правами заабуюзить.
Объясните как у вас получилось что " мне неизвестно имя роли клиента ".

Эм если штатные методы не работают - значит вы делаете что то не то.
И надо о постановке задачи задуматься.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
18 фев 21, 12:14    [22282687]     Ответить | Цитировать Сообщить модератору
 Re: Включение одной роли в другую  [new]
mariem
Member

Откуда:
Сообщений: 9
Maxim Boguk,

есть таблица с клиентами, мне нужно для рандомного клиента создать персонализированную роль.
создала для этого функцию:

CREATE OR REPLACE FUNCTION create_role()
RETURNS TABLE (f TEXT, l TEXT)
AS
$$ 
BEGIN 
DROP TABLE IF EXISTS tmpCustomer;			
CREATE TEMPORARY TABLE IF NOT EXISTS tmpCustomer (c_id int, f_name TEXT, l_name TEXT);
INSERT INTO tmpCustomer
SELECT cid, fname, lname
FROM 
	(SELECT DISTINCT c.customer_id AS cid, c.first_name AS fname, c.last_name AS lname
	FROM customer c 
	INNER JOIN rental r ON c.customer_id=r.customer_id 
	INNER JOIN payment p ON c.customer_id=p.customer_id) AS subq
ORDER BY random()
LIMIT 1;

EXECUTE 'CREATE ROLE client_'||(SELECT f_name FROM tmpCustomer)||'_'||(SELECT l_name FROM tmpCustomer);

RAISE NOTICE 'Role was created for customer % %',(SELECT f_name FROM tmpCustomer), (SELECT l_name FROM tmpCustomer);
RETURN query SELECT f_name, l_name FROM tmpCustomer;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM create_role();


возникла мыль просто запихнуть в функцию включение ролей
EXECUTE 'GRANT customer TO client_'||(SELECT f_name FROM tmpCustomer)||'_'||(SELECT l_name FROM tmpCustomer);
18 фев 21, 12:35    [22282716]     Ответить | Цитировать Сообщить модератору
 Re: Включение одной роли в другую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52443
mariem
есть таблица с клиентами, мне нужно для рандомного клиента создать персонализированную роль.

Нормальные люди так не делают. Рандомному клиенту выдаётся заранее определённая роль "для рандомных клиентов". Или вообще никакая.
18 фев 21, 14:44    [22282842]     Ответить | Цитировать Сообщить модератору
 Re: Включение одной роли в другую  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1297
Dimitry Sibiryakov
mariem
есть таблица с клиентами, мне нужно для рандомного клиента создать персонализированную роль.

Нормальные люди так не делают. Рандомному клиенту выдаётся заранее определённая роль "для рандомных клиентов". Или вообще никакая.


Мне тоже кажется что
Роли они должны определяться заранее
и смысла роли для каждого клиента я не вижу
(и это даже НЕ приментильно к постгресу а вообще
имхо к любой БД)

хотя возможно не достаточно информации
зачем это делается ???
19 фев 21, 13:35    [22283465]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить