Aggiornare più tabelle utilizzando una vista unica

di il
2 risposte

Aggiornare più tabelle utilizzando una vista unica

Salve a tutti,
il DBMS che utilizzo è SQL Server Management Studio.
Avrei il bisogno di aggiornare più tabelle contemporaneamente utilizzando una vista unica.
Ad esempio:
Creo due tabelle IMPIEGATO e PROVINCIA, una chiave primaria per ogni tabella, una secondaria solo per IMPIEGATO e una relazione.
Poi creo una Vista e mi aspetterei di poter modificare i valori al suo interno, ma niente, mi dice che è solo in lettura. Avete qualche idea?, esiste un'opzione?, è giusto così? Boh!
Vi scrivo il codice per aiutarvi nella comprensione

USE [prova]
GO

CREATE TABLE PROVINCIA
( Nome nvarchar(50) NOT NULL,
CONSTRAINT KP_PROVINCIA PRIMARY KEY (Nome)
)
GO

CREATE TABLE IMPIEGATO
( ID_Impiegato smallint NOT NULL,
Nome nvarchar(20) NOT NULL,
Cognome nvarchar(20) NOT NULL,
Prov nvarchar(50) NOT NULL,
Telefono nvarchar(15) NULL
CONSTRAINT KP_IMPIEGATO PRIMARY KEY (ID_Impiegato)
CONSTRAINT REL_IMPIEGATO_PROVINCIA FOREIGN KEY (Prov) REFERENCES PROVINCIA(Nome) ON DELETE CASCADE ON UPDATE CASCADE
)
GO

CREATE VIEW VISTA
AS SELECT IMPIEGATO.ID_Impiegato,IMPIEGATO.Nome,IMPIEGATO.Cognome,IMPIEGATO.Prov,IMPIEGATO.Telefono
FROM dbo.IMPIEGATO, dbo.PROVINCIA
WHERE dbo.IMPIEGATO.Prov=dbo.PROVINCIA.Nome
GO

Che ho fatto dopo? Arrancando nel buio ho cominciato a popolare le tabelle con due viste distinte,
una per ogni tabella e in questo modo ho inserito i dati.
Poi ho eseguito la VISTA (vedi codice sopra) e comparivano le tuple. Fino a qui ok, la VISTA però non mi permette di modificare le tuple, dice che è in sola lettura.

A questo punto mi sono inventato di creare un'altra vista (non sapevo più cosa fare) che prende came tabella proprio la VISTA antecedentemente creata, e con mio stupore riesco a inserire dati, ma parzialmente. Nel senso che riesco ad aggiungere una tupla stando attento di dare all'attributo Prov uno dei valori che avevo primo inserito. Se cerco poi di modificare questa tupla e le modifiche non riguardano l'attributi Prov va tutto bene, la tabella IMPIEGATO viene modificata automaticamente, ma se cerco di modificare Prov dando un valore che non compare nella tabella PROVINCIA non mi permette di farlo. Il mio scopo sarebbe modificare il valore di Prov in modo che il sistema aggiorni la tabella PROVINCIA automaticamente come succede per la tabella IMPIEGATO.
Probabilmente questo succede perchè l'attributo Prov guarda caso è la chiave secondaria o perrchè la relazione è N (IMPIEGATO) : 1 (PROVINCIA). Sapete come fare? Magari un consiglio?

N.B. L'idea di usare le viste per inserire dati non è casuale, cito testualmente dal libro Sistemi di Basi di Dati Fondamenti di Ramez e Shamkant casa editrice PEARSON (pag. 298):

Una vista è sempre aggiornata; se si modificano le tuple nelle tabelle base su cui è definita la vista, automaticamente la vista riflette questi cambiamenti. La vista, quindi, non è realizzata al momento della definizione, ma piuttosto quando si specifica un'interrogazione su di essa. E' responsabilità del DBMS e non dell'utente assicurarsi che questa sia aggiornata.

2 Risposte

  • Re: Aggiornare più tabelle utilizzando una vista unica


    Ciao,
    ho letto il tuo post e vorrei provare a risponderti.
    Allora, in prima istanza una vista è un modo per mettere a disposizione rappresentazioni diverse degli stessi dati, possono essere di due tipi:
    - semplici,
    - materializzate
    la differenza è che le seconde oltre ad essere create risiedono fisicamente nella base di dati.
    La vista resta in ogni caso uno strumento di sola lettura e non è modificabile se non modificando la/le tabelle cui fa riferimento.
    Direi che è un pò macchinoso ciò che hai fatto ed in ogni caso ricadi nel problema originario.
    Tutto quello che leggo è corretto e deriva dal fatto che le due tabelle: PROVINCIA ed IMPIEGATO sono legate da un vincolo di chiave esterna (FOREIGN KEY). La diretta conseguenza è che se devi popolare entrambe le tabelle con dati presi da una maschera devi seguire questa logica:
    - verificare che il codice della provincia sia effettivamente presente in: Nome della tabella: PROVINCIA,
    + SE ESISTE, non si deve fare nulla,
    + SE NON ESISTE, DEVI inserire il nuovo dato nella tabella PROVINCIA.
    - inserire i dati inerenti la tabella: IMPIEGATO.
    Quando, il DBMS, non ti permetteva l'inserimento delle tuple, era proprio perchè stavi tentando di violare il vincolo di chiave esterna cosa, ovviamente, che un qualsiasi DBMS non ti permeterà mai di fare.
  • Re: Aggiornare più tabelle utilizzando una vista unica

    Grazie Jolly Joker per la tua risposta.
Devi accedere o registrarti per scrivere nel forum
2 risposte