PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

W jaki sposób search_path wpływa na rozpoznawanie identyfikatora i bieżący schemat?

Jaka jest ścieżka wyszukiwania schematu search_path ?

Instrukcja:

[...] tabele są często określane niekwalifikowanymi nazwami, które składają się tylko z nazwy tabeli. System określa, o którą tabelę chodzi, podążając ścieżką wyszukiwania, która jest listą schematów do przeszukania .

Moje odważne podkreślenie. To wyjaśnia rozwiązywanie identyfikatorów .

„Obecny schemat” (lub „schemat domyślny”) to, zgodnie z dokumentacją:

Pierwszy schemat nazwany w ścieżce wyszukiwania nazywa się bieżącym schematem . Oprócz tego, że jest to pierwszy przeszukiwany schemat, jest to również schemat, w którym zostaną utworzone nowe tabele, jeśli CREATE TABLE polecenie nie określa nazwy schematu.

Moje odważne podkreślenie. Schematy systemu pg_temp (schemat dla tymczasowych obiektów bieżącej sesji) i pg_catalog są automatycznie częścią ścieżki wyszukiwania i wyszukiwane pierwsze , w tej kolejności. Instrukcja:

pg_catalog jest zawsze efektywnie częścią ścieżki wyszukiwania. Jeśli nie ma wyraźnej nazwy w ścieżce, jest przeszukiwany niejawnie przed przeszukiwanie schematów ścieżki. Gwarantuje to, że nazwy wbudowane będą zawsze możliwe do znalezienia. Możesz jednak jawnie umieścić pg_catalog na końcu ścieżki wyszukiwania, jeśli wolisz, aby nazwy zdefiniowane przez użytkownika zastępowały nazwy wbudowane.

Odważny nacisk jak w oryginale. I pg_temp pojawia się wcześniej, chyba że zostanie umieszczony w innej pozycji.

Jak to ustawić?

Istnieje wiele sposobów ustawienia zmiennej środowiska wykonawczego search_path .

  1. Ustaw klaster -wide domyślne dla wszystkich ról we wszystkich bazach danych w postgresql.conf (i przeładować). Ostrożnie!

    search_path = 'blarg,public'
    

    Domyślne ustawienie domyślne dla tego ustawienia to:

    search_path = "$user",public
    

    Pierwszy element określa, że ​​ma być przeszukiwany schemat o tej samej nazwie, co bieżący użytkownik. Jeśli taki schemat nie istnieje, wpis jest ignorowany.

  2. Ustaw jako domyślną dla jednej bazy danych :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Ustaw jako domyślną dla roli łączysz się z (efektywnie w całym klastrze):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Lub nawet (często najlepiej!) jako domyślne dla roli w bazie danych :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Napisz polecenie na górze skryptu. Lub wykonaj go w swojej sesji bazy danych :

    SET search_path = blarg,public;
    
  6. Ustaw konkretną search_path dla zakresu funkcji (aby być bezpiecznym przed złośliwymi użytkownikami z wystarczającymi uprawnieniami). Przeczytaj o pisaniu SECURITY DEFINER Funkcje Bezpiecznie w instrukcji.

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

Wyższa liczba na mojej liście przewyższa liczbę niższą.
Instrukcja ma jeszcze więcej sposobów , jak ustawianie zmiennych środowiskowych lub używanie opcji wiersza poleceń.

Aby zobaczyć aktualne ustawienie:

SHOW search_path;

Aby go zresetować:

RESET search_path;

Instrukcja:

Wartość domyślna jest zdefiniowana jako wartość, którą miałby parametr, gdyby nie SET został kiedykolwiek wydany dla niego w bieżącej sesji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przełączanie awaryjne replikacji PostgreSQL 101

  2. Jak rozumieć ANALIZĘ WYJAŚNIJ

  3. Importowanie spakowanego pliku CSV do PostgreSQL

  4. Jak połączyć aktywnych użytkowników z bazą danych postgreSQL przez SQL?

  5. Klient psql może być teraz szachownicą…