sql >> Databáze >  >> RDS >> PostgreSQL

Jak vyhledávací_cesta ovlivňuje rozlišení identifikátoru a aktuální schéma

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ístit pg_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 .

  1. 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.

  2. Nastavte jej jako výchozí pro jednu databázi :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Nastavte ji jako výchozí pro roli se připojujete (účinné v celém clusteru):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Nebo dokonce (často nejlepší!) jako výchozí pro role v databázi :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Napište příkaz v horní části skriptu. Nebo jej spusťte v relaci DB :

    SET search_path = blarg,public;
    
  6. 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.



  1. Vícenásobná zpožděná replikace Slave pro zotavení po havárii s nízkou RTO

  2. Vytvořte PostgreSQL ROLE (uživatel), pokud neexistuje

  3. Jak vrátit pole z Javy do PL/SQL?

  4. Techniky optimalizace dotazů v SQL Server:5 osvědčených postupů pro zvýšení výkonu dotazů