Я хочу выполнить запрос к базе данных PostgreSQL. Запрос выглядит следующим образом:
select * from pg_stat_activity;
Но я хочу, чтобы это сделал пользователь, имеющий только разрешение на чтение. Пользователю не должно быть разрешено делать выбор в таблицах, потому что он только видит, кто подключен к базе данных, и не может видеть такие таблицы, как, например, Passwords
.
Одним из решений этой проблемы является выполнение функции, которую суперпользователь запускает для обычного пользователя, которому не разрешено просматривать выходные данные.
Но у меня проблемы с созданием этой функции.
Я хочу, чтобы запрос был только в таблицах системного каталога. Для функции ниже:
CREATE FUNCTION test(TEXT)
RETURNS TABLE AS $$
BEGIN
RETURN QUERY $1
RETURN;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
-- Set a secure search_path: trusted schema(s), then 'pg_temp'.
SET search_path = pg_catalog;
Можно ли запустить эти команды в psql для создания функции?
CREATE FUNCTION test(TEXT) ... SECURITY DEFINER;
REVOKE ALL ON FUNCTION test(TEXT) FROM PUBLIC;
GRANT EXECUTE ON FUNCTION test(TEXT) TO admins;
Функция будет выполняться так?
select *from test(select *from pg_stat_activity);
Как определить, что функция выполняет только запросы, относящиеся к pg_catalog
?