Какъв е пътят за търсене по схема search_path
?
Ръководството:
[...] таблиците често се споменават с неквалифицирани имена, които се състоят само от името на таблицата. Системата определя коя таблица се има предвид, като следва пътека за търсене, която е списък със схеми за разглеждане .
Удебелен акцент мой. Това обяснява разделителната способност на идентификатора .
„Текущата схема“ (или „схема по подразбиране“) според документацията е:
Първата схема, посочена в пътя за търсене се нарича текуща схема . Освен че е първата търсена схема, тя е и схемата, в която ще бъдат създадени нови таблици, ако
CREATE TABLE
командата не посочва име на схема.
Удебелен акцент мой. Системните схеми pg_temp
(схема за временни обекти на текущата сесия) и pg_catalog
автоматично са част от пътя за търсене и търсят първи , в този ред. Ръководството:
pg_catalog
винаги е ефективно част от пътя за търсене. Ако не е наименувано изрично в пътя, тогава се търси имплицитно преди търсене в схемите на пътя. Това гарантира, че вградените имена винаги ще могат да бъдат намерени. Можете обаче изрично да поставитеpg_catalog
в края на вашия път за търсене, ако предпочитате да имате дефинирани от потребителя имена, които заместват вградени имена.
Удебелен акцент според оригинала. И pg_temp
идва преди това, освен ако не е поставен в различна позиция.
Как да го настроя?
Има различни начини да зададете променливата по време на изпълнение search_path
.
-
Задайте клъстер -широко подразбиране за всички роли във всички бази данни в
postgresql.conf
(и презареждане). Внимавайте с това!search_path = 'blarg,public'
Доставеното по подразбиране за тази настройка е:
search_path = "$user",public
Първият елемент указва, че трябва да се търси схема със същото име като текущия потребител. Ако не съществува такава схема, записът се игнорира.
-
Задайте го по подразбиране за една база данни :
ALTER DATABASE test SET search_path = blarg,public;
-
Задайте го по подразбиране за ролята с който се свързвате (ефективен в целия клъстер):
ALTER ROLE foo SET search_path = blarg,public;
-
Или дори (често най-добре!) по подразбиране за роля в база данни :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
Напишете командата в горната част на вашия скрипт. Или го изпълнете във вашата DB сесия :
SET search_path = blarg,public;
-
Задайте конкретен
search_path
за обхвата на функцията (за да бъдете защитени от злонамерени потребители с достатъчно привилегии). Прочетете за писането наSECURITY DEFINER
Функции безопасно в ръководството.
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
По-голямото число в моя списък превъзхожда по-ниското.
Ръководството има още повече начини , като задаване на променливи на средата или използване на опции от командния ред.
За да видите текущата настройка:
SHOW search_path;
За да го нулирате:
RESET search_path;
Ръководството:
Стойността по подразбиране се дефинира като стойността, която би имал параметърът, ако няма
SET
е бил издаван за него през текущата сесия.