PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как search_path влияе върху разделителната способност на идентификатора и текущата схема

Какъв е пътят за търсене по схема search_path ?

Ръководството:

[...] таблиците често се споменават с неквалифицирани имена, които се състоят само от името на таблицата. Системата определя коя таблица се има предвид, като следва пътека за търсене, която е списък със схеми за разглеждане .

Удебелен акцент мой. Това обяснява разделителната способност на идентификатора .

„Текущата схема“ (или „схема по подразбиране“) според документацията е:

Първата схема, посочена в пътя за търсене се нарича текуща схема . Освен че е първата търсена схема, тя е и схемата, в която ще бъдат създадени нови таблици, ако CREATE TABLE командата не посочва име на схема.

Удебелен акцент мой. Системните схеми pg_temp (схема за временни обекти на текущата сесия) и pg_catalog автоматично са част от пътя за търсене и търсят първи , в този ред. Ръководството:

pg_catalog винаги е ефективно част от пътя за търсене. Ако не е наименувано изрично в пътя, тогава се търси имплицитно преди търсене в схемите на пътя. Това гарантира, че вградените имена винаги ще могат да бъдат намерени. Можете обаче изрично да поставите pg_catalog в края на вашия път за търсене, ако предпочитате да имате дефинирани от потребителя имена, които заместват вградени имена.

Удебелен акцент според оригинала. И pg_temp идва преди това, освен ако не е поставен в различна позиция.

Как да го настроя?

Има различни начини да зададете променливата по време на изпълнение search_path .

  1. Задайте клъстер -широко подразбиране за всички роли във всички бази данни в postgresql.conf (и презареждане). Внимавайте с това!

    search_path = 'blarg,public'
    

    Доставеното по подразбиране за тази настройка е:

    search_path = "$user",public
    

    Първият елемент указва, че трябва да се търси схема със същото име като текущия потребител. Ако не съществува такава схема, записът се игнорира.

  2. Задайте го по подразбиране за една база данни :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Задайте го по подразбиране за ролята с който се свързвате (ефективен в целия клъстер):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Или дори (често най-добре!) по подразбиране за роля в база данни :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Напишете командата в горната част на вашия скрипт. Или го изпълнете във вашата DB сесия :

    SET search_path = blarg,public;
    
  6. Задайте конкретен 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 е бил издаван за него през текущата сесия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да добавите автоматично увеличаващ се първичен ключ към съществуваща таблица в PostgreSQL?

  2. Транзакциите не работят за моята MySQL DB

  3. Escape SQL LIKE стойност за Postgres с psycopg2

  4. Защо не мога да изключа зависими колони от „GROUP BY“, когато агрегирам по ключ?

  5. Как да импортирам данни от CSV в таблица на Postgres с помощта на pgAdmin 3?