Oracle
 sql >> Base de données >  >> RDS >> Oracle

Dans Oracle, est-il possible d'INSÉRER ou de METTRE À JOUR un enregistrement via une vue ?

Les vues dans Oracle peuvent être actualisable dans des conditions spécifiques. Cela peut être délicat, et habituellement n'est pas conseillé.

À partir de la référence SQL Oracle 10g :

Remarques sur les vues pouvant être mises à jour

Une vue pouvant être mise à jour est une vue que vous pouvez utiliser pour insérer, mettre à jour ou supprimer des lignes de la table de base. Vous pouvez créer une vue pouvant ê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 rendre modifiable.

Pour savoir si et de quelle manière les colonnes d'une vue pouvant être mise à jour par nature 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 pouvant être mises à jour par nature. Pour qu'une vue puisse être mise à jour par nature, 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 correspond à la sortie d'une clause TABLE (une collection non imbriquée), la vue n'est pas modifiable par nature.
  • La vue ne doit contenir aucune des constructions suivantes :
    • Un opérateur d'ensemble
    • 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 LECTURE SEULE
    • Joints, à quelques exceptions près, comme documenté dans le guide de l'administrateur de la base de données Oracle

De plus, si une vue pouvant être mise à jour par nature contient des pseudo-colonnes ou des expressions, vous ne pouvez pas mettre à jour les lignes de la table de base avec une instruction UPDATE faisant référence à l'une de ces pseudo-colonnes 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 des 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 colonnes de jointure et les colonnes extraites 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 aboutit à plus d'une table à 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.