Oracle
 sql >> Database >  >> RDS >> Oracle

In Oracle, è possibile INSERIRE o AGGIORNARE un record tramite una vista?

Le visualizzazioni in Oracle possono essere aggiornabile a condizioni specifiche. Può essere complicato e solitamente non è consigliabile.

Dal riferimento SQL di Oracle 10g:

Note sulle viste aggiornabili

Una vista aggiornabile è quella che puoi usare per inserire, aggiornare o eliminare le righe della tabella di base. Puoi creare una vista per essere intrinsecamente aggiornabile, oppure puoi creare un trigger INSTEAD OF su qualsiasi vista per renderla aggiornabile.

Per sapere se e in che modo è possibile modificare le colonne di una vista intrinsecamente aggiornabile, interroga la vista del dizionario di dati USER_UPDATABLE_COLUMNS. Le informazioni visualizzate da questa vista sono significative solo per le viste intrinsecamente aggiornabili. Affinché una vista sia intrinsecamente aggiornabile, devono essere soddisfatte le seguenti condizioni:

  • Ogni colonna nella vista deve essere mappata a una colonna di una singola tabella. Ad esempio, se una colonna di visualizzazione viene mappata all'output di una clausola TABLE (una raccolta non annidata), la visualizzazione non è intrinsecamente aggiornabile.
  • La vista non deve contenere nessuno dei seguenti costrutti:
    • Un operatore di insiemi
    • un operatore DISTINCT
    • Una funzione aggregata o analitica
    • Una clausola GROUP BY, ORDER BY, MODEL, CONNECT BY o START WITH
    • Un'espressione di raccolta in un elenco SELECT
    • Una sottoquery in un elenco SELECT
    • Una sottoquery designata CON SOLA LETTURA
    • Partecipa, con alcune eccezioni, come documentato in Oracle Database Administrator's Guide

Inoltre, se una vista intrinsecamente aggiornabile contiene pseudocolonne o espressioni, non è possibile aggiornare le righe della tabella di base con un'istruzione UPDATE che fa riferimento a una di queste pseudocolonne o espressioni.

Se vuoi che una vista unita sia aggiornabile, tutte le seguenti condizioni devono essere vere:

  • L'istruzione DML deve interessare solo una tabella sottostante il join.
  • Per un'istruzione INSERT, la vista non deve essere creata CON CHECK OPTION e tutte le colonne in cui vengono inseriti i valori devono provenire da una tabella con chiave conservata. Una tabella con chiave conservata è una tabella per la quale ogni chiave primaria o valore di chiave univoco nella tabella di base è anche univoco nella vista di unione.
  • Per un'istruzione UPDATE, tutte le colonne aggiornate devono essere estratte da una tabella con chiave conservata. Se la vista è stata creata CON L'OPZIONE DI CONTROLLO, le colonne e le colonne di join prese da tabelle a cui si fa riferimento più di una volta nella vista devono essere protette dall'AGGIORNAMENTO.
  • Per un'istruzione DELETE, se il join risulta in più di una tabella con chiave conservata, Oracle Database elimina dalla prima tabella denominata nella clausola FROM, indipendentemente dal fatto che la vista sia stata creata o meno CON CHECK OPTION.