Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PostgreSQL |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4571 |
mariem, Чей то мне кажется что вы где то нашли SQL INJECTION и пытаетесь его для управления ролями и правами заабуюзить. Объясните как у вас получилось что " мне неизвестно имя роли клиента ". Эм если штатные методы не работают - значит вы делаете что то не то. И надо о постановке задачи задуматься. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
18 фев 21, 12:14 [22282687] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52443 |
Нормальные люди так не делают. Рандомному клиенту выдаётся заранее определённая роль "для рандомных клиентов". Или вообще никакая. |
||||
18 фев 21, 14:44 [22282842] Ответить | Цитировать Сообщить модератору |
Гулин Федор Member Откуда: МИНСК Сообщений: 1297 |
Мне тоже кажется что Роли они должны определяться заранее и смысла роли для каждого клиента я не вижу (и это даже НЕ приментильно к постгресу а вообще имхо к любой БД) хотя возможно не достаточно информации зачем это делается ??? |
||||||||
19 фев 21, 13:35 [22283465] Ответить | Цитировать Сообщить модератору |
Все форумы / PostgreSQL | ![]() |