CREATE VIEW (instruction)

L'instruction CREATE VIEW définit une vue sur une ou plusieurs tables, vues ou pseudonymes.

Invocation

Cette instruction peut être imbriquée dans un programme d'application ou émise via l'utilisation d'instructions SQL dynamiques. Il s'agit d'une instruction exécutable qui peut être préparée dynamiquement uniquement si le comportement d'exécution DYNAMICRULES est en vigueur pour le package (SQLSTATE 42509).

Autorisation

Les privilèges détenus par l'ID autorisation de l'instruction doivent inclure au moins l'un des droits suivants:
  • Droit IMPLICIT_SCHEMA sur la base de données, si le nom de schéma implicite ou explicite de la vue n'existe pas
  • Privilège CREATEIN sur le schéma, si le nom de schéma de la vue fait référence à un schéma existant.
  • Droit SCHEMAADM sur le schéma, si le nom de schéma de la vue fait référence à un schéma existant
  • Droits d'accès DBADM
et au moins un des droits suivants pour chaque table, vue ou pseudonyme identifié dans une instruction FULLSELECT:
  • Privilège CONTROL sur cette table, cette vue ou ce pseudonyme
  • Privilège SELECT sur cette table, cette vue ou ce pseudonyme
  • privilège SELECTIN sur le schéma contenant la table, la vue ou le pseudonyme
  • Droits DATAACCESS sur le schéma contenant la table, la vue ou le pseudonyme
  • Droits d'accès DATAACCESS
Si vous créez une sous-vue:
  • L'ID autorisation de l'instruction doit être identique au définisseur de la table racine de la hiérarchie de la table, ou
  • Les privilèges détenus par l'ID autorisation doivent inclure les droits SCHEMAADM sur le schéma contenant la table racine de la hiérarchie de la table
  • Les privilèges détenus par l'ID autorisation doivent inclure les droits DBADM
et
  • L'ID autorisation de l'instruction doit disposer du privilège SELECT WITH GRANT sur la table sous-jacente de la sous-vue, ou le privilège SELECT ne doit pas être octroyé à un utilisateur autre que le créateur de la vue, ou
  • Les droits ACCESSCTRL sur la base de données ou ACCESSCTRL sur le schéma contenant la table sous-jacente de la sous-vue, ainsi que l'un des droits suivants:
    • Privilège SELECT sur la table sous-jacente de la sous-vue
    • Privilège SELECTIN sur le schéma contenant la table sous-jacente de la sous-vue
    • droits DATAACCESS sur le schéma contenant la table sous-jacente de la sous-vue
    • Droits d'accès DATAACCESS
Si WITH ROW MO??? est spécifié, les privilèges détenus par l'ID autorisation de l'instruction doivent inclure au moins l'un des droits suivants:
  • Privilège UPDATE sur cette table ou cette vue
  • privilège UPDATEIN sur le schéma contenant cette table ou cette vue
  • droit DATAACCESS sur le schéma contenant cette table ou cette vue
  • Droits d'accès DATAACCESS

Les privilèges de groupe ne sont pas pris en compte pour une table ou une vue spécifiée dans l'instruction CREATE VIEW.

Les privilèges ne sont pas pris en compte lors de la définition d'une vue sur un pseudonyme de base de données fédérée. Les autorisations requises pour la source de données de la table ou de la vue référencée par le pseudonyme sont appliquées lors du traitement de la requête. L'ID d'autorisation de l'instruction peut être mappé à un autre ID d'autorisation distant.

Pour remplacer une vue existante, l'ID autorisation de l'instruction doit être le propriétaire de la vue existante (SQLSTATE 42501).

Syntaxe

Read syntax diagramSkip visual syntax diagramCREATEOR REPLACE VIEWview-name(,column-name)OFtype-nameroot-view-definitionsubview-definitionAS WITH,common-table-expression fullselect WITHCASCADEDLOCALCHECK OPTIONWITH NO ROW MOVEMENTWITH ROW MOVEMENT
root-view-definition
Read syntax diagramSkip visual syntax diagramMODE DB2SQL(oid-column ,with-options )
subview-definition
Read syntax diagramSkip visual syntax diagramMODE DB2SQLunder-clause (with-options)EXTEND
oid-column
Read syntax diagramSkip visual syntax diagramREF ISoid-column-nameUSER GENERATED UNCHECKED
with-options
Read syntax diagramSkip visual syntax diagram,column-nameWITH OPTIONS,SCOPEtyped-table-nametyped-view-nameREAD ONLY
under-clause
Read syntax diagramSkip visual syntax diagramUNDERsuperview-nameINHERIT SELECT PRIVILEGES

Description

OU REPLACE
Indique que la définition de la vue doit être remplacée s'il en existe une sur le serveur en cours. La définition existante est effectivement supprimée avant le remplacement de la nouvelle définition dans le catalogue, à l'exception du fait que les privilèges qui ont été octroyés sur la vue ne sont pas affectés. Cette option est ignorée si une définition de la vue n'existe pas sur le serveur en cours. Cette option ne peut être spécifiée que par le propriétaire de l'objet.
nom-vue
Nomme la vue. Le nom, y compris le qualificateur implicite ou explicite, ne doit pas identifier une table, une vue, un pseudonyme ou un alias décrit dans le catalogue. Le qualificateur ne doit pas être SYSIBM, SYSCAT, SYSFUN ou SYSSTAT (SQLSTATE 42939).

Le nom peut être identique à celui d'une vue inopérante (voir Vues inopérantes). Dans ce cas, la nouvelle vue spécifiée dans l'instruction CREATE VIEW remplace la vue inopérante. L'utilisateur obtient un avertissement (SQLSTATE 01595) lorsqu'une vue inopérante est remplacée. Aucun avertissement n'est renvoyé si l'application a été liée avec l'option de liaison SQLWARN définie sur NO.

nom-colonne
Nomme les colonnes de la vue. Si une liste de noms de colonne est spécifiée, elle doit contenir autant de noms qu'il existe de colonnes dans la table de résultats de l'instruction fullselect. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonne n'est spécifiée, les colonnes de la vue héritent des noms des colonnes de la table de résultats de l'instruction FULLSELECT.

Une liste de noms de colonne doit être spécifiée si la table de résultats de l'instruction FULLSELECT comporte des noms de colonne en double ou une colonne sans nom (SQLSTATE 42908). Une colonne sans nom est une colonne dérivée d'une constante, d'une fonction, d'une expression ou d'une opération d'ensemble qui n'est pas nommée à l'aide de la clause AS de la liste de sélection.

OF nom-type
Indique que les colonnes de la vue sont basées sur les attributs du type structuré identifié par type-name. Si type-name est spécifié sans nom de schéma, le nom de type est résolu en recherchant les schémas dans le chemin SQL (défini par l'option de prétraitement FUNCPATH pour SQL statique et par le registre CURRENT PATH pour SQL dynamique). Le nom de type doit être le nom d'un type défini par l'utilisateur existant (SQLSTATE 42704) et il doit s'agir d'un type structuré instanciable (SQLSTATE 428DP).
MODE DB2SQL
Cette clause permet de spécifier le mode de la vue typée. Il s'agit du seul mode valide actuellement pris en charge.
SOUS nom-supervue
Indique que la vue est une sous-vue de superview-name. La supervue doit être une vue existante (SQLSTATE 42704) et la vue doit être définie à l'aide d'un type structuré qui est le supertype immédiat de type-name (SQLSTATE 428DB). Les noms de schéma view-name et superview-name doivent être identiques (SQLSTATE 428DQ). La vue identifiée par superview-name ne doit pas avoir de sous-vue existante déjà définie à l'aide de type-name (SQLSTATE 42742).

Les colonnes de la vue incluent la colonne d'identificateur d'objet de la supervue dont le type a été modifié en REF (type-name), suivie de colonnes basées sur les attributs de type-name (n'oubliez pas que le type inclut les attributs de son supertype).

INHERIT SELECT PRIVILEGES
Tout utilisateur ou groupe détenant un privilège SELECT sur la supervue se voit accorder un privilège équivalent sur la sous-vue nouvellement créée. Le définisseur de sous-vue est considéré comme le donateur de ce privilège.
colonne-OID
Définit la colonne d'identificateur d'objet pour la vue typée.
REF IS OID-column-name USER GENERATED
Indique qu'une colonne d'ID objet (OID) est définie dans la vue en tant que première colonne. Un ID objet est requis pour la vue racine d'une hiérarchie de vues (SQLSTATE 428DX). La vue doit être une vue typée (la clause OF doit être présente) qui n'est pas une sous-vue (SQLSTATE 42613). Le nom de la colonne est défini comme OID-column-name et ne peut pas être identique au nom d'un attribut du type structuré type-name (SQLSTATE 42711). La première colonne spécifiée dans fullselect doit être de type REF (type-name) (vous devrez peut-être la transtyper pour qu'elle ait le type approprié). Si UNCHECKED n'est pas spécifié, il doit être basé sur une colonne ne pouvant pas être associée à une valeur NULL sur laquelle l'unicité est appliquée via un index (clé primaire, contrainte d'unicité, index à entrées uniques ou OID-column). Cette colonne est appelée colonne d'identificateur d'objet ou colonne d'ID objet. Les mots clés USER GENERATED indiquent que la valeur initiale de la colonne OID doit être fournie par l'utilisateur lors de l'insertion d'une ligne. Une fois qu'une ligne est insérée, la colonne OID ne peut pas être mise à jour (SQLSTATE 42808).
désélectionné
Définit la colonne d'identificateur d'objet de la définition de la vue typée pour supposer l'unicité même si le système ne peut pas prouver cette unicité. Elle est destinée à être utilisée avec des tables ou des vues définies dans une hiérarchie de vues basées sur un type structuré dans laquelle l'utilisateur sait que les données sont conformes à cette règle d'unicité, mais ne sont pas conformes aux règles qui permettent au système de prouver l'unicité. L'option UNCHECKED est obligatoire pour les hiérarchies de vues qui s'étend sur plusieurs hiérarchies ou sur des tables ou des vues existantes. En spécifiant UNCHECKED, l'utilisateur prend la responsabilité de s'assurer que chaque ligne de la vue possède un ID objet unique. Si l'utilisateur ne parvient pas à vérifier cette propriété et qu'une vue contient des valeurs d'ID objet en double, une expression de chemin ou un opérateur DEREF impliquant l'une des valeurs d'ID objet non uniques peut entraîner une erreur (SQLSTATE 21000).
with-options
Définit des options supplémentaires qui s'appliquent aux colonnes d'une vue typée.
nom-colonne WITH OPTIONS
Indique le nom de la colonne pour laquelle des options supplémentaires sont spécifiées. Le nom-colonne doit correspondre au nom d'un attribut défini dans (non hérité par) le nom-type de la vue. La colonne doit être un type de référence (SQLSTATE 42842). Elle ne peut pas correspondre à une colonne qui existe également dans la supervue (SQLSTATE 428DJ). Un nom de colonne ne peut apparaître que dans une seule clause WITH OPTIONS SCOPE de l'instruction (SQLSTATE 42613).
SCOPE
Identifie la portée de la colonne de type de référence. Une portée doit être spécifiée pour toute colonne destinée à être utilisée comme opérande de gauche d'un opérateur de déréférencement ou comme argument de la fonction DEREF.

La spécification de la portée d'une colonne de type de référence peut être différée à une instruction ALTER VIEW ultérieure (si la portée n'est pas héritée) pour permettre la définition de la table ou de la vue cible, généralement dans le cas de vues et de tables faisant référence entre elles. Si aucune portée n'est spécifiée pour une colonne de type de référence de la vue et que la table ou la colonne de vue sous-jacente a été sectorisée, la portée de la colonne sous-jacente est héritée par la colonne de type de référence. La colonne reste non sectorisée si la colonne de table ou de vue sous-jacente n'avait pas de portée. Pour plus d'informations sur les colonnes de portée et de type de référence, voir Remarques .

typed-table-name
Nom d'une table basée sur un type structuré. La table doit déjà exister ou être identique au nom de la table en cours de création (SQLSTATE 42704). Les données de type column-name doivent être REF(S), où S est le type de typed-table-name (SQLSTATE 428DM). Aucune vérification n'est effectuée sur les valeurs existantes dans nom-colonne pour s'assurer que les valeurs font réellement référence à des lignes existantes dans nom-table.
typed-view-name
Nom d'une vue basée sur un type structuré La vue doit déjà exister ou être identique au nom de la vue en cours de création (SQLSTATE 42704). Les données de type column-name doivent être REF(S), où S est le type de typed-table-name (SQLSTATE 428DM). Aucune vérification n'est effectuée sur les valeurs existantes dans nom-colonne pour s'assurer que les valeurs font réellement référence à des lignes existantes dans nom-vue.
Lecture seule
Identifie la colonne en tant que colonne en lecture seule. Cette option est utilisée pour forcer une colonne à être en lecture seule afin que les définitions de sous-vue puissent spécifier une expression pour la même colonne qui est implicitement en lecture seule.
système autonome
Identifie la définition de la vue.
WITH expression-table-commune
Définit une expression de table commune à utiliser avec l'instruction FULLSELECT qui suit. Une expression de table commune ne peut pas être spécifiée lors de la définition d'une vue basée sur un type structuré.
fullselect
Définit la vue. A tout moment, la vue est constituée des lignes qui résulteraient de l'exécution de l'instruction SELECT. Le type de données des colonnes de la vue ne peut pas être un type distinct avec des contraintes de type de données, un type de tableau, un type de curseur ou un type de ligne. L'instruction FULLSELECT ne doit pas faire référence à des variables hôte, à des marqueurs de paramètre ou à des tables temporaires déclarées. Toutefois, une vue paramétrée peut être créée en tant que fonction de table SQL. L'instruction FULLSELECT ne peut pas inclure d'instruction de modification de données SQL dans la clause FROM (SQLSTATE 428FL). L'instruction FULLSELECT ne peut pas non plus faire référence à une table externe transitoire (SQLSTATE 428I).

Si une vue est créée à l'aide d'une instruction'SELECT *', elle n'est pas mise à jour lorsqu'une nouvelle colonne est ajoutée à la table de base.

Pour les vues typées et les sous-vues: L'instruction fullselect doit respecter les règles suivantes, sinon une erreur est renvoyée (SQLSTATE 428EA sauf indication contraire).
  • L'instruction FULLSELECT ne doit pas inclure de références aux fonctions DBPARTITIONNUM ou HASHEDVALUE, aux fonctions non déterministes ou aux fonctions définies pour avoir une action externe.
  • Le corps de la vue doit être constitué d'une sous-requête unique ou d'une sous-requête UNION ALL d'au moins deux sous-requêtes. Que chaque sous-requête participant directement au corps de la vue soit appelée branche de la vue. Une vue peut comporter une ou plusieurs branches.
  • La clause FROM de chaque branche doit être constituée d'une table ou d'une vue unique (pas nécessairement typée), appelée table ou vue sous-jacente de cette branche.
  • La table ou la vue sous-jacente de chaque branche doit se trouver dans une hiérarchie distincte (c'est-à-dire qu'une vue ne peut pas avoir plusieurs branches avec leurs tables ou vues sous-jacentes dans la même hiérarchie).
  • Aucune des branches d'une définition de vue typée ne peut indiquer GROUP BY ou HAVING.
  • Si le corps de la vue contient UNION ALL, la vue racine de la hiérarchie doit spécifier l'option UNCHECKED pour sa colonne OID.
Pour une hiérarchie de vues et de sous-vues: que BR1 et BR2 soient toutes les branches qui apparaissent dans les définitions des vues de la hiérarchie. Soit T1 la table ou la vue sous-jacente de BR1, et T2 la table ou la vue sous-jacente de BR2. Ensuite :
  • Si T1 et T2 ne se trouvent pas dans la même hiérarchie, la vue racine dans la hiérarchie de vue doit spécifier l'option UNCHECKED pour sa colonne OID.
  • Si T1 et T2 se trouvent dans la même hiérarchie, BR1 et BR2 doivent contenir des prédicats ou des clauses ONLY suffisants pour garantir la disjonction de leurs ensembles de lignes.
Pour les sous-vues typées définies à l'aide de EXTEND AS: pour chaque branche du corps de la sous-vue:
  • La table sous-jacente de chaque branche doit être une sous-table (pas nécessairement correcte) d'une table sous-jacente de la supervue immédiate.
  • Les expressions de la liste SELECT doivent pouvoir être affectées aux colonnes non héritées de la sous-vue (SQLSTATE 42854).
Pour les sous-vues typées définies à l'aide de AS sans EXTEND:
  • Pour chaque branche du corps de la sous-vue, les expressions de la liste SELECT doivent pouvoir être affectées aux types déclarés des colonnes héritées et non héritées de la sous-vue (SQLSTATE 42854).
  • L'expression-OID de chaque branche sur une hiérarchie donnée dans la sous-vue doit être équivalente (sauf pour le transtypage) à l'expression-OID dans la branche sur la même hiérarchie dans la vue racine.
  • L'expression d'une colonne non définie (implicitement ou explicitement) comme EN LECTURE SEULE dans une supervue doit être équivalente dans toutes les branches de la même hiérarchie sous-jacente dans ses sous-vues.
AVEC OPTION DE CONTROLE
Spécifie la contrainte selon laquelle chaque ligne insérée ou mise à jour via la vue doit être conforme à la définition de la vue. Une ligne qui n'est pas conforme à la définition de la vue est une ligne qui ne répond pas aux conditions de recherche de la vue.
WITH CHECK OPTION ne doit pas être spécifié si l'une des conditions suivantes est vérifiée:
  • La vue est en lecture seule (SQLSTATE 42813). Si WITH CHECK OPTION est indiqué pour une vue pouvant être mise à jour qui n'autorise pas les insertions, la contrainte s'applique uniquement aux mises à jour.
  • La vue fait référence à la fonction DBPARTITIONNUM ou HASHEDVALUE, à une fonction non déterministe ou à une fonction avec action externe (SQLSTATE 42997).
  • Un pseudonyme est la cible de mise à jour de la vue.
  • Une vue sur laquelle est défini un déclencheur INSTEAD OF est la cible de mise à jour de la vue (SQLSTATE 428FQ).
Si l'option WITH CHECK OPTION est omise, la définition de la vue n'est pas utilisée dans la vérification des opérations d'insertion ou de mise à jour qui utilisent la vue. Certaines vérifications peuvent encore se produire lors des opérations d'insertion ou de mise à jour si la vue dépend directement ou indirectement d'une autre vue qui inclut WITH CHECK OPTION. Etant donné que la définition de la vue n'est pas utilisée, des lignes peuvent être insérées ou mises à jour via la vue qui ne sont pas conformes à la définition de la vue.
CASCADED
La contrainte WITH CASCADED CHECK OPTION sur une vue V signifie que V hérite des conditions de recherche en tant que contraintes de toute vue pouvant être mis à jour dont dépend V . De plus, chaque vue pouvant être mise à jour qui dépend de V est également soumise à ces contraintes. Ainsi, les conditions de recherche de V et de chaque vue dont dépend V sont associées par AND pour former une contrainte qui est appliquée pour une insertion ou une mise à jour de V ou d'une vue dépendant de V.
LOCAL
La contrainte WITH LOCAL CHECK OPTION sur une vue V signifie que la condition de recherche de V est appliquée en tant que contrainte pour une insertion ou une mise à jour de V ou de toute vue dépendante de V.
La différence entre CASCADED et LOCAL est illustrée dans l'exemple suivant. Prenez en compte les vues pouvant être mises à jour suivantes (en remplaçant Y par les en-têtes de colonne de la table ci-dessous):
   V1 defined on table T
   V2 defined on V1 WITH Y CHECK OPTION
   V3 defined on V2
   V4 defined on V3 WITH Y CHECK OPTION
   V5 defined on V4
Le tableau suivant présente les conditions de recherche par rapport auxquelles les lignes insérées ou mises à jour sont vérifiées:
  Y est LOCAL Y est CASCADED
V1 vérifié par rapport à: aucune vue aucune vue
V2 vérifiée par rapport à: V2 V2, V1
V3 vérifié par rapport à: V2 V2, V1
V4 vérifiée par rapport à: V2, V4 V4, V3, V2, V1
V5 vérifiée par rapport à: V2, V4 V4, V3, V2, V1
Examinez la vue pouvant être mise à jour suivante qui montre l'impact de l'option WITH CHECK OPTION à l'aide de l'option CASCADED par défaut:
   CREATE VIEW V1 AS SELECT COL1 FROM T1 WHERE COL1 > 10

   CREATE VIEW V2 AS SELECT COL1 FROM V1 WITH CHECK OPTION

   CREATE VIEW V3 AS SELECT COL1 FROM V2 WHERE COL1 < 100
L'instruction INSERT suivante à l'aide de V1 réussira car V1 ne possède pas d'option WITH CHECK OPTION et V1 ne dépend d'aucune autre vue ayant une option WITH CHECK OPTION.
   INSERT INTO V1 VALUES(5)
L'instruction INSERT suivante à l'aide de V2 génère une erreur car V2 a une option WITH CHECK OPTION et l'insertion génère une ligne qui n'est pas conforme à la définition de V2.
   INSERT INTO V2 VALUES(5)
L'instruction INSERT suivante à l'aide de V3 génère une erreur même si elle ne comporte pas l'option WITH CHECK OPTION car V3 dépend de V2 qui possède une clause WITH CHECK OPTION (SQLSTATE 44000).
   INSERT INTO V3 VALUES(5)
L'instruction INSERT suivante utilisant V3 aboutit même si elle n'est pas conforme à la définition de V3 (V3 ne possède pas d'option WITH CHECK OPTION) ; elle est conforme à la définition de V2 qui possède une option WITH CHECK OPTION.
   INSERT INTO V3 VALUES(200)
AVEC PAS DE MOUVEMENT DE LIGNE ou AVEC MOUVEMENT DE LIGNE
Indique l'action à effectuer pour une vue UNION ALL pouvant être mise à jour lorsqu'une ligne est mise à jour d'une manière qui enfreint une contrainte de vérification sur la table sous-jacente. La valeur par défaut est WITH NO ROW MOATION.
AVEC PAS DE MOUVEMENT DE LA LIGNE
Indique qu'une erreur (SQLSTATE 23513) doit être renvoyée si une ligne est mise à jour d'une manière qui enfreint une contrainte de vérification sur la table sous-jacente.
AVEC LE MOUVEMENT DE LA LIGNE
Indique qu'une ligne mise à jour doit être déplacée vers la table sous-jacente appropriée, même si elle ne respecte pas une contrainte de vérification sur cette table.

Le déplacement de ligne implique la suppression des lignes qui ne respectent pas la contrainte de vérification, et l'insertion de ces lignes dans la vue. La clause WITH ROW MO??? ne peut être spécifiée que pour les vues UNION ALL dont les colonnes sont toutes pouvant être mises à jour (SQLSTATE 429BJ). Si une ligne est insérée (peut-être après l'activation du déclencheur) dans la même table sous-jacente à partir de laquelle elle a été supprimée, une erreur est renvoyée (SQLSTATE 23524). Une vue définie à l'aide de la clause WITH ROW MOVEMENT ne doit pas contenir d'opérations UNION ALL imbriquées, sauf dans l'instruction fullselect la plus externe (SQLSTATE 429BJ). Une vue définie à l'aide de la clause WITH ROW MO???, ne peut pas contenir de références à une table temporelle de période système, à une table temporelle de période d'application ou à une table bitemporale.

Remarques

  • La création d'une vue avec un nom de schéma qui n'existe pas déjà entraîne la création implicite de ce schéma à condition que l'ID d'autorisation de l'instruction ait le droit IMPLICIT_SCHEMA. Le propriétaire du schéma est SYSIBM. Le privilège CREATEIN sur le schéma est accordé à PUBLIC.
  • Les colonnes de vue héritent de l'attribut NOT NULL WITH DEFAULT de la table de base ou de la vue, sauf lorsque les colonnes sont dérivées d'une expression. Lorsqu'une ligne est insérée ou mise à jour dans une vue pouvant être mise à jour, elle est vérifiée par rapport aux contraintes (clé primaire, intégrité référentielle et vérification) si elles sont définies dans la table de base.
  • Une nouvelle vue ne peut pas être créée si elle utilise une vue inopérante dans sa définition. (SQLSTATE 51024).
  • Si un objet référencé dans le corps de la vue n'existe pas ou est marqué comme non valide, ou si le définisseur ne dispose temporairement pas des droits permettant d'accéder à l'objet, et si le paramètre de configuration de base de données auto_reval est défini sur DEFERRED_FORCE, la création de la vue aboutit. La vue sera marquée comme non valide et sera revalidée lors de sa prochaine référence.
  • Cette instruction ne prend pas en charge les tables temporaires déclarées (SQLSTATE 42995).
  • Vues basées sur des tables organisées par colonnes :
    • La création d'une vue basée sur un type structuré sur des tables organisées par colonnes n'est pas prise en charge.
    • La clause WITH CHECK OPTION ne peut pas être spécifiée si une table organisée par colonnes fait partie de la définition de la vue.
  • Vues pouvant être supprimées: Une vue est supprimable si un déclencheur INSTEAD OF de l'opération de suppression a été défini pour la vue ou si toutes les conditions suivantes sont remplies:
    • Chaque clause FROM de l'instruction FULLSELECT externe identifie une seule table de base (sans clause OUTER), une vue supprimable (sans clause OUTER), une expression de table imbriquée supprimable ou une expression de table commune supprimable (impossible d'identifier un pseudonyme). En outre, toute spécification de période spécifiée pour la table de base ou la vue supprimable ne fait pas référence à la période SYSTEM_TIME.
    • L'instruction FULLSELECT externe n'inclut pas de clause VALUES
    • L'instruction FULLSELECT externe n'inclut pas de clause GROUP BY ni de clause HAVING
    • L'instruction FULLSELECT externe n'inclut pas de fonctions d'agrégation dans la liste de sélection
    • L'instruction FULLSELECT externe n'inclut pas les opérations SET (UNION, EXCEPT ou INTERSECT) à l'exception de UNION ALL
    • Les tables de base dans les opérandes d'une table UNION ALL ne doivent pas être identiques et chaque opérande doit être supprimable
    • La liste de sélection de l'instruction FULLSELECT externe n'inclut pas DISTINCT
  • Vues pouvant être mises à jour: Une colonne d'une vue est pouvant être mise à jour si un déclencheur INSTEAD OF de l'opération de mise à jour a été défini pour la vue ou si toutes les conditions suivantes sont remplies:
    • La vue est supprimable (indépendamment d'un déclencheur INSTEAD OF pour suppression), la colonne est résolue en une colonne d'une table de base (n'utilisant pas d'opération de déréférencement) et l'option READ ONLY n'est pas spécifiée
    • Toutes les colonnes correspondantes des opérandes d'un UNION ALL ont des types de données correspondant exactement (y compris la longueur ou la précision et l'échelle) et des valeurs par défaut correspondantes si l'instruction FULLSELECT de la vue inclut un UNION ALL

    Une vue peut être mise à jour si une colonne de la vue peut être mise à jour.

  • Vues insérables: une vue est insérable si un déclencheur INSTEAD OF pour l'opération d'insertion a été défini pour la vue, ou si au moins une colonne de la vue est insérable (indépendamment d'un déclencheur INSTEAD OF pour la mise à jour), et que l'instruction FULLSELECT de la vue n'inclut pas UNION ALL.

    Une ligne donnée peut être insérée dans une vue (y compris UNION ALL) si, et seulement si, elle remplit les contraintes de vérification d'une seule des tables de base sous-jacentes.

    Pour effectuer une insertion dans une vue qui inclut des colonnes non pouvant être mises à jour, ces colonnes doivent être omises de la liste des colonnes.

  • Vues en lecture seule: une vue est en lecture seule si elle n'est pas supprimable, modifiable ou insérable.

    Colonne READONLY dans SYSCAT.VIEWS indique si une vue est en lecture seule sans tenir compte des spécifications de période ou des déclencheurs INSTEAD OF.

  • Les expressions de table communes et les expressions de table imbriquées suivent le même ensemble de règles pour déterminer si elles sont supprimables, pouvant être mises à jour, insérables ou en lecture seule.
  • Registres spéciaux pour la prise en charge temporelle: Les valeurs des registres spéciaux CURRENT TEMPORAL SYSTEM_TIME et CURRENT TEMPORAL BUSINESS_TIME n'ont aucun impact sur l'expression de requête qui définit une vue lors de sa définition. Lorsqu'une vue est utilisée dans une instruction SQL, les valeurs des registres spéciaux CURRENT TEMPORAL SYSTEM_TIME et CURRENT TEMPORAL BUSINESS_TIME pour la session qui traite l'instruction SQL sont appliquées à la vue.
  • Vues inopérantes: Une vue inopérante est une vue qui n'est plus disponible pour les instructions SQL. Une vue devient inopérante si:
    • Un privilège, dont dépend la définition de vue, est révoqué.
    • Un objet, tel qu'une table, un pseudonyme, un alias ou une fonction, dont dépend la définition de la vue, est supprimé.
    • Une vue, dont dépend la définition de vue, devient inopérante.
    • Une vue qui est la supervue de la définition de vue (la sous-vue) devient inopérante.

    En termes pratiques, une vue inopérante est une vue dans laquelle la définition de la vue a été involontairement supprimée. Par exemple, lorsqu'un alias est supprimé, toute vue définie à l'aide de cet alias est rendue inopérante. Toutes les vues dépendantes deviennent également inopérantes et les packages dépendant de la vue ne sont plus valides.

    Tant que la vue inopérante n'est pas explicitement recréée ou supprimée, une instruction utilisant cette vue inopérante ne peut pas être compilée (SQLSTATE 51024) à l'exception des instructions CREATE ALIAS, CREATE VIEW, DROP VIEW et COMMENT ON TABLE. Tant que la vue inopérante n'a pas été explicitement supprimée, son nom qualifié ne peut pas être utilisé pour créer une autre table ou un autre alias (SQLSTATE 42710).

    Une vue inopérante peut être recréée en émettant une instruction CREATE VIEW à l'aide du texte de définition de la vue inopérante. Ce texte de définition de vue est stocké dans la colonne TEXT de SYSCAT.VIEWS . Lors de la recréation d'une vue inopérante, il est nécessaire d'accorder explicitement les privilèges requis sur cette vue par d'autres utilisateurs, en raison du fait que tous les enregistrements d'autorisation d'une vue sont supprimés si la vue est marquée comme inopérante. Notez qu'il n'est pas nécessaire de supprimer explicitement la vue inopérante pour la recréer. L'émission d'une instruction CREATE VIEW avec le même nom-vue qu'une vue inopérante entraîne le remplacement de cette vue inopérante et l'instruction CREATE VIEW renvoie un avertissement (SQLSTATE 01595).

    Les vues inopérantes sont indiquées par un X dans la colonne VALID de SYSCAT.VIEWS et un X dans la colonne STATUS de la table SYSCAT SYSCAT.TABLES TABLES.

  • Privilèges: le définisseur d'une vue reçoit toujours le privilège SELECT sur la vue ainsi que le droit de supprimer la vue. Le définisseur d'une vue obtient le privilège CONTROL sur la vue uniquement si le définisseur dispose du privilège CONTROL sur chaque table de base, vue ou pseudonyme identifié dans l'instruction FULLSELECT, ou si le définisseur dispose de chacun des droits suivants:
    • ACCESSCTRL ou SECADM sur la base de données ou ACCESSCTRL sur le schéma contenant chaque table de base, vue ou pseudonyme identifié dans l'instruction FULLSELECT
    • DATAACCESS sur la base de données ou DATAACCESS sur le schéma contenant chaque table de base, vue ou pseudonyme identifié dans l'instruction FULLSELECT
    • DBADM ou SCHEMAADM sur le schéma contenant chaque table de base, vue ou pseudonyme identifié dans l'instruction FULLSELECT

    Le définisseur de la vue se voit accorder les privilèges INSERT, UPDATE, UPDATE ou DELETE au niveau de la colonne sur la vue si la vue n'est pas en lecture seule et que le définisseur possède les privilèges correspondants sur les objets sous-jacents.

    Pour une vue définie avec ROW MO???, le définisseur acquiert le privilège UPDATE sur la vue uniquement si le définisseur possède le privilège UPDATE sur toutes les colonnes de la vue, ainsi que les privilèges INSERT et DELETE sur toutes les tables ou vues sous-jacentes.

    Le définisseur d'une vue n'acquiert des privilèges que si les privilèges dont ils sont dérivés existent au moment de la création de la vue. Le définisseur doit disposer de ces privilèges directement ou parce que PUBLIC dispose de ces privilèges. Les privilèges ne sont pas pris en compte lors de la définition d'une vue sur un pseudonyme de serveur fédéré. Toutefois, lors de l'utilisation d'une vue sur un pseudonyme, l'ID d'autorisation de l'utilisateur doit disposer de privilèges de sélection valides sur la table ou la vue référencée par le pseudonyme sur la source de données. Sinon, une erreur est renvoyée. Les privilèges détenus par les groupes dont le définisseur de vue est membre ne sont pas pris en compte.

    Lorsqu'une sous-vue est créée, les privilèges SELECT détenus sur la supervue immédiate sont automatiquement octroyés sur la sous-vue.

  • Colonnes Scope et REF: Lors de la sélection d'une colonne de type de référence dans l'instruction FULLSELECT d'une définition de vue, tenez compte du type de cible et de la portée requis.
    • Si le type de cible et la portée requis sont identiques à ceux de la table ou de la vue sous-jacente, la colonne peut simplement être sélectionnée.
    • Si la portée doit être modifiée, utilisez la clause WITH OPTIONS SCOPE pour définir la table ou la vue de portée requise.
    • Si le type cible de la référence doit être modifié, la colonne doit d'abord être transtypée vers le type de représentation de la référence, puis vers le nouveau type de référence. Dans ce cas, la portée peut être spécifiée dans le transtypage vers le type de référence ou à l'aide de la clause WITH OPTIONS SCOPE. Par exemple, supposons que vous sélectionnez la colonne Y définie comme REF (TYP1) SCOPE TAB1. Vous souhaitez qu'il soit défini en tant que REF (VTYP1) SCOPE VIEW1. L'élément de liste de sélection serait le suivant:
         CAST(CAST(Y AS VARCHAR(16) FOR BIT DATA) AS REF(VTYP1) SCOPE VIEW1)
  • Colonnes d'identité: Une colonne d'une vue est considérée comme une colonne d'identité si l'élément de la colonne correspondante dans l'instruction FULLSELECT de la définition de vue est le nom d'une colonne d'identité d'une table ou le nom d'une colonne d'une vue qui est mappée directement ou indirectement au nom d'une colonne d'identité d'une table de base.
    Dans tous les autres cas, les colonnes d'une vue n'obtiennent pas la propriété d'identité. Exemple :
    • la liste de sélection de la définition de vue inclut plusieurs instances du nom d'une colonne d'identité (c'est-à-dire, la sélection de la même colonne plusieurs fois)
    • la définition de vue implique une jointure
    • une colonne de la définition de vue inclut une expression qui fait référence à une colonne d'identité
    • la définition de vue inclut une instruction UNION

    Lors de l'insertion dans une vue pour laquelle la liste de sélection de la définition de vue inclut directement ou indirectement le nom d'une colonne d'identité d'une table de base, les mêmes règles s'appliquent que si l'instruction INSERT référençait directement la colonne d'identité de la table de base.

  • Vues fédérées: Une vue fédérée est une vue qui inclut une référence à un pseudonyme quelque part dans l'instruction FULLSELECT. La présence d'un alias de ce type modifie le modèle d'autorisation utilisé pour la vue lorsque celle-ci est ensuite référencée dans une requête.

    Lorsque la vue est créée, aucune vérification des privilèges n'est effectuée pour déterminer si le définisseur de vue a accès à la table de source de données sous-jacente ou à la vue d'un pseudonyme. La vérification des privilèges des références aux tables ou aux vues de la base de données fédérée est gérée comme d'habitude, ce qui nécessite que le créateur de la vue dispose au moins du privilège SELECT sur ces objets.

    Lorsqu'une vue fédérée est ensuite référencée dans une requête, les pseudonymes génèrent des requêtes sur la source de données et l'ID d'autorisation qui a émis la requête (ou l'ID d'autorisation distant auquel elle est mappée) doit disposer des privilèges nécessaires pour accéder à la table ou à la vue de la source de données. L'ID d'autorisation qui émet la requête référençant la vue fédérée n'a pas besoin de disposer de privilèges supplémentaires sur les tables ou les vues (non fédérées) qui existent sur le serveur fédéré.

  • ROW MO???, triggers et contraintes: Lorsqu'une vue définie à l'aide de la clause WITH ROW MO??? est mise à jour, la séquence des opérations de déclenchement et de contraintes est la suivante:
    1. Les déclencheurs BEFORE UPDATE sont activés pour toutes les lignes en cours de mise à jour, y compris les lignes qui seront éventuellement déplacées.
    2. L'opération de mise à jour est traitée.
    3. Les contraintes sont traitées pour toutes les lignes mises à jour.
    4. Les déclencheurs AFTER UPDATE (au niveau de la ligne et au niveau de l'instruction) sont activés dans l'ordre de création, pour toutes les lignes qui satisfont aux contraintes après l'opération de mise à jour. Etant donné qu'il s'agit d'une instruction UPDATE, tous les déclencheurs de niveau instruction UPDATE sont activés pour toutes les tables sous-jacentes.
    5. Les déclencheurs BEFORE DELETE sont activés pour toutes les lignes qui ne satisfaisaient pas aux contraintes après l'opération de mise à jour (il s'agit des lignes à déplacer).
    6. L'opération de suppression est traitée.
    7. Les contraintes sont traitées pour toutes les lignes supprimées.
    8. Les déclencheurs AFTER DELETE (au niveau de la ligne et au niveau de l'instruction) sont activés dans l'ordre de création, pour toutes les lignes supprimées. Les déclencheurs de niveau instruction sont activés uniquement pour les tables impliquées dans l'opération de suppression.
    9. Les déclencheurs BEFORE INSERT sont activés pour toutes les lignes insérées (c'est-à-dire les lignes déplacées). Les nouvelles tables de transition pour les déclencheurs BEFORE INSERT contiennent les données d'entrée fournies par l'utilisateur. Ces déclencheurs ne peuvent pas contenir d'opération UPDATE, DELETE ou INSERT, ni appeler une routine contenant de telles opérations (SQLSTATE 42987).
    10. L'opération d'insertion est traitée.
    11. Les contraintes sont traitées pour toutes les lignes insérées.
    12. Les déclencheurs AFTER INSERT (au niveau de la ligne et au niveau de l'instruction) sont activés dans l'ordre de création, pour toutes les lignes insérées. Les déclencheurs de niveau instruction sont activés uniquement pour les tables impliquées dans l'opération d'insertion.
  • Vues UNION ALL imbriquées: Une vue définie avec UNION ALL et basée, directement ou indirectement, sur une vue qui est également définie avec UNION ALL ne peut pas être mise à jour si l'une des vues est définie à l'aide de la clause WITH ROW MO??? (SQLSTATE 429BK).
  • Remarques relatives aux colonnes masquées implicitement: Il est possible que la table de résultats de l'instruction FULLSELECT inclue une colonne de la table de base définie comme masquée implicitement. Cela peut se produire lorsque la colonne masquée implicitement est explicitement référencée dans l'instruction FULLSELECT de la définition de vue. Toutefois, la colonne correspondante de la vue n'hérite pas de l'attribut masqué implicitement. Les colonnes d'une vue ne peuvent pas être définies comme étant masquées.
  • Sous-requête: La clause-isolement ne peut pas être spécifiée dans l'instruction fullselect (SQLSTATE 42601).
  • Obfuscation: l'instruction CREATE VIEW peut être soumise sous forme brouillée. Dans une instruction brouillée, seul le nom de la vue est lisible. Le reste de l'instruction est codé de manière le rendre illisible, mais peut être décodé par le serveur de base de données. Des instructions brouillées peuvent être générées en appelant la fonction DBMS_DDL.WRAP.
  • alternatives de syntaxe: Les alternatives de syntaxe suivantes sont prises en charge pour la compatibilité avec les versions précédentes d' Db2® et avec d'autres produits de base de données.
    • Le mot clé FEDERATED peut être indiqué entre les mots clés CREATE et VIEW. Le mot clé FEDERATED est ignoré, cependant, car un avertissement n'est plus renvoyé si des objets fédérés sont utilisés dans la définition de la vue.

Exemples

  • Exemple 1: Créez une vue nommée MA_PROJ sur la table PROJECT qui contient uniquement les lignes avec un numéro de projet (PROJNO) commençant par les lettres'MA'.
       CREATE VIEW MA_PROJ  AS SELECT *
         FROM PROJECT
          WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
  • Exemple 2: Créez une vue comme dans l'exemple 1, mais sélectionnez uniquement les colonnes pour le numéro de projet (PROJNO), le nom de projet (PROJNAME) et l'employé en charge du projet (RESPEMP).
       CREATE VIEW MA_PROJ
         AS SELECTPROJNO, PROJNAME, RESPEMP
         FROM PROJECT
         WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
  • Exemple 3: Créez une vue comme dans l'exemple 2, mais, dans la vue, appelez la colonne pour l'employé en charge du projet IN_CHARGE.
       CREATE VIEW MA_PROJ
         (PROJNO, PROJNAME, IN_CHARGE) 
         AS SELECTPROJNO, PROJNAME, RESPEMP
         FROM PROJECT
         WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
    Remarque: même si un seul des noms de colonne est en cours de modification, les noms des trois colonnes de la vue doivent être répertoriés entre parenthèses après MA_PROJ.
  • Exemple 4: Créez une vue nommée PRJ_LEADER qui contient les quatre premières colonnes (PROJNO, PROJNAME, DEPTNO, RESPEMP) de la table PROJECT avec le nom de famille (LASTNAME) de la personne responsable du projet (RESPEMP). Obtenez le nom de la table EMPLOYEE en faisant correspondre EMPNO dans EMPLOYEE à RESPEMP dans PROJECT.
       CREATE VIEW PRJ_LEADER
         AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME
         FROM PROJECT, EMPLOYEE
         WHERE RESPEMP = EMPNO
  • Exemple 5: Créez une vue comme dans l'exemple 4, mais en plus des colonnes PROJNO, PROJNAME, DEPTNO, RESPEMP et LASTNAME, affichez le salaire total (SALAIRE + BONUS + COMM) de l'employé responsable. Sélectionner également uniquement les projets dont la dotation moyenne (PRSTAFF) est supérieure à un.
       CREATE VIEW PRJ_LEADER
       (PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, TOTAL_PAY )
       AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, SALARY+BONUS+COMM
         FROM PROJECT, EMPLOYEE
         WHERE RESPEMP = EMPNO
         AND PRSTAFF > 1
    La spécification de la liste de noms de colonne peut être évitée en nommant l'expression SALAIRE + BONUS + COMM comme TOTAL_PAY dans l'instruction FULLSELECT.
       CREATE VIEW PRJ_LEADER
         AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP,
                      LASTNAME, SALARY+BONUS+COMM AS TOTAL_PAY
           FROM PROJECT, EMPLOYEE
           WHERE RESPEMP = EMPNO AND PRSTAFF > 1
  • Exemple 6: Etant donné l'ensemble de tables et de vues présenté dans la figure suivante:
    Figure 1 : Tables et vues de l'exemple 6
    Exemples de tables et de vues CREATE VIEW
    L'utilisateur ZORPIE (qui ne dispose pas des droits ACCESSCTRL, DATAACCESS ou DBADM) dispose des privilèges indiqués entre parenthèses pour chaque objet:
    1. ZORPIE aura le privilège CONTROL sur la vue qu'elle crée avec:
         CREATE VIEW VA AS SELECT * FROM S1.V1
      parce qu'elle a CONTROL sur S1.V1. (CONTROL sur S1.V1 doit avoir été accordé à ZORPIE par une personne disposant des droits ACCESSCTRL ou SECADM.) Peu importe, le cas échéant, les privilèges qu'elle a sur la table de base sous-jacente.
    2. ZORPIE ne sera pas autorisé à créer la vue:
         CREATE VIEW VB AS SELECT * FROM S1.V2
      car elle n'a ni CONTROL ni SELECT sur S1.V2version 2. Peu importe qu'elle ait CONTROL sur la table de base sous-jacente (S1.T2).
    3. ZORPIE aura le privilège CONTROL sur la vue qu'elle crée avec:
         CREATE VIEW VC (COLA, COLB, COLC, COLD)
           AS SELECT * FROM S1.V1, S1.T2
           WHERE COLA = COLC
      car l'instruction FULLSELECT de ZORPIE.VC fait référence à la vue S1.V1 et la table S1.T2 et elle a le contrôle sur les deux. Notez que la vue VC est en lecture seule, de sorte que ZORPIE n'obtient pas les privilèges INSERT, UPDATE ou DELETE.
    4. ZORPIE aura le privilège SELECT sur la vue qu'elle crée avec:
         CREATE VIEW VD (COLA,COLB, COLE, COLF)
           AS SELECT * FROM S1.V1, S1.V3
           WHERE COLA = COLE
      car l'instruction FULLSELECT de ZORPIE.VD fait référence aux deux vues S1.V1 et S1.V3, une sur laquelle elle a uniquement le privilège SELECT et une sur laquelle elle a le privilège CONTROL. Elle reçoit le moindre des deux privilèges, SELECT, sur ZORPIE.VD.
    5. ZORPIE obtient les privilèges INSERT, UPDATE et DELETE avec les privilèges WITH GRANT OPTION et SELECT sur la vue VE dans la définition de vue suivante.
         CREATE VIEW VE
            AS SELECT * FROM S1.V1
           WHERE COLA > ANY
                  (SELECT COLE FROM S1.V3)

      Les privilèges de ZORPIE sur VE sont principalement déterminés par ses privilèges sur S1.V1. Depuis S1.V3 est uniquement référencée dans une sous-requête, elle n'a besoin que du privilège SELECT sur S1.V3 pour créer la vue VE. Le programme de définition d'une vue n'obtient CONTROL sur la vue que s'il contient CONTROL sur tous les objets référencés dans la définition de la vue. ZORPIE ne dispose pas de CONTROL sur S1.V3, par conséquent, elle n'obtient pas de contrôle sur VE.