web-dev-qa-db-fra.com

Dans Oracle, est-il possible d'insérer ou de mettre à jour un enregistrement via une vue?

Dans Oracle, est-il possible d'insérer ou de mettre à jour un enregistrement (une ligne) via une vue?

32
Bastien Vandamme

Les vues dans Oracle peuvent être mises à jour dans des conditions spécifiques. Cela peut être délicat et généralement n'est pas conseillé.

À partir de Oracle 10g SQL Reference :

Remarques sur les vues pouvant être mises à jour

Une vue pouvant être mise à jour est celle que vous pouvez utiliser pour insérer, mettre à jour ou supprimer des lignes de table de base. Vous pouvez créer une vue qui peut être mise à jour de manière inhérente, ou vous pouvez créer un déclencheur INSTEAD OF sur n'importe quelle vue pour la mettre à jour.

Pour savoir si et de quelle manière les colonnes d'une vue intrinsèquement modifiable peuvent être modifiées, interrogez la vue du dictionnaire de données USER_UPDATABLE_COLUMNS. Les informations affichées par cette vue n'ont de sens que pour les vues intrinsèquement modifiables. Pour qu'une vue puisse être mise à jour de manière inhérente, les conditions suivantes doivent être remplies:

  • Chaque colonne de la vue doit correspondre à une colonne d'une seule table. Par exemple, si une colonne de vue est mappée à la sortie d'une clause TABLE (une collection non imbriquée), la vue n'est pas intrinsèquement modifiable.
  • La vue ne doit contenir aucune des constructions suivantes:
    • Un opérateur fixe
    • un opérateur DISTINCT
    • Une fonction agrégée ou analytique
    • Une clause GROUP BY, ORDER BY, MODEL, CONNECT BY ou START WITH
    • Une expression de collection dans une liste SELECT
    • Une sous-requête dans une liste SELECT
    • Une sous-requête désignée AVEC LIRE SEULEMENT
    • Jointures, à quelques exceptions près, comme indiqué dans le manuel Oracle Database Administrator's Guide

En outre, si une vue intrinsèquement modifiable contient des pseudocolonnes ou des expressions, vous ne pouvez pas mettre à jour les lignes de la table de base avec une instruction UPDATE qui fait référence à l'une de ces pseudocolonnes ou expressions.

Si vous souhaitez qu'une vue de jointure puisse être mise à jour, toutes les conditions suivantes doivent être remplies:

  • L'instruction DML ne doit affecter qu'une seule table sous-jacente à la jointure.
  • Pour une instruction INSERT, la vue ne doit pas être créée WITH CHECK OPTION et toutes les colonnes dans lesquelles les valeurs sont insérées doivent provenir d'une table à clé préservée. Une table à clé préservée est une table pour laquelle chaque clé primaire ou valeur de clé unique dans la table de base est également unique dans la vue de jointure.
  • Pour une instruction UPDATE, toutes les colonnes mises à jour doivent être extraites d'une table à clé préservée. Si la vue a été créée WITH CHECK OPTION, les jointures de colonnes et de colonnes provenant de tables référencées plusieurs fois dans la vue doivent être protégées contre UPDATE.
  • Pour une instruction DELETE, si la jointure entraîne la création de plusieurs tables à clé préservée, Oracle Database supprime la première table nommée dans la clause FROM, que la vue ait été créée WITH CHECK OPTION ou non.
42
DCookie

Oracle a deux façons différentes de rendre les vues modifiables: -

  1. La vue est "clé préservée" par rapport à ce que vous essayez de mettre à jour. Cela signifie que la clé primaire de la table sous-jacente se trouve dans la vue et que la ligne n'apparaît qu'une seule fois dans la vue. Cela signifie qu'Oracle peut déterminer exactement quelle ligne de table sous-jacente mettre à jour OU
  2. Vous écrivez un au lieu de déclencheur.

Je resterais à l'écart des déclencheurs plutôt que de récupérer votre code pour mettre à jour les tables sous-jacentes directement plutôt que via la vue.

10
WW.

Il y a deux fois où vous pouvez mettre à jour un enregistrement via une vue:

  1. Si la vue n'a pas de jointures ou d'appels de procédure et sélectionne les données d'une seule table sous-jacente.
  2. Si la vue a un déclencheur INSTEAD OF INSERT associé à la vue.

En règle générale, vous ne devez pas compter sur la possibilité d'effectuer une insertion dans une vue à moins d'avoir spécifiquement écrit un déclencheur INSTEAD OF pour celle-ci. Sachez qu'il existe également des déclencheurs INSTEAD OF UPDATE qui peuvent également être écrits pour faciliter les mises à jour.

4
LBushkin

OUI , vous pouvez mettre à jour et insérer dans la vue et cette modification sera reflétée sur le tableau d'origine ....
MAIS
1-la vue doit avoir toutes les valeurs NOT NULL sur la table
2-la mise à jour doit avoir la mêmes règles que le tablea ... "mise à jour de la clé primaire liée à une autre clé étrangère .. etc" ...

0
Radi Soufan