Jaká je vyhledávací cesta schématu search_path
?
Manuál:
[...] tabulky jsou často označovány nekvalifikovanými názvy, které se skládají pouze z názvu tabulky. Systém určí, která tabulka je míněna sledováním vyhledávací cesty, což je seznam schémat, která je třeba hledat .
Odvážný důraz můj. To vysvětluje rozlišení identifikátoru .
„Aktuální schéma“ (nebo „výchozí schéma“) je podle dokumentace:
První schéma pojmenované ve vyhledávací cestě se nazývá aktuální schéma . Kromě toho, že jde o první prohledávané schéma, je to také schéma, ve kterém budou vytvořeny nové tabulky, pokud
CREATE TABLE
command neuvádí název schématu.
Odvážný důraz můj. Systémová schémata pg_temp
(schéma pro dočasné objekty aktuální relace) a pg_catalog
jsou automaticky součástí vyhledávací cesty a vyhledávají se nejprve , v tomto pořadí. Manuál:
pg_catalog
je vždy efektivně součástí vyhledávací cesty. Pokud není v cestě explicitně pojmenován, je implicitně prohledán před hledání schémat cesty. To zajišťuje, že vestavěná jména budou vždy k nalezení. Můžete však explicitně umístitpg_catalog
na konci vaší vyhledávací cesty, pokud dáváte přednost tomu, aby uživatelsky definovaná jména přepisovala vestavěné názvy.
Výrazný důraz jako u originálu. A pg_temp
je před tím, pokud není umístěn do jiné polohy.
Jak to nastavit?
Proměnnou runtime search_path
lze nastavit různými způsoby .
-
Nastavte klastr -wide výchozí pro všechny role ve všech databázích v
postgresql.conf
(a znovu načíst). S tím opatrně!search_path = 'blarg,public'
Výchozí nastavení pro toto nastavení je:
search_path = "$user",public
První prvek určuje, že se má prohledat schéma se stejným názvem jako aktuální uživatel. Pokud žádné takové schéma neexistuje, bude záznam ignorován.
-
Nastavte jej jako výchozí pro jednu databázi :
ALTER DATABASE test SET search_path = blarg,public;
-
Nastavte ji jako výchozí pro roli se připojujete (účinné v celém clusteru):
ALTER ROLE foo SET search_path = blarg,public;
-
Nebo dokonce (často nejlepší!) jako výchozí pro role v databázi :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
Napište příkaz v horní části skriptu. Nebo jej spusťte v relaci DB :
SET search_path = blarg,public;
-
Nastavte konkrétní
search_path
pro rozsah funkce (aby byla v bezpečí před uživateli se zlými úmysly s dostatečnými oprávněními). Přečtěte si o psaníSECURITY DEFINER
Funkce Bezpečně v návodu.
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
Vyšší číslo v mém seznamu předčí nižší číslo.
Příručka má ještě více způsobů , jako je nastavení proměnných prostředí nebo použití možností příkazového řádku.
Zobrazení aktuálního nastavení:
SHOW search_path;
Postup resetování:
RESET search_path;
Manuál:
Výchozí hodnota je definována jako hodnota, kterou by měl parametr, kdyby neexistoval
SET
kdy za něj v aktuální relaci byly vydány.