Использование search_path

Статья основана на двадцать первом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.

В данной статье подробно разбираются использование параметра search_path, ключевые моменты и рекомендации.

В прошлой статье разбираются транзакция в серверном программировании и ключевые моменты управления.

Презентация и исходники доступны по ссылке.

search_path

search_path в PostgreSQL — это параметр, который определяет порядок поиска схем для объектов (таблиц, функций, представлений и т.д.) при их использовании в SQL-запросах при указании неполного имени без схемы.

SHOW search_path;

Обычно: "$user", public

Но есть и скрытые схемы — pgcatalog, pgtemp

Может устанавливаться как на кластер, так и на конкретную сессию и даже транзакцию.

Рекомендация выпиливать public, а ещё лучше указывать полное имя объекта — схема.таблица

Итоги

Ключевые моменты search_path:

  • Определяет порядок поиска объектов по имени
  • Можно настраивать на уровне БД, пользователя, сессии
  • Важен для безопасности и предотвращения атак

Рекомендации:

  • Всегда явно указывайте схемы при создании объектов
  • Фиксируйте search_path в функциях
  • Убирайте public из search_path в production

Пример кода:

— неочидный кейс про search_path
\timing on
CREATE OR REPLACE FUNCTION f() RETURNS int AS ‘SELECT 0’ LANGUAGE SQL;
DO ‘BEGIN PERFORM f() FROM generate_series(1, 10_000_000); END’;
— Time: 3031.713 ms (00:03.032)

— добавляем search_path, отличный от системного и…

ALTER FUNCTION f SET search_path = a,b,c;

DO ‘BEGIN PERFORM f() FROM generate_series(1, 10_000_000); END’;

— Time: 18003.809 ms (00:18.004)

Рост в 6 раз…

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём SQL инъекции.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

1 × 4 =