Vincoli di integrità generici

Slides:



Advertisements
Presentazioni simili
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Advertisements

19/01/2014 Viste. 19/01/2014 Viste Le Viste Logiche o Viste o View possono essere definite come delle tabelle virtuali, i cui dati sono riaggregazioni.
SQL: Lezione 7 Nataliya Rassadko
SQL Per la definizione di basi di dati SQL per definire ed amministrare Ogni utente puo definire una base di dati di cui diventa lamministratore potendo.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Basi di dati Claudia Raibulet
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
SQL (IV) Data Definition Language/ Data Manipulation Language.
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
SQL (III) Data Definition Language/ Data Manipulation Language.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Vincoli interrelazionali
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Table View. Problemi ricorrenti Una situazione ricorrente è quella in cui il controller potrebbe avere un’altezza superiore a quella dello schermo. In.
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 24/09/2002.
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
CONTROLLO DELLA CONCORRENZA
Basi di dati - Fondamenti
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
© 2007 SEI-Società Editrice Internazionale, Apogeo
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
ODMG.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
rielaborato da Atzeni-etal., Basi di dati, Capitolo 4
Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 3
Creare tabelle in sql Ripasso!.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Terza Lezione → Navigare nel file System → parte 2
Corso di Basi di Dati Il Linguaggio SQL
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Integrità referenziale
La normalizzazione delle relazioni
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Corso di Basi di Dati Il Linguaggio SQL
Corso di Basi di Dati Il Linguaggio SQL
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
I vincoli di integrità Alcuni aspetti della realtà NON possono essere modellati solamente con entità, attributi e relazioni, per esempio i vincoli di integrità.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Corso di Basi di Dati Il Linguaggio SQL
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
FORMULE E FUNZIONI SU EXCEL
PROGRAMMAZIONE BASH – ISTRUZIONE IF
SAS® OnDemand for Academics SAS Studio
Progettazione logica: Il modello relazionale
OBJECT ORIENTED DATABASE
Access.
Basi di dati - Fondamenti
Partizionamento/accorpamento di concetti
SQL per la modifica di basi di dati
Ricorsione 16/01/2019 package.
Structured Query Language
Definizione di linguaggio di programmazione
Join, una difficoltà Impiegato Reparto Rossi A Neri B Bianchi Reparto
Operatori aggregati e raggruppamenti
Unità 1 Programmi base.
Quantificazione Esistenziale ed Universale
Selezione e Proiezione
Array e Stringhe Linguaggio C.
Docente: Sabato Bufano
Vincoli di Integrità Non tutte le combinazioni possibili di valori dei domini su cui è definita una relazione sono accettabili. Alcuni attributi possono.
Transcript della presentazione:

Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste l’istruzione check (Condizione) La condizione specificata deve essere verificata da tutte le tuple in ogni momento. E’ possibile con check definire tutti i vincoli predefiniti. Però è meno leggibile e non si possono applicare le politiche di reazione alle violazioni. Tuttavia è molto potente Es. Superiore character(6), check (Matricola like “1%” or Dipart = (select Dipart from Impiegato I where I.Matricola=Superiore) )

Check, esempio create table Impiegato ( Matricola character(6), Cognome character(20), Nome character(20), Sesso character not null check (sesso in (‘M’,‘F’)) Stipendio integer, Superiore character(6), check(Stipendio <= (select Stipendio from Impiegato J where Superiore = J.Matricola) )

Asserzioni Le asserzioni sono vincoli che fanno parte dello schema e non sono associati ad alcun attributo o tabella. Permettono di definire tutti i vincoli utilizzabili nella definizione di una tabella, ma anche vincoli su più tabelle o vincoli che richiedono che una tabella abbia certe caratteristiche (es. una certa cardinalità). create assertion NomeAsserzione check(Condizione) Es. create assertion AlmenoUnImpiegato check (1 <= (select count(*) from Impiegato))

Asserzioni Ogni vincolo di integrità è associato ad una politica di controllo che specifica se è immediato o differito. Se è immediato è verificato immediatamente dopo una modifica. Se è differito solo al termine dell’esecuzione di una serie di operazioni (transazione). Se un vincolo immediato viene violato, l’operazione di modifica può essere annullata immediatamente (rollback parziale). Tutti i vincoli predefiniti sono immediati. Se invece è differito al momento in cui si verifica la violazione non è più possibile identificare l’operazione che l’ha causata e quindi va annulllata tutta la transazione (rollback). Questo garantisce la consistenza della base di dati. Per cambiare il tipo di controllo: set constraints [NomeVincolo] immediate set constraints [NomeVincolo] deferred

Viste Le viste sono tabelle virtuali ricavate da informazioni contenute in altre tabelle. Nella definizione possono essere contenute anche altre viste purché non vi siano dipendenze ricorsive o immediate (una vista non può dipendere da se stessa), né transitive. create view NomeVista [(ListaAttributi)] as SelectSQL [ with [ local | cascaded] check option ] La query SQL deve restituire un numero di attributi pari a quelli contenuti nello schema; l’ordine degli attributi nella target list deve rispettare quello dello schema

Viste Es. create view ImpiegatiAmmin (Matricola, Nome, Cognome, Stipendio) as select Matricola, Nome, Cognome, Stipendio from Impiegato where Dipart = ‘Amministrazione’ and Stipendio > 10 Su certe viste è possibile fare modifiche che alterano le tabelle che le compongono. Ci sono problemi se la vista è definita tramite un join. SQL permette la modifica di una vista solo se una sola riga di ciascuna tabella di base corrisponde a una riga della vista. Di solito si richiede che sia definita su una sola tabella e/o che contenga almeno una chiave primaria.

Viste check option richiede che si facciano modifiche solo sulle righe della vista e che le righe continuino ad appartenere alla vista dopo le modifiche. Se una vista è definita in termini di altre viste l’opzione local o cascaded specifica se il controllo debba coinvolgere solo la vista più esterna o se deve essere propagato a tutti i livelli. Il default è cascaded. Quindi se è specificata la check option ogni comando di aggiornamento per essere propagato non deve eliminare righe dalla vista.

Viste Le viste consentono anche di creare interrogazioni altrimenti impossibili da definire. Es. create view BudgetStipendi(Dip,TotaleStipendi) as select Dipart, sum(Stipendio) from Impiegato group by Dipart Trovare il dipartimento che ha la massima somma degli stipendi select Dip from BudgetStipendi where TotaleStipendi = (select max(TotaleStipendi) from BudgetStipendi)

Controllo degli accessi SQL prevede la definizione di utenti, per assegnare diversi privilegi. Gli utenti possono essere gli stessi del sistema su cui è attivo il server SQL, oppure indipendenti dal sistema. Ogni componente del sistema è proteggibile, di solito si proteggono le tabelle. Il controllo degli accessi è basato sul concetto di privilegio, caratterizzato da: risorsa cui si riferisce utente che concede il privilegio utente che lo riceve azione che viene permessa possibilità di trasmettere o meno il privilegio ad altri utenti

Controllo degli accessi Il creatore di una risorsa ha tutti i privilegi, al momento della sua creazione. Esiste anche un utente “speciale” _system, che ha tutti i privilegi su tutte le risorse in qualsiasi momento. I privilegi sono: insert, (applicabile a tabelle o viste) inserisce un nuovo oggetto nella risorsa update (tabelle viste attributi) aggiorna il valore di un oggetto delete (tabelle e viste) rimuove un oggetto select (tabelle, viste, attributi) permette di leggere la risorsa references (tabelle ed attributi) permette che venga fatto riferimento ad una risorsa nell’ambito della definizione dello schema di una tabella. usage (domini) permette che venga usata la risorsa drop e alter sono riservati al creatore degli oggetti cui si applicano

Controllo degli accessi I comandi per concedere o revocare privilegi sono grant e revoke grant Privilegi on Risorsa to Utenti [with grant option] concede i Privilegi sulla Risorsa agli Utenti Es. grant select on Dipartimento to Stefano concede all’utente Stefano il privilegio di select sulla tabella Dipartimento. Se si specifica anche with grant option l’utente può propagare i diritti anche ad altri. La parola chiave all privileges specifica tutti i possibili privilegi. revoke Privilegi on Risorsa from Utenti[restrict|cascade] fa l’operazione inversa. Con restrict si impedisce che la revoca provochi altre revoche, con cascade si concede.

SQL e linguaggi di programmazione L’interazione con l’ambiente SQL può avvenire in 3 modi: in modo interattivo col server attraverso interfacce o linguaggi ad hoc legati a particolari DBMS attraverso i normali linguaggi di programmazione In quest’ultimo caso è necessario che un preprocessore si occupi di riconoscere in un sorgente il codice SQL e lo trasformi in codice del linguaggio che si sta usando. Uno dei problemi che sorgono è il fatto che SQL è orientato agli insiemi mentre i linguaggi di programmazione, ad eccezione di alcuni linguaggi ad oggetti, possono essere soltanto orientati alle tuple, poiché dovranno scandirle una per una per eseguire un comando SQL. Si può ovviare a questo o con linguaggi ad oggetti che supportino operazioni evolute sugli insiemi o mediante i cursori.

Cursori I cursori estendono SQL in modo tale da fornire la possibilità ad un programma di accedere alle tabelle una riga alla volta. declare NomeCursore [scroll] cursor for SelectSQL [for < read only | update [ of Attributo { , Attributo } ] > ] associa un cursore ad una interrogazione. scroll indica se il programma può spostarsi liberamente nell’interrogazione for update specifica se il cursore deve essere usato in un comando di modifica o in sola lettura.

Cursori open NomeCursore attiva l’interrogazione cui è collegato il cursore e permette di accedere al risultato tramite il comando fetch [ Posizione from ] NomeCursore into ListadiFetch che prende una riga dal cursore e la ripone nelle variabili della ListadiFetch. La corrispondnza fra attributi e variabili è per posizione. Quando si parla di riga corrente si intende l’ultima letta. Posizione può assumere i valori: next (il cursore legge la riga successiva alla corrente) prior (la precedente) first (la prima) last (l’ultima) absolute EsprIntera (la i-esima, i è il risultato dell’espressione) relative EsprIntera (la i-esima rispetto alla corrente)

Cursori Le opzioni di posizione viste possono essere usate solo se è stata specificata l’opzione scroll. Altrimenti solo next. In quel caso l’implementazione è più efficiente. update e delete possono usare i cursori. update NomeTabella set Attributo = < Espressione | null | default > {, Attributo = < Espressione | null | default > } where current of NomeCursore delete from NomeTabella where current of NomeCursore close NomeCursore chiude il cursore e libera la memoria dalla copia del risulatto della query cui è collegato. Se la query restituisce solo una riga si può evitare il cursore e usare select ListaAttributi into ListaVariabili

SQL dinamico In molti casi è necessario formulare interrogazioni arbitrarie, non solo parametrizzabili, ma anche dipendenti ad esempio dallo stato dell’esecuzione di un programma. Le interrogazioni che si possono formulare attraverso le istruzioni viste sinora sono di tipo statico, cioè scritte una volta per tutte. L’SQL dinamico consente di costruire interrogazioni al momento dell’esecuzione di un programma. In SQL statico, i comandi vengono compilati una volta per tutte. Questo si traduce in elevata efficienza. In SQL dinamico, per ottimizzare l’efficienza di un programma, sono previste due modalità di esecuzione.

SQL dinamico execute immediate IstruzioneSQL Questo comando provoca l’esecuzione immediata dell’istruzione e può quindi essere usato solo per comandi che non richiedono parametri in ingresso o in uscita. Es. in C istruzioneSQL= “delete from Dipartimento where Nome = ‘Amministrazione’ ”; $ execute immediate :istruzioneSQL Se il comando viene eseguito più volte o il programma deve gestire uno scambio di parametri bisogna distinguere 2 fasi: preparazione ed esecuzione.

SQL dinamico Fase di preparazione prepare NomeComando from IstruzioneSQL fa analizzare l’istruzione e la fa tradurre nel linguaggio procedurale del sistema. Gli eventuali parametri sono sostituiti da ? prepare :comando from “select Città from Dipartimento where Nome = ? ” Quando non serve più l’istruzione è possibile deallocare la memoria deallocate prepare NomeComando deallocate prepare :comando

SQL dinamico Fase di esecuzione execute NomeComando [ into ListaTarget ] [ using ListaParametri ] La lista dei target contiene le variabili in cui deve essere inserito il risultato dell’esecuzione del comando. La lista dei parametri specifica i valori che devono essere assunti dai parametri della funzione. execute :comando into :citta using :dipartimento diventa, se :dipartimento assume il valore ‘Produzione’ select Città from Dipartimento where Nome = ‘Produzione’

SQL dinamico e cursori I cursori vengono utilizzati come in SQL statico, con la sola differenza che si associa al cursore l’identificativo dell’interrogazione invece che l’interrogazione stessa e che si possono usare using e into per specificare i valori dei parametri di ingresso e uscita. Es. prepare :comando from :istruzioneSQL declare Cursore cursor from :comando open Cursore using :nome1