IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

CREATE VIEW

CREATE VIEW — Définir une vue

Synopsis

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW nom [ ( nom_colonne [, ...] ) ]
    [ WITH ( nom de l'option de vue [= valeur de l'option de vue] [, ... ] ) ]
    AS requête

Description

CREATE VIEW définit une vue d'après une requête. La vue n'est pas matérialisée physiquement. Au lieu de cela, la requête est lancée chaque fois qu'une vue est utilisée dans une requête.

CREATE OR REPLACE VIEW a la même finalité, mais si une vue du même nom existe déjà, elle est remplacée. La nouvelle requête doit générer les mêmes colonnes que celles de l'ancienne requête (c-est-à-dire les mêmes noms de colonnes dans le même ordre avec les mêmes types de données). Par contre, elle peut ajouter des colonnes supplémentaires en fin de liste. Les traitements qui donnent les colonnes en sortie pourraient être complètement différents.

Si un nom de schéma est donné (par exemple CREATE VIEW monschema.mavue ...), alors la vue est créée dans ce schéma. Dans le cas contraire, elle est créée dans le schéma courant. Les vues temporaires existent dans un schéma spécial. Il n'est donc pas nécessaire de fournir de schéma pour les vues temporaires. Le nom de la vue doit être différent du nom de toute autre vue, table, séquence, index ou table distante du même schéma.

Paramètres

TEMPORARY ou TEMP

La vue est temporaire. Les vues temporaires sont automatiquement supprimées en fin de session. Les relations permanentes qui portent le même nom ne sont plus visibles pour la session tant que la vue temporaire existe, sauf s'il y est fait référence avec le nom du schéma.

Si l'une des tables référencées par la vue est temporaire, la vue est alors elle-aussi temporaire (que TEMPORARY soit spécifié ou non).

RECURSIVE

Crée une vue récursive. La syntaxe

CREATE RECURSIVE VIEW nom (colonnes) AS SELECT ...;

est équivalente à

CREATE VIEW nom AS WITH RECURSIVE nom (colonnes) AS (SELECT ...) SELECT colonnes FROM name;

Une liste de colonne doit être spécifiée pour la vue récursive.

nom

Le nom de la vue à créer (éventuellement qualifié du nom du schéma).

nom de colonne

Une liste optionnelle de noms à utiliser pour les colonnes de la vue. Si elle n'est pas donnée, le nom des colonnes est déduit de la requête.

WITH ( nom de l'option de vue [= valeur de l'option] [, ... ] )

Cette clause spécifie des paramètres optionnels pour une vue. Actuellement le seul nom de paramètre supporté est security_barrier, qui doit être activé si une vue est censée fournir une sécurité au niveau de la ligne. Voir Section 38.5, « Règles et droits » pour plus de détails.

requête

Une commande SELECT(7) ou VALUES(7) qui fournira les colonnes et lignes de la vue.

Notes

L'instruction DROP VIEW(7) est utilisée pour supprimer les vues.

Il est important de s'assurer que le nom et le type des colonnes de la vue correspondent à ce qui est souhaité. Ainsi :

CREATE VIEW vista AS SELECT 'Hello World';

présente deux défauts majeurs : le nom de la colonne prend la valeur implicite ?column? et son type de données le type implicite unknown. Pour obtenir une chaîne de caractères dans le résultat de la vue, on peut écrire :

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

L'accès aux tables référencées dans la vue est déterminé par les droits du propriétaire de la vue. Dans certains cas, cela peut être utilisé pour fournir un accès sécurisé. Cependant, toutes les vues ne sont pas sécurisables ; voir Section 38.5, « Règles et droits » pour des détails. Les fonctions appelées dans la vue sont traitées de la même façon que si elles avaient été appelées directement dans la requête utilisant la vue. Du coup, l'utilisateur d'une vue doit avoir les droits pour appeler toutes les fonctions utilisées par la vue.

Quand CREATE OR REPLACE VIEW est utilisé sur une vue existante, seule la règle SELECT définissant la vue est modifiée. Les autres propriétés, comme les droits, le propriétaire et les règles autres que le SELECT, ne sont pas modifiées. Vous devez être le propriétaire de la vue pour la remplacer (ceci incluant aussi les membres du rôle propriétaire).

Vues modifiables

Les vues simples sont automatiquement modifiables : le système autorise l'utilisation des commandes INSERT, UPDATE et DELETE sur les vues comme sur les tables. Une vue est modifiable automatiquement si elle satisfait les conditions suivantes :

  • La vue doit avoir exactement une entrée (une table ou une autre vue modifiable) dans la liste FROM.

  • La défintion de la vue ne doit pas contenir de clauses WITH, DISTINCT, GROUP BY, HAVING, LIMIT ou OFFSET au niveau le plus haut.

  • La définition de la vue ne doit pas contenir d'opérations sur des ensembles (UNION, INTERSECT ou EXCEPT) au niveau le plus haut.

  • Toutes les colonnes dans la liste du SELECT de la vue doivent être des références simples aux colonnes de la relation sous-jacente. Elles ne peuvent pas être des expressions, litéraux ou fonctions. Les colonnes systèmes ne peuvent pas non plus être référencées.

  • Aucune colonne de la relation sous-jacente ne peut apparaître plus d'une vois dans la liste de sélection de la vue.

  • La vue ne doit pas avoir la propriété security_barrier.

Si la vue est modifiable automatiquement, le système convertira automatiquement toute commande INSERT, UPDATE ou DELETE sur la vue dans la commande correspondante sur la relation sous-jacente.

Si une vue modifiable automatiquement contient une condition WHERE, la condition restreint les lignes modifiables dans la relation de base par une commande UPDATE ou DELETE. Néanmoins, un UPDATE peut modifier une ligne qui ne satisfait plus la condition WHERE, et du coup qui n'est plus visible par la vue. De la même façon, une commande INSERT peut insérer des lignes dans la relation de base qui ne satisfont par la condition WHERE et qui, du coup, ne sont pas visibles via la vue.

Une vue plus complexe qui ne satisfait par toutes les conditions ci-dessus est par défaut en lecture seule : le système ne permettra ni insertion, ni mise à jour, ni suppression sur la vue. Vous pouvez obtenir le même effet qu'une vue modifiable en créant des triggers INSTEAD OF sur la vue. Ces triggers doivent convertir l'insertion, ... tentée sur la vue par l'action appropriée sur les autres tables. Pour plus d'informations, voir CREATE TRIGGER(7). Une autre possibilité revient à créer des règles (voir CREATE RULE(7)). Cependant, en pratique, les triggers sont plus simples à comprendre et à utiliser correctement.

Notez que l'utilisateur réalisant l'insertion, la mise à jour ou la suppression sur la vue doit avoir les droits correspondants sur la vue. De plus, le propriétaire de la vue doit avoir les droits correspondants sur les relations sous-jacentes mais l'utilisateur réalisant la mise à jour n'a pas besoin de droits sur les relations sous-jacentes (voir Section 38.5, « Règles et droits »).

Exemples

Créer une vue composée des comédies :

CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE genre = 'Comédie';

Cette requête crée une vue contenant les colonnes de la table film au moment de la création de la vue. Bien que l'étoile (*) soit utilisée pour créer la vue, les colonnes ajoutées par la suite à la table film ne feront pas partie de la vue.

Créer une vue récursive consistant en des nombres 1 à 100 :

CREATE RECURSIVE VIEW nums_1_100 (n) AS
    VALUES (1)
UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;

Compatibilité

Le standard SQL spécifie quelques possibilités supplémentaires pour l'instruction CREATE VIEW :

CREATE VIEW nom [ ( nom_colonne [, ...] ) ]
    AS requête
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

Les clauses optionnelles de la commande SQL complète sont :

CHECK OPTION

Cette option contrôle le comportement des vues automatiquement modifiables. Lorsqu'elle est utilisée, les commandes INSERT et UPDATE sur la vue seront vérifiées pour s'assurer que les nouvelles lignes satisfassent la condition de définition de la vue (autrement dit, les nouvelles lignes seront visibles via la vue). Si elles ne le sont pas, la mise à jour sera rejettée. Sans CHECK OPTION, les commandes INSERT et UPDATE sur la vue sont autorisées, y compris pour ajouter des lignes qui ne sont pas visibles avec la vue. (Ce dernier comportement est le seul actuellement fourni par PostgreSQL™.)

LOCAL

Contrôle d'intégrité de la vue.

CASCADED

Contrôle d'intégrité de la vue et de toutes les vues dépendantes. CASCADED est implicite si ni CASCADED ni LOCAL ne sont précisés.

CREATE OR REPLACE VIEW est une extension PostgreSQL™, tout comme le concept de vue temporaire. La clause WITH est aussi une extension.