Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL: Amministrazione e Viste
Giugno-Pulvirenti AA SQL per definire ed amministrare Ad ogni utente tipicamente viene associata una base di dati, creata dall’amministratore del sistema. L’utente diventa l’amministratore potendo stabilire gli accessi di eventuali altri utenti alla sua base di dati. La creazione consiste nel definire incrementalmente uno schema con un certo nome, interattivamente o da programma, e tutti i suoi elementi vengono registrati in un catalogo.
Giugno-Pulvirenti AA CREATE SCHEMA CREATE SCHEMA Nome AUTHORIZATION Utente Definizioni Dove: –Si crea il database chiamato Nome –Utente e’ l’amministratore –Le Definizioni creano gli elementi dello schema (Tabelle,Viste,Indici,etc…)
Giugno-Pulvirenti AA DROP SCHEMA DROP SCHEMA Nome [RESTRICT | CASCADE] cancella la base di dati Nome Restrict: drop non viene eseguito se il database non è vuoto. Cascade: Vengono rimossi automaticamente tutti i dati presenti nel database
Giugno-Pulvirenti AA Definizione dei dati in SQL Istruzione CREATE TABLE: –definisce uno schema di relazione e ne crea un’istanza vuota –specifica attributi, domini e vincoli
Giugno-Pulvirenti AA Create Table CREATE TABLE Nome “(“Attributo Tipo[Vincolo {,Vincolo}] {,Attributo Tipo[Vincolo {,Vincolo}]}”)” [VincoloDiTabella {, VincoloDiTabella}]
Giugno-Pulvirenti AA CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )
Giugno-Pulvirenti AA Domini Domini elementari (predefiniti) Domini definiti dall'utente (semplici, ma riutilizzabili)
Giugno-Pulvirenti AA Domini elementari Carattere: singoli caratteri o stringhe, anche di lunghezza variabile Bit: singoli booleani o stringhe Numerici, esatti e approssimati Data, ora Sistemi diversi estendono il set di base con domini non standard (vettori, periodi, ecc.)
Giugno-Pulvirenti AA Domini o tipi CHAR(n) stringhe di lunghezza n VARCHAR(n) stringhe di lunghezza variabile con al massimo n caratteri INTEGER interi REAL reali NUMERIC (p,s) p cifre di cui s decimali FLOAT(p) binari con p cifre significative DATE,TIME per date ed ore.
Giugno-Pulvirenti AA Definizione di domini Istruzione CREATE DOMAIN: –definisce un dominio (semplice), utilizzabile in definizioni di relazioni, anche con vincoli e valori di default
Giugno-Pulvirenti AA CREATE DOMAIN, esempio CREATE DOMAIN Voto AS SMALLINT DEFAULT NULL CHECK ( value >=18 AND value <= 30 )
Giugno-Pulvirenti AA Vincoli intrarelazionali NOT NULL UNIQUE definisce chiavi PRIMARY KEY: chiave primaria (una sola, implica NOT NULL) CHECK, vedremo più avanti
Giugno-Pulvirenti AA UNIQUE e PRIMARY KEY due forme: –nella definizione di un attributo, se forma da solo la chiave –come elemento separato
Giugno-Pulvirenti AA CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )
Giugno-Pulvirenti AA Matricola CHAR(6) PRIMARY KEY Matricola CHAR(6), …, PRIMARY KEY (Matricola) PRIMARY KEY, alternative
Giugno-Pulvirenti AA CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )
Giugno-Pulvirenti AA Chiavi su più attributi, attenzione Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, UNIQUE (Cognome,Nome), NomeCHAR(20) NOT NULL UNIQUE, Cognome CHAR(20) NOT NULL UNIQUE, Non è la stessa cosa!
Giugno-Pulvirenti AA Vincoli interrelazionali CHECK, vedremo più avanti REFERENCES e FOREIGN KEY permettono di definire vincoli di integrità referenziale di nuovo due sintassi –per singoli attributi –su più attributi E' possibile definire politiche di reazione alla violazione
Giugno-Pulvirenti AA Matricola Vigili Cognome Rossi Neri Nome Luca Piero Mario MoriGino7543 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E
Giugno-Pulvirenti AA Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca
Giugno-Pulvirenti AA CREATE TABLE, esempio CREATE TABLE Infrazioni( Codice CHAR(6) NOT NULL PRIMARY KEY, Data DATE NOT NULL, Vigile INTEGER NOT NULL REFERENCES Vigili(Matricola), Provincia CHAR(2), Numero CHAR(6), FOREIGN KEY(Provincia, Numero) REFERENCES Auto(Provincia, Numero) )
Giugno-Pulvirenti AA Modifiche degli schemi ALTER DOMAIN ALTER TABLE DROP DOMAIN DROP TABLE...
Giugno-Pulvirenti AA Definizione degli indici è rilevante dal punto di vista delle prestazioni ma è a livello fisico e non logico in passato era importante perché in alcuni sistemi era l'unico mezzo per definire chiavi CREATE INDEX
Giugno-Pulvirenti AA SQL, operazioni sui dati interrogazione: –SELECT modifica: –INSERT, DELETE, UPDATE
Giugno-Pulvirenti AA Insert INSERT INTO Tabella [“(”Attributo {,Attributo} “)”] VALUES “(” Valore {,Valore} “)” Esempio –INSERT INTO Esami VALUES (‘DB1’, , 27)
Giugno-Pulvirenti AA Delete DELETE FROM Tabella WHERE Condizione Esempio: –DELETE FROM Esami WHERE Matricola =
Giugno-Pulvirenti AA Update UPDATE Tabella SET Attributo = Espr {,Attributo = Espr} WHERE Condizione Esempio: –UPDATE Aule SET Aula = 126 WHERE Aula = 3
Giugno-Pulvirenti AA Esempi CREATE TABLE Studenti( Nome CHAR(30), Matricola INTEGER, Indirizzo CHAR(30), Telefono INTEGER) CREATE TABLE FuoriCorso LIKE Studenti
Giugno-Pulvirenti AA Altri modi di definire tabelle CREATE TABLE Nome AS EsprSelect Esempio: CREATE TABLE EsamiBuoni LIKE Esami AS SELECT * FROM Esami WHERE Voto > 27
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL: vincoli d’Integrità
Giugno-Pulvirenti AA Vincoli d’integrita’ Riguardano i valori ammissibili degli attributi di una tupla –Vincoli Intrarelazionali: nell’ambito della stessa relazione –Vincoli Referenziali (o Interrelazionali): tra diverse relazioni Vengono controllati durante le tre possibili operazioni di modifica SQL –INSERT,DELETE e UPDATE –Devono essere sempre soddisfatti altrimenti la transazione fallisce –Oppure, l’utente puo’ opzionalmente definire della azioni (correttive) da intraprendere per ripristinare l’integrita’
Giugno-Pulvirenti AA A cosa servono i vincoli d’integrita’ Migliorare la qualità dei dati Arricchire semanticamente la base di dati La loro definizione è parte del processo di progettazione del data base Usati internamente dal sistema per ottimizzare l’esecuzione
Giugno-Pulvirenti AA Esempio di DB semanticamente errato StudenteVotoLodeCorso e lode e lode Esami Matricola Cognome Rossi Neri Bianchi Nome Mario Piero Luca Studenti e lode
Giugno-Pulvirenti AA Vincoli su una n-upla NOT NULL : –e’ implicito se l’attributo fa parte di una chiave primaria CHECK Condizione : –specifica i valori ammissibili; esempio: Voto INTEGER NOT NULL CHECK (18 Voto AND Voto 31) DEFAULT(Costante|NULL) –assegna quel valore di default per ogni inserimento CHECK Condizione : –anche per attributi diversi della stessa n-upla
Giugno-Pulvirenti AA Vincoli Intrarelazionali UNIQUE: –l’attributo e’ una chiave PRIMARY KEY [Nome Chiave] “(”Attributo{,Attributo} “)” –dove gli attributi devono essere dichiarati tutti NOT NULL UNIQUE “(”Attributo{,Attributo} “)” –definisce una chiave con piu’ attributi
Giugno-Pulvirenti AA Vincoli Interrelazionali FOREIGN KEY [NomeChiaveEsterna] “(”Attributo{,Attributo} “)” REFERENCES TabellaRef ON DELETE {NO ACTION,CASCADE,SET NULL} dove per la TabellaRef e’ stata definita una chiave primaria. Impedisce l’inserzione di n-uple con il valore della chiave esterna che non corrisponde ad un valore della chiave primaria della TabellaRef. Se un’operazione di cancellazione su TabellaRef viola il vincolo referenziale allora vengono applicate le tre azioni:
Giugno-Pulvirenti AA Azioni per Vincoli su Chiavi Esterne ON DELETE NO ACTION : –rifiuta l’operazione (la piu’ diffusa nei DBMS) ON DELETE CASCADE : –cancella tutte le n-uple con valori della chiave esterna corrispondenti alla chiave primaria delle n- uple cancellate ON DELETE SET NULL –assegna il valore NULL agli attributi della chiave esterna
Giugno-Pulvirenti AA Vincoli sui valori della tupla NOT NULL –implicito se l’attributo fa parte di una chiave primaria –Esempio: campo matricola nella tabella Studente DEFAULT (Costante|NULL) –assegna un valore di default per ogni inserimento se non specificato –Esempio: DEFAULT CURRENT DATE CHECK Condizione –Dove “Condizione” e’ un’espressione booleana per il controllo di attributi, costanti ed espressioni –Dev’essere valutata True per la corretta esecuzione della transazione –Vincoli sul dominio: Esempio: specifica i valori ammissibili nell’attributo Voto della tabella Esami: –Voto NOT NULL –(18 Voto AND Voto 30) –Vincoli basati su piu’ attributi (Lode <> ‘Si’) OR (Voto = 30)
Giugno-Pulvirenti AA Definizione vincoli intrarelazionali PRIMARY KEY [Nome Chiave] “(”Attributo{,Attributo} “)” –gli attributi devono essere dichiarati tutti NOT NULL –Esempio: Attributo Matricola nella relazione Studenti UNIQUE “(”Attributo{,Attributo} “)” –definisce una chiave con uno o piu’ attributi –Esempio: (Nome,Cognome,DataDiNascita) –Nota: Nome not null unique, Cognome not null unique –E’ diverso da: Nome not null, Cognome not null, UNIQUE (Nome, Cognome)
Giugno-Pulvirenti AA Vincoli d’integrita’ referenziali (o interrelazionali) Tuple di relazioni diverse sono correlati per mezzo del valore di chiavi (primarie) Servono a garantire che i valori in una certa tabella facciano riferimento a valori reali di un’altra tabella –Esempio: Esami(...,Matricola), Studenti( Matricola,...)
Giugno-Pulvirenti AA Matricola Vigili Cognome Rossi Neri Nome Luca Piero Mario MoriGino7543 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E
Giugno-Pulvirenti AA Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E MI TO PR 39548K E MI TO PR 39548K E
Giugno-Pulvirenti AA Un vincolo di integrità referenziale (“foreign key”) fra gli attributi X di una relazione R 1 e un’altra relazione R 2 impone ai valori su X in R 1 di comparire come valori della chiave primaria di R 2 Nell‘esempio precedente: –vincoli di integrità referenziale fra: l’attributo Vigile della relazione INFRAZIONI e la relazione VIGILI gli attributi Prov e Numero di INFRAZIONI e la relazione AUTO NULL per evitare il controllo del vincolo Vincolo di integrità referenziale
Giugno-Pulvirenti AA Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E Auto ProvNumero MI TO PR E39548 F Cognome Rossi Neri Nome Mario Luca TOE39548 TO E39548 Violazione di vincolo di integrità referenziale
Giugno-Pulvirenti AA Integrità referenziale e valori nulli Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo BianchiIDEA
Giugno-Pulvirenti AA Azioni compensative Esempio: Viene eliminata una tupla causando cosi' una violazione Tre possibili azioni –Rifiuto dell'operazione ON DELETE NO ACTION (la piu’ diffusa nei DBMS) –Eliminazione in cascata ON DELETE CASCADE: cancella tutte le tuple con valori della chiave esterna corrispondenti alla chiave primaria delle tuple cancellate –Introduzione di valori nulli ON DELETE SET NULL assegna il valore NULL agli attributi della chiave esterna
Giugno-Pulvirenti AA Rifiuto della cancellazione Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NeriXYZ 53524NeriXYZ La transazione fallisce e XYZ non puo’ essere cancellato dalla relazione Progetti
Giugno-Pulvirenti AA Eliminazione in cascata Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NeriXYZ La transazione termina e XYZ viene cancellato anche dalla relazione Impiegati
Giugno-Pulvirenti AA Introduzione di valori nulli Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NULL La transazione termina e all’attributo Impiegati.Progetto viene assegnato NULL
Giugno-Pulvirenti AA Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca Incidenti Codice Data 1/2/95 5/4/96 ProvBNumeroB MI TO 39548K E39548 ProvANumeroA TO PR E Vincoli multipli su più attributi
Giugno-Pulvirenti AA Vincoli Interrelazionali, Sintassi FOREIGN KEY [NomeChiaveEsterna] “(”Attributo{,Attributo} “)” REFERENCES TabellaRef ON DELETE {NO ACTION,CASCADE,SET NULL} –dove per la TabellaRef e’ stata definita una chiave primaria Quindi: impedisce l’inserimento di tuple con il valore della chiave esterna che non corrisponde ad un valore della chiave primaria della TabellaRef
Giugno-Pulvirenti AA Esempio Riassuntivo CREATE TABLE Clienti ( CodiceCliente CHAR(3) UNIQUE NOT NULL, Nome CHAR(30) NOT NULL, Citta’ CHAR(30) NOT NULL, Sconto INTEGER NOT NULL CHECK(Sconto>0 AND Sconto<100), PRIMARY KEY pk_Clienti(CodiceCliente)) CREATE TABLE Agenti ( CodiceAgente CHAR(3) UNIQUE NOT NULL, Nome CHAR(30) NOT NULL, Zona CHAR(8) NOT NULL, Supervisore CHAR(3), Commissione INTEGER) PRIMARY KEY pk_Agenti(CodiceAgente), CHECK (Supervisore CodiceAgente OR Supervisore IS NULL)
Giugno-Pulvirenti AA Esempio Riassuntivo CREATE TABLE Ordini( NumOrdine CHAR(3) NOT NULL, CodiceCliente CHAR(3) NOT NULL, CodiceAgente CHAR(3) NOT NULL, Data CHAR(8) NOT NULL, Prodotto CHAR(3) NOT NULL, Ammontare INTEGER NOT NULL CHECK (Ammontare > 100) PRIMARY KEY pk-Ordini (NumOrdine) FOREIGN KEY fk_ClienteOrdine (CodiceCliente) REFERENCES Clienti ON DELETE NO ACTION FOREIGN KEY fk_AgenteOrdine (CodiceAgente) REFERENCES Agenti ON DELETE NO ACTION
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL: Viste
Giugno-Pulvirenti AA Viste (View) Oltre alle tabelle di base che fanno parte dello schema si possono creare delle tabelle ausiliarie virtuali Sono “virtuali” in quanto sembrano tabelle a tutti gli effetti ma sono delle relazioni “create al volo” Utilizzate per vari scopi: –Semplificazione –Protezione dati –Scomposizione query complesse –Riorganizzazione dati secondo nuovi schemi –Etc.
Giugno-Pulvirenti AA Definizione VIEW Sintassi creazione VIEW: CREATE VIEW NomeVista [“(” Attributo {,Attributo} “)”] AS Query-Select
Giugno-Pulvirenti AA Esempio definizione VIEW CREATE VIEW MediaVoti (Matricola,Media) AS SELECT Matricola, AVG(Voto) FROM Esami GROUP BY Matricola Esecuzione: SELECT * FROM MediaVoti
Giugno-Pulvirenti AA Le VIEW possono essere usate come tabelle SELECT Nome, Media FROM Studenti, MediaVoti WHERE Studenti.Matricola = MediaVoti.Matricola Le VIEW possono essere distrutte alla pari di tabelle –DROP (TABLE | VIEW) Nome [RESTRICT|CASCADE] –Con RESTRICT non viene cancellata se e’ utilizzata in altre viste –Con CASCADE verranno rimosse tutte le viste che usano la View o la Tabella rimossa –Non tutti i sistemi permettono l’uso di RESTRICT e CASCADE –La distruzione di una VIEW non altera le tabelle su cui la VIEW si basa
Giugno-Pulvirenti AA Le VIEW possono essere usate come tabelle Una VIEW puo’ essere definita sulla base di un’altra VIEW Nelle prime versioni di SQL non era possibile modificare una VIEW tramite Insert, Delete, Update –Non piu’ vero nei nuovi DBMS (Vedremo dopo) Che succede se una tabella usata in una VIEW viene alterata o cancellata (senza specificare RESTRICT o CASCADE)? –Dipende dal DBMS: la VIEW viene marcata ‘inoperative’, oppure La modifica/cancellazione viene negata Etc.
Giugno-Pulvirenti AA Uso delle VIEW per query complesse Semplificare query complesse Esempio: non possiamo scrivere SELECT AVG(COUNT(*)) FROM AGENTI GROUP BY ZONE –AVG deve agire sui valori di un attributo.
Giugno-Pulvirenti AA Uso delle VIEW per query complesse CREATE VIEW AgPerZona (Zona,NumAg) AS SELECT Zona,COUNT(*) FROM AGENTI GROUP BY Zona SELECT AVG(NumAg) FROM AgPerZona DROP AgPerZona
Giugno-Pulvirenti AA Uso delle VIEW per Sicurezza CREATE VIEW EsamiPublici AS SELECT Corso,Voto FROM Esami Data la tabella ClientiBanca(Nome,Indirizzo,Saldo) CREATE VIEW ClientiInd AS SELECT Nome,Indirizzo FROM ClientiBanca
Giugno-Pulvirenti AA Completiamo lo Schema…….. CREATE VIEW OrdiniPerAgente(CodiceAgente, TotaleOrdini) AS SELECT CodiceAgente, SUM(Ammontare) FROM Ordini GROUP BY CodiceAgente CREATE VIEW AgentiConOrdini AS SELECT a.CodiceAgente, a.Nome, a.Zona, a.Supervisore,a.Commissione, v.TotaleOrdini FROM OrdiniPerAgente v, Agenti a WHERE a.CodiceAgente =v.CodiceAgente
Giugno-Pulvirenti AA Mascherare l’organizzazione logica dei dati tramite VIEW Immaginiamo la seguente tabella: –Agenti( CodiceAgente, Nome, Zona, Commissione, Supervisore) Per riorganizzazione aziendale si decide di assegnare un Supervisore ad una zona intera invece del singolo agente 1) CREATE TABLE Zone (Zona CHAR(8), Supervisore CHAR(3)) AS SELECT DISTINCT Zona,Supervisore FROM Agenti 2) CREATE TABLE NuoviAgenti AS SELECT CodiceAgente,Nome,Zona,Commissione FROM Agenti 3) DROP Agenti 4) CREATE VIEW Agenti AS SELECT * FROM NuoviAgenti NATURAL JOIN Zone
Giugno-Pulvirenti AA Aggiornamento delle VIEW Le operazioni INSERT/UPDATE/DELETE sulle VIEW non erano permesse nelle prime edizioni di SQL I nuovi DBMS permettono di farlo con certe limitazioni dovute alla definizione della VIEW stessa Che senso ha aggiornare una VIEW? Dopotutto si potrebbe aggiornare la tabella di base direttamente…
Giugno-Pulvirenti AA Aggiornamento delle VIEW, cont. … utile nel caso di accesso dati controllato Esempio: –Impiegato( Nome, Cognome, Dipart, Ufficio, Stipendio) Il personale della segreteria non puo’ accedere ai dati sullo stipendio ma puo’ modificare gli altri campi della tabella, aggiungere e/o cancellare tuple Si puo’ controllare l’accesso tramite la definizione della VIEW: –CREATE VIEW Impiegato2 AS SELECT Nome, Cognome, Dipart, Ufficio FROM Impiegato INSERT INTO Impiegato2 VALUES (…) –Stipendio verra’ inizializzato a Null –Se Null non e’ permesso per Stipendio l’operazione fallisce
Giugno-Pulvirenti AA Aggiornamento VIEW 2 Immaginiamo la seguente VIEW: CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=‘Rossi’ La seguente operazione ha senso: –INSERT INTO ImpiegatoRossi (…’Rossi’,…)
Giugno-Pulvirenti AA Aggiornamento VIEW 2, cont. Ma che succede nel caso di: –INSERT INTO ImpiegatoRossi (…’Bianchi’,…) –In genere e’ permesso, finisce nella tabella base ma non e’ visibile dalla VIEW –Si puo’ controllare tramite l’opzione “WITH CHECK OPTION”: CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=‘Rossi’ WITH CHECK OPTION Adesso l’insert con ‘Bianchi’ fallisce, quella con ‘Rossi’ viene invece eseguita.
Giugno-Pulvirenti AA Aggiornamento VIEW 3 Consideriamo il seguente caso: –Impiegato( Nome, Cognome, Dipart, Ufficio, Stipendio) –Dipartimenti( Dipart, Indirizzo) –CREATE VIEW IMP_IND AS SELECT Nome, Cognome, d.dipart, indirizzo FROM Impiegato i join Dipartimenti d ON i.Dipart=d.Dipart Un INSERT sulla VIEW IMP_IND dovrebbe inserire su entrambe le tabelle base In alcuni casi potrebbe inserire in una ma non nell’altra In genere quest’operazione non e’ consentita Alcuni DBMS consentirebbero l’INSERT se “Impiegati.Dipart” fosse una foreign key su “Dipartimenti.Dipart” e quest’ultima fosse chiave primaria
Giugno-Pulvirenti AA Aggiornamento VIEW, riepilogo In genere una VIEW definita su una singola tabella e’ modificabile se gli attributi della VIEW contengono la chiave primaria (e altre chiavi) In genere VIEW definite su piu’ tabelle non sono aggiornabili –Alcuni DBMS, come discusso prima, lo permettono nel caso certe condizioni, molto restrittive, siano rispettate VIEW che usano funzioni di aggregazione non sono aggiornabili PRINCIPIO di base per l’aggiornamento delle VIEW: –Ogni riga ed ogni colonna della VIEW deve corrispondere ad una ed una sola riga ed una ed una sola colonna della tabella base