Функции получения информации о сессии#
Данные функции не используют круглые скобки.
- current_user#
Возвращает текущего пользователя.
- current_groups()#
Возвращает список групп текущего пользователя.
- current_catalog#
Возвращает текущий каталог.
- current_schema#
Возвращает текущую схему.
Динамические параметры сессии#
Динамические параметры сессии позволяют передавать произвольные значения в запросы и представления (views) через механизм сессии. Один из сценариев использования — создание динамических представлений, поведение которых зависит от параметров, выставленных клиентом перед выполнением запроса.
Параметры не требуют предварительного объявления: они создаются в момент установки через SET SESSION и удаляются через RESET SESSION. Все активные динамические
параметры отображаются в выводе команды SHOW SESSION.
Поддерживаются два типа динамических параметров:
Скалярные параметры — хранят одно строковое значение.
Списковые параметры — хранят массив строк для проверки принадлежности множеству.
Скалярные динамические параметры#
Скалярный параметр — именованный параметр, хранящий одно строковое значение типа varchar. Значение устанавливается через SET SESSION
с использованием префикса dynamic_parameter$.
Установка параметра:
SET SESSION "dynamic_parameter$<имя_параметра>" = '<строковое_значение>';
Сброс параметра:
RESET SESSION "dynamic_parameter$<имя_параметра>";
Сброс уже удалённого параметра не вызывает ошибки (операция идемпотентна).
Просмотр активных параметров:
SHOW SESSION LIKE 'dynamic_parameter%';
- dynamic_param(name) varchar#
Возвращает строковое значение скалярного динамического параметра с заданным именем.
name— имя параметра (типvarchar).
Если параметр не установлен, функция завершается с ошибкой:
Dynamic session parameter is not set: <name>Тип возвращаемого значения всегда
varchar. При необходимости используйте явное приведение типа (CAST).
Пример: использование скалярного параметра в запросе
-- Установить параметр
SET SESSION "dynamic_parameter$department" = 'engineering';
-- Использовать в запросе
SELECT *
FROM employees
WHERE department = dynamic_param('department');
Пример: динамическое представление со скалярным параметром
Представление создаётся один раз и не содержит конкретных значений — они подставляются при каждом обращении из текущей сессии:
CREATE VIEW active_users AS
SELECT *
FROM users
WHERE status = dynamic_param('status_filter');
-- Первый запрос: показать активных пользователей
SET SESSION "dynamic_parameter$status_filter" = 'active';
SELECT * FROM active_users;
-- Второй запрос: показать заблокированных
SET SESSION "dynamic_parameter$status_filter" = 'blocked';
SELECT * FROM active_users;
Пример: приведение типа
Значение параметра всегда имеет тип varchar. Для использования в арифметических выражениях или сравнениях с числовыми столбцами необходимо явное приведение:
SET SESSION "dynamic_parameter$min_age" = '18';
SELECT name
FROM persons
WHERE age >= CAST(dynamic_param('min_age') AS bigint);
Списковые динамические параметры#
Списковый параметр — именованный параметр, хранящий массив строк (array(varchar)). Используется для фильтрации строк по принадлежности к динамически задаваемому
множеству значений. Параметр устанавливается через SET SESSION с использованием префикса dynamic_parameters_list$.
Установка параметра:
SET SESSION "dynamic_parameters_list$<имя_параметра>" = ARRAY['значение1', 'значение2', ...];
Сброс параметра:
RESET SESSION "dynamic_parameters_list$<имя_параметра>";
Сброс уже удалённого параметра не вызывает ошибки (операция идемпотентна).
Просмотр активных параметров:
SHOW SESSION LIKE 'dynamic_parameters_list%';
- in_dynamic_param_list(value, name) boolean#
Проверяет, содержится ли
valueв списковом динамическом параметре с именемname.value— проверяемое значение (типvarchar). ЕслиvalueравноNULL, функция возвращаетNULL.name— имя параметра (типvarchar).
Возвращает:
true— если значение найдено в списке.false— если значение не найдено в списке.NULL— еслиvalueравноNULL.
Если параметр не установлен, функция завершается с ошибкой:
Dynamic session parameter list is not set: <name>Оптимизация: при планировании запроса оптимизатор автоматически преобразует вызов
in_dynamic_param_list(value, 'name')в выражениеvalue IN ('val1', 'val2', ...)с конкретными значениями из списка. Это позволяет движку эффективно использовать индексы и выполнять предикат на уровне коннектора (predicate pushdown).
Пример: фильтрация по списку
SET SESSION "dynamic_parameters_list$allowed_regions" = ARRAY['EU', 'US', 'APAC'];
SELECT order_id, region, amount
FROM orders
WHERE in_dynamic_param_list(region, 'allowed_regions');
Пример: отрицательная фильтрация
SET SESSION "dynamic_parameters_list$excluded_categories" = ARRAY['spam', 'test', 'internal'];
SELECT *
FROM events
WHERE NOT in_dynamic_param_list(category, 'excluded_categories');
Пример: динамическое представление со списковым параметром
CREATE VIEW approved_products AS
SELECT product_id, name, price
FROM products
WHERE in_dynamic_param_list(category, 'visible_categories');
-- Показать только электронику и мебель
SET SESSION "dynamic_parameters_list$visible_categories" = ARRAY['electronics', 'furniture'];
SELECT * FROM approved_products;
-- Изменить набор видимых категорий без пересоздания представления
SET SESSION "dynamic_parameters_list$visible_categories" = ARRAY['clothing', 'shoes'];
SELECT * FROM approved_products;
Совместное использование скалярных и списковых параметров#
Оба типа параметров можно использовать в одном запросе или представлении:
CREATE VIEW filtered_report AS
SELECT user_id, region, amount
FROM transactions
WHERE status = dynamic_param('target_status')
AND in_dynamic_param_list(region, 'allowed_regions');
SET SESSION "dynamic_parameter$target_status" = 'completed';
SET SESSION "dynamic_parameters_list$allowed_regions" = ARRAY['EU', 'US'];
SELECT * FROM filtered_report;