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
.
-
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.
-
Ustaw jako domyślną dla jednej bazy danych :
ALTER DATABASE test SET search_path = blarg,public;
-
Ustaw jako domyślną dla roli łączysz się z (efektywnie w całym klastrze):
ALTER ROLE foo SET search_path = blarg,public;
-
Lub nawet (często najlepiej!) jako domyślne dla roli w bazie danych :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
Napisz polecenie na górze skryptu. Lub wykonaj go w swojej sesji bazy danych :
SET search_path = blarg,public;
-
Ustaw konkretną
search_path
dla zakresu funkcji (aby być bezpiecznym przed złośliwymi użytkownikami z wystarczającymi uprawnieniami). Przeczytaj o pisaniuSECURITY 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.