Comment le chemin de recherche de l'influence de résolution de l'identificateur et le "schéma actuel"
est-il possible de définir dans quel schéma les nouvelles tables sont créées par défaut? (Désigné par"noms de tableau non qualifiés".)
j'ai vu quelques détails sur l'utilisation du" Search path " dans Postgres, mais je pense qu'il ne fonctionne que tout en récupérant des données, pas créer.
j'ai un tas de scripts SQL, qui créent beaucoup de tables. Au lieu de modifier les scripts, je veux définir la base de données créer des tables dans un schéma spécifique par défaut - quand ils ont noms non qualifiés.
est-ce possible?
2 réponses
chemin de Recherche est en effet ce que vous voulez:
% create schema blarg;
% set search_path to blarg;
% create table foo (id int);
% \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
blarg | foo | table | pgsql
Quel est le chemin de recherche?
[...] les tableaux sont souvent désignés par des noms sans réserve, qui consistent de simplement le nom de la table. Le système détermine quelle table est visée par en suivant un chemin de recherche, qui est une liste de schémas à regarder dans .
le Gras c'est moi qui souligne. Ce explique identifier la résolution , et le "schéma actuel" est, par documentation:
Le premier schéma nommé dans le chemin de recherche est appelé actuel schéma . En plus d'être le premier schéma recherché, c'est aussi le schéma dans lequel de nouvelles tables seront créées si la commande
CREATE TABLE
ne spécifiez pas un nom du schéma.
le Gras c'est moi qui souligne. Les schémas du système pg_temp
(schéma pour objets temporaires de la session en cours) et pg_catalog
font automatiquement partie du chemin de recherche et sont recherchés premier , dans cet ordre. par documentation:
pg_catalog
fait toujours partie de la recherche chemin. Si elle n'est pas nommé explicitement dans le chemin, alors il est implicitement recherché avant rechercher le chemin d'accès de schémas. Cela garantit que les noms intégrés toujours être trouvable. Cependant, vous pouvez explicitement placerpg_catalog
à la fin de votre chemin de recherche si vous préférez un nom défini par l'utilisateur outrepasser les noms intégrés.
emphasis Bold as per original. Et pg_temp
vient avant que, à moins qu'il ne soit mis dans un la situation est différente.
comment le configurer?
vous avez différentes options pour réellement définir la variable runtime search_path
.
-
Définir un cluster de large par défaut pour tous les rôles dans toutes les bases de données
postgresql.conf
(et de le recharger). Attention!search_path = 'blarg,public'
le expédié par défaut pour ce paramètre est:
search_path = "$user",public
Le premier élément indique qu'un schéma avec le même nom que le l'utilisateur actuel doit être recherché. Si aucun schéma n'existe, l'entrée est ignorée.
-
défini comme valeur par défaut pour une base de données :
ALTER DATABASE test SET search_path = blarg,public;
-
Définir comme par défaut pour le rôle vous connecter avec (en vigueur à l'échelle de la grappe):
ALTER ROLE foo SET search_path = blarg,public;
-
, Ou encore (souvent les meilleures!) par défaut pour le rôle uniquement dans une base de données Donnée :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
écrivez la commande en haut de votre script (ou exécutez-la à n'importe quel moment dans votre session :
SET search_path = blarg,public;
-
définir un spécifique
search_path
pour le portée d'une fonction (pour être à l'abri des utilisateurs malveillants avec des privilèges suffisants). Lisez à propos de ÉcritSECURITY DEFINER
Fonctions de Sécurité dans le manuel.
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
nombre plus élevé dans ma liste que le nombre plus bas.
Le manuel a même plus de façons , comme définir des variables d'environnement ou utiliser des options en ligne de commande.
pour voir le réglage actuel:
SHOW search_path;
À reset :
RESET search_path;
La valeur par défaut est définie comme la valeur que le paramètre ont eu, si non
SET
n'ont jamais eu été publié dans la session en cours.