SQL: Amministrazione e Viste

Slides:



Advertisements
Presentazioni simili
DBMS (DataBase Management System)
Advertisements

SQL applicato a SQL Server
Sicurezza e concorrenza nelle basi di dati
Stored Procedure Function Trigger
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
Algoritmi e Programmazione
DOCUMENTAZIONE DI SCHEMI E/R
Biglietti: schema E/R.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Asserzioni, Viste & Triggers
Basi di dati attive Dispongono di un sottosistema integrato per definire e gestire regole di produzione (regole attive) Regole di tipo: Evento-Condizione-Azione.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
1 SQL come linguaggio di definizione di dati Eugenio Di Sciascio.
SQL Structured Query Language
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.
Elementi di PL/SQL.
Corso di Informatica (Basi di Dati)
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill,
Basi di dati attive Paolo Atzeni.
SQL: Lezione 7 Nataliya Rassadko
Aspetti sistemistici dellSQL. SQL environment Un SQL environment è un framework dove esistono dati e possono aversi istruzioni SQL eseguite su questi.
Basi di dati (modulo 2) Prof. Giovanni Giuffrida
SQL Per la modifica di basi di dati
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.
MODELLO RELAZIONALE.
Le transazioni Itis Max Planck.
Equivalenza di espressioni
Modello Relazionale Definisce tipi attraverso il costruttore relazione, che organizza i dati secondo record a struttura fissa, rappresentabili attraverso.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
SQL SQL (pronunciato anche come l’inglese sequel) è l’acronimo di Structured Query Language (linguaggio di interrogazione strutturato) E’ un linguaggio.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Transazioni.
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.
Creazione e manipolazione tabelle. TABELLE una tabella può essere creata in qualsiasi momento,anche quando gli utenti stanno usando il database la struttura.
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.
Gerarchie Ricorsive Una gerarchia ricorsiva deriva dalla presenza di una ricorsione o ciclo (un anello nel caso più semplice) nello schema operazionale.
Corso di Basi di Dati Il Linguaggio SQL Home page del corso:
Basi di Dati e Sistemi Informativi
sql: esempi di linguaggio sql nell'implementazione mysql
1 Il Linguaggio SQL Il Linguaggio SQL Prof. Lorenzo Vita, Ing. Luigi Testa.
Basi di Dati e Sistemi Informativi Il Linguaggio SQL Home page del corso:
BIOINFO3 - Lezione 41 ALTRO ESEMPIO ANCORA Progettare il comando di creazione di una tabella di pubblicazioni scientifiche. Come chiave usare un numero.
Basi di dati - Modelli e linguaggi di interrogazione- Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Copyright © The McGraw-Hill.
CORSI DI FORMAZIONE - Basi di Dati: MySql - Parte 4 - Dicembre Utenti e privilegi del database - 1 Root è lutente amministratore predefinito, ma.
Dati e DBMS DBMS relazionali SQL Progettazione di una base di dati Programma del Corso.
SQL (IV) Data Definition Language/ Data Manipulation Language.
FUNZIONI Dichiarazione: Definizione:
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
Introduzione a Javascript
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.
ATOMICITÀ Il tipo di atomicità di un programma PL/SQL è stabilito dall’ambiente chiamante oppure dal programma Gestione atomicità: –COMMIT –SAVEPOINT nome_punto.
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
SQL (III) Data Definition Language/ Data Manipulation Language.
MySQL Database Management System
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
Nozione ed uso Operazioni eseguite automaticamente ogni volta che avviene un certo evento Uso: –Gestione di vincoli di integrità: Per fallimento Per modifica.
Elementi di PL/SQL. Pl/Sql Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione procedurale di Oracle che costituisce.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Transazioni in MySQL 4 Transazioni in MySQL 4
Vincoli interrelazionali
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL: Amministrazione e Viste.
Basi di Dati e Sistemi Informativi Esercitazione: Il Linguaggio SQL (DDL+DML) Home page del corso:
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
Basi di Dati attive. Sistemi Informativi DEE - Politecnico di Bari E. TinelliBasi di dati attive2 Definizione Una base di dati si dice attiva quando dispone.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Transcript della presentazione:

SQL: Amministrazione e Viste

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 Create Table CREATE TABLE Nome “(“Attributo Tipo[Vincolo {,Vincolo}] {,Attributo Tipo[Vincolo {,Vincolo}]}”)” [VincoloDiTabella {, VincoloDiTabella}] Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 Domini Domini elementari (predefiniti) Domini definiti dall'utente (semplici, ma riutilizzabili) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 CREATE DOMAIN, esempio CREATE DOMAIN Voto AS SMALLINT DEFAULT NULL CHECK ( value >=18 AND value <= 30 ) Giugno-Pulvirenti AA 2005-2006

Vincoli intrarelazionali NOT NULL UNIQUE definisce chiavi PRIMARY KEY: chiave primaria (una sola, implica NOT NULL) CHECK, vedremo più avanti Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 UNIQUE e PRIMARY KEY due forme: nella definizione di un attributo, se forma da solo la chiave come elemento separato Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

PRIMARY KEY, alternative Matricola CHAR(6) PRIMARY KEY Matricola CHAR(6), …, PRIMARY KEY (Matricola) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Chiavi su più attributi, attenzione Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, UNIQUE (Cognome,Nome), Nome CHAR(20) NOT NULL UNIQUE, Cognome CHAR(20) NOT NULL UNIQUE, Non è la stessa cosa! Giugno-Pulvirenti AA 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 Matricola 3987 3295 9345 Vigili Cognome Rossi Neri Nome Luca Piero Mario Mori Gino 7543 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 Auto Prov Numero MI TO PR 39548K E39548 839548 Cognome Rossi Neri Nome Mario Luca Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Modifiche degli schemi ALTER DOMAIN ALTER TABLE DROP DOMAIN DROP TABLE ... Giugno-Pulvirenti AA 2005-2006

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 2005-2006

SQL, operazioni sui dati interrogazione: SELECT modifica: INSERT, DELETE, UPDATE Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Insert INSERT INTO Tabella [“(”Attributo {,Attributo} “)”] VALUES “(” Valore {,Valore} “)” Esempio INSERT INTO Esami VALUES (‘DB1’, 123456, 27) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Delete DELETE FROM Tabella WHERE Condizione Esempio: DELETE FROM Esami WHERE Matricola = 123456 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Update UPDATE Tabella SET Attributo = Espr {,Attributo = Espr} WHERE Condizione Esempio: UPDATE Aule SET Aula = 126 WHERE Aula = 3 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempi CREATE TABLE Studenti( Nome CHAR(30), Matricola INTEGER, Indirizzo CHAR(30), Telefono INTEGER) CREATE TABLE FuoriCorso LIKE Studenti Giugno-Pulvirenti AA 2005-2006

Altri modi di definire tabelle CREATE TABLE Nome AS EsprSelect Esempio: CREATE TABLE EsamiBuoni LIKE Esami AS SELECT * FROM Esami WHERE Voto > 27 Giugno-Pulvirenti AA 2005-2006

SQL: vincoli d’Integrità

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

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 2005-2006

Esempio di DB semanticamente errato Studente Voto Lode Corso 32 01 276545 30 e lode 02 787643 27 03 739430 24 04 Esami 32 27 e lode 739430 Matricola 276545 787643 Cognome Rossi Neri Bianchi Nome Mario Piero Luca Studenti 787643 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 anche per attributi diversi della stessa n-upla Giugno-Pulvirenti AA 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 3987 3987 3295 3295 3295 9345 9345 Matricola 3987 3295 9345 Vigili Cognome Rossi Neri Nome Luca Piero Mario Mori Gino 7543 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 MI TO PR 39548K E39548 839548 Auto Prov Numero MI TO PR 39548K E39548 839548 Cognome Rossi Neri Nome Mario Luca MI TO PR 39548K E39548 839548 Giugno-Pulvirenti AA 2005-2006

Vincolo di integrità referenziale Un vincolo di integrità referenziale (“foreign key”) fra gli attributi X di una relazione R1 e un’altra relazione R2 impone ai valori su X in R1 di comparire come valori della chiave primaria di R2 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 Giugno-Pulvirenti AA 2005-2006

Violazione di vincolo di integrità referenziale Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 TO E39548 Auto Prov Numero MI TO PR E39548 F34268 839548 Cognome Rossi Neri Nome Mario Luca TO E39548 Giugno-Pulvirenti AA 2005-2006

Integrità referenziale e valori nulli Impiegati Matricola Cognome Progetto 34321 Rossi IDEA 53524 Neri XYZ 64521 Verdi NULL 73032 Bianchi IDEA Progetti Codice Inizio Durata Costo IDEA 01/2000 36 200 XYZ 07/2001 24 120 BOH 09/2001 24 150 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Rifiuto della cancellazione Impiegati Matricola 34321 64521 53524 Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032 Bianchi 53524 53524 Neri XYZ Neri XYZ Progetti Codice IDEA BOH XYZ Inizio 01/2000 07/2001 09/2001 Durata 36 24 Costo 200 120 150 XYZ 07/2001 24 120 La transazione fallisce e XYZ non puo’ essere cancellato dalla relazione Progetti Giugno-Pulvirenti AA 2005-2006

Eliminazione in cascata Impiegati Matricola 34321 64521 53524 Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032 Bianchi 53524 Neri XYZ Progetti Codice IDEA BOH XYZ Inizio 01/2000 07/2001 09/2001 Durata 36 24 Costo 200 120 150 XYZ 07/2001 24 120 La transazione termina e XYZ viene cancellato anche dalla relazione Impiegati Giugno-Pulvirenti AA 2005-2006

Introduzione di valori nulli Impiegati Matricola 34321 64521 53524 Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032 Bianchi NULL Progetti Codice IDEA BOH XYZ Inizio 01/2000 07/2001 09/2001 Durata 36 24 Costo 200 120 150 XYZ 07/2001 24 120 La transazione termina e all’attributo Impiegati.Progetto viene assegnato NULL Giugno-Pulvirenti AA 2005-2006

Vincoli multipli su più attributi Incidenti Codice Data ProvA NumeroA ProvB NumeroB 34321 1/2/95 TO E39548 MI 39548K 64521 5/4/96 PR 839548 TO E39548 Auto Prov Numero MI TO PR 39548K E39548 839548 Cognome Rossi Neri Nome Mario Luca Giugno-Pulvirenti AA 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 Giugno-Pulvirenti AA 2005-2006

SQL: Viste

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

Giugno-Pulvirenti AA 2005-2006 Definizione VIEW Sintassi creazione VIEW: CREATE VIEW NomeVista [“(” Attributo {,Attributo} “)”] AS Query-Select Giugno-Pulvirenti AA 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 2005-2006

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 3) DROP Agenti 4) CREATE VIEW Agenti AS SELECT * FROM NuoviAgenti NATURAL JOIN Zone Giugno-Pulvirenti AA 2005-2006

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 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

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 2005-2006

Giugno-Pulvirenti AA 2005-2006 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 2005-2006

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 Giugno-Pulvirenti AA 2005-2006

SQL: Procedure e Trigger

Aspetti procedurali dei DBMS Procedure: Programmi memorizzati nel DBMS che vengono eseguiti su esplicita richiesta degli utenti. Trigger: Programmi memorizzati nel DBMS che vengono attivati automaticamente dopo le operazioni di modifica sulle tabelle Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Procedure Possono essere costituite da un unico comando SQL parametrizzato I moderni DBMS offrono un linguaggio procedurale piu’ ricco Oracle: PL/SQL Sybase: Transact/SQL IBM-DB2 MySQL (Ver.5)?? Possono anche essere scritte in linguaggi standard: C/C++, Java Compilate come oggetti esterni integrati dal DBMS In alcuni casi possono eseguire azioni esterne: Cancellare un file Spedire un’email Giugno-Pulvirenti AA 2005-2006

Linguaggio procedurale Complementano la natura dichiarativa di SQL Costrutti tipo: FOR, WHILE, LOOP, IF, etc. Scansione iterativa di tabelle Giugno-Pulvirenti AA 2005-2006

Esempio linguaggio procedurale DB2 Comando IF/THEN BEGIN ATOMIC DECLARE cur INT; SET cur = MICROSECOND(CURRENT TIMESTAMP); IF cur > 600000 THEN UPDATE staff SET name = CHAR(cur) WHERE id = 10; ELSEIF cur > 300000 THEN WHERE id = 20; ELSE WHERE id = 30; END IF; END Giugno-Pulvirenti AA 2005-2006

Esempio linguaggio procedurale DB2 Comando FOR per scansione tabella BEGIN ATOMIC FOR V1 AS SELECT dept AS dname, max(id) AS max_id FROM staff GROUP BY dept HAVING COUNT(*) > 1 ORDER BY dept DO UPDATE staff SET id = id * -1 WHERE id = v1.max_id; UPDATE staff SET dept = dept / 10 WHERE dept = v1.dname AND dept < 30; END FOR; END Giugno-Pulvirenti AA 2005-2006

Esempio linguaggio procedurale DB2 Comando WHILE per scansione tabella BEGIN ATOMIC DECLARE c1, C2 INT DEFAULT 1; WHILE c1 < 10 DO WHILE c2 < 20 DO SET c2 = c2 + 1; END WHILE; SET c1 = c1 + 1; UPDATE staff SET salary = c1 ,comm = c2 WHERE id = 10; END Giugno-Pulvirenti AA 2005-2006

Vantaggi delle procedure Consentono di condividere fra gli utenti delle attivita’ comuni, in modo da centralizzare la manutenzione, la modifica etc.. Unificano la semantica di certe operazioni sul DB per ogni applicazione Possono controllare in modo centralizzato certi vincoli d’integrita’ non esprimibili nelle tabelle. Giugno-Pulvirenti AA 2005-2006

Vantaggi delle procedure Riducono il traffico sulla rete dovuto ad applicazioni remote, infatti invece di agire interattivamente con il DBMS l’utente spedisce una volta per tutte una chiamata alla procedura ricevendone la risposta. Garantiscono la sicurezza dei dati consentendo a certi utenti di accedere ai dati attraverso certe procedure e non direttamente Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Basi di dati “Attive” Trigger: Regole basate sul paradigma Event-Condition-Action (ECA) incorporate nella base di dati Struttura tipica di una regola/trigger: when Event if Condition then Action I DBMS attivi hanno un comportamento “reattivo” in contrasto col passivo della basi di dati tradizionali Eseguono sia transazioni utente che trigger I trigger sono simili alle procedure ma vengono invocati automaticamente in seguito alle operazioni di modifica della base di dati (INSERT/DELETE/UPDATE) Fanno parte della definizione della base di dati Arricchiscono semanticamente lo schema relazionale Giugno-Pulvirenti AA 2005-2006

Basi di dati “Attive”, cont. La loro sintassi e’ stata standardizzata in SQL-1999 Sistemi relazionali commerciali (e non) includono i trigger fin dagli anni 80 Cio’ ha causato difformita’ di sintassi difficilmente riconciliabile non esiste ancora un’implementazione “Standard” da un punto di vista sintattico Estensione del “CHECK” in quanto permettono di operare (modificare) su altre tabelle Possono anche scatenare azioni esterne al DB Spedire email, cancellare file, etc. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Utilizzo trigger Business rules, parte della procedura “di business” applicativa (normalmente eseguite in modo asincrono dall’applicazione) Automazione magazzino con riordino automatico Spedizione solleciti Controllo attivita’ conti bancari/carte di credito Acquisto/Vendita automatica strumenti finanziari Auditing e Logging, memorizzazione eventi per controlli Esempi: Storico delle modifiche effettuate su una tabella per recupero dati Elenco dei login effettuati (da chi e quando) Controllo delle attivita’ (chi ha fatto cosa e quando) Etc. Version Management Conservare varie versioni dello stato della base di dati nel tempo Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Utilizzo Trigger Duplicazione database trasparente tramite l’uso dei trigger Implementazione database distribuiti Vincoli d’integrita’ complessi non esprimibili con il comando “CHECK” Workflow management Esempio: Assegnare sostituto per chiamate d’urgenza Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Trigger Passivi Sono quelli che segnalano un fallimento. Sono di due tipi: Quelli che definiscono vincoli non esprimibili direttamente (ad esempio quelli dinamici) Quelli che controllano le operazioni degli utenti basandosi sui parametri della query.Ad esempio si possono inserire dati solo se (il codice del)la zona e’ quella dell’utente che esegue l’inserimento. Giugno-Pulvirenti AA 2005-2006

Paradigma Event-Condition-Action Semantica operativa: Quando succede l’evento… … se la condizione e’ soddisfatta… … esegui l’azione specificata Event: Aggiornamento dati tramite INSERT, UPDATE o DELETE Condition: Predicato SQL Opzionale Action: Sequenza di comandi SQL o SQL procedurale, ROLLBACK, etc. Ogni trigger e’ associato ad una sola tabella e viene attivato dalle operazioni dirette a quella tabella Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempi trigger Espressi in sintassi non-standard: CREATE RULE ControlloStipendio ON Impiegati WHEN Inserted, Deleteted, Updated(Stipendio) IF (select avg(stipendio) from impiegati) > 100 THEN update impiegati set stipendio=stipendio * 0.9 CREATE RULE ControlloRicchi ON Impiegati WHEN Inserted IF EXISTS ( select * from INSERTED where stipendio>100) THEN Insert into ImpiegatiRicchi ( select * from INSERTED where stipendio>100) Giugno-Pulvirenti AA 2005-2006

Esempio esecuzione trigger Aldo 90 Maria Luca 110 La tabella impiegati inizialmente: Inseriamo: (Piero, 150) e (Mario, 120) Aldo 90 Maria Luca 110 Piero 150 Mario 120 Aldo 81 Maria Luca 99 Piero 135 Mario 108 Il trigger ControlloStipendio parte: … Giugno-Pulvirenti AA 2005-2006

Esempio esecuzione trigger,cont Il trigger ControlloStipendio parte di nuovo: Ricorsione Aldo 73 Maria Luca 89 Piero 121 Mario 97 Inoltre, alla fine la tabella ImpiegatiRicchi conterra’: Piero 121 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Problemi con i Trigger I sistemi commerciali adottano diverse semantiche per l’attivazione dei trigger e diversi modi di interazione fra i meccanismi di attivazione. Ecco le principali differenze: Granularita’: Se la modifica riguarda un insieme di n-uple (come con INSERT,UPDATE e DELETE), allora in certi sistemi il trigger viene eseguito una sola volta (trigger di comando) in altri sistemi viene eseguito tante volte quante sono le n-uple modificate (trigger di riga). In ORACLE e’ possibile scegliere con FOR EACH ROW. Invece in Sybase e’ attivato una sola volta per comando . In questo caso si usano le tabelle inserted e deleted contenenti le righe inserite e cancellate (un’update e’ considerata la coppia cancellazione seguita da una corrispondente inserzione) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Granularita’ Due tipi: Row-level Statement-level Il trigger viene eseguito una volta per ogni tupla coinvolta nell’operazione di modifica Il trigger viene eseguito una sola volta per tutte le tuple coinvolte Richiedono una sintassi diversa Row-level: Riferimento ad una riga sola Statement-level: Riferimento ad una tabella Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempio CREATE TRIGGER cancellaAgente AFTER DELETE ON Agenti FOR EACH ROW BEGIN DELETE Totali WHERE CodiceAgente = :old.CodiceAgente; END; Diventa in Sybase CREATE TRIGGER cancellaAgente AFTER DELETE ON Agenti BEGIN DELETE Totali WHERE CodiceAgente IN (SELECT deleted.CodiceAgente FROM deleted) END; Giugno-Pulvirenti AA 2005-2006

Tuple e Tabelle di transizione Tuple e tabelle temporanee visibili all’interno del trigger eseguito che contengono la porzione di dati manipolati dal comando SQL che ha attivato il trigger Servono per accedere ai dati manipolati dal comando che ha scatenato il trigger Vengono usate in modo standard dall’SQL del trigger Possono essere usate sia nella condizione che nell’azione Nella granularita’ statement-level il trigger usa delle tabelle di transizione: DELETE: Una tabella di transizione con tutte le tuple cancellate INSERT: Una tabella di transizione con tutte le tuple inserite UPDATE: Una tabella di transizione con tutte le tuple con i vecchi valori ed una con tutte le tuple con i nuovi valori Nella granularita’ row-level il trigger usa delle tuple di transizione: DELETE: Una per la tupla cancellata INSERT: Una per la tupla inserita UPDATE: Una per la tupla con i vecchi valori ed una con i nuovi valori Giugno-Pulvirenti AA 2005-2006

Modo di esecuzione del trigger Indica se far partire il trigger prima (BEFORE) o dopo (AFTER) l’esecuzione fisica del comando impartito BEFORE viene normalmente usato per modificare i dati del comando impartito prima dell’esecuzione (fisica) del comando stesso… (vedi esempio) In genere limitato nei comandi che puo’ eseguire AFTER Molto piu’ comune Pieno accesso all’SQL e SQL procedurale Giugno-Pulvirenti AA 2005-2006

Esempio Trigger BEFORE in DB2 CREATE TRIGGER T1 NO CASCADE BEFORE INSERT ON IMPIEGATO REFERENCING NEW AS N //come chiamare le nuove tuple FOR EACH ROW WHEN ( N.STIPENDIO > (SELECT MAX(STIPENDIO) FROM IMPIEGATO)) SET N.STIPENDIO = (SELECT MAX(STIPENDIO) FROM IMPIEGATO) Giugno-Pulvirenti AA 2005-2006

Esempio granularita’ per AFTER in DB2 create table progetti( codice char(10) not null primary key, Inizio date, Durata int, Costo int ) create table progetti_cancellati( codice char(10) not null, cancellato_il date with default current date create trigger storico_prog_canc after delete on progetti referencing old as o for each row begin atomic insert into progetti_cancellati values( o.codice, current date); end create trigger storico_prog_canc2 referencing old_table as o for each statement select codice, current date from o; Giugno-Pulvirenti AA 2005-2006

Esecuzione del trigger Immediata Non appena il comando viene eseguito Nel mezzo della transazione Fa parte della stessa transazione Differita Esecuzione rimandata alla fine della transazione Disaccoppiata Esecuzione del trigger fa parte di una transazione separata, viene quindi eseguito anche se la transazione precedente fallisce Non disponibile in tutti i sistemi Nota che questi modi di esecuzione possono essere in conflitto con la semantica del BEFORE/AFTER Dipende dal DBMS Giugno-Pulvirenti AA 2005-2006

Esempio sintassi trigger Oracle Sintassi Oracle: CREATE TRIGGER NomeTrigger TipoTrigger (TipoOperazione{OR TipoOperazione}) [OF Attributo] ON NomeTabella [FOR EACH ROW] [WHEN “(”Condizione“)”] Procedura in PL/SQL TipoTrigger ::= (BEFORE|AFTER) TipoOperazione ::= (DELETE|INSERT|UPDATE) FOR EACH ROW specifica che l’azione deve essere ripetuta su ogni n-upla (oppure una volta per tutte) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 About PL/SQL PL/SQL e’ un’estensione di SQL con delle caratteristiche di linguaggi programmazione . I comandi SQL sono inclusi in unita’ procedurali di codice. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Benefici di PL/SQL Integrazione Applicazione Libreria condivisa Oracle Server Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Benefici di PL/SQL Prestazioni Elevate SQL Altri DBMS Applicazione SQL SQL SQL SQL IF...THEN ELSE END IF; Oracle con PL/SQL Applicazione Giugno-Pulvirenti AA 2005-2006

Benefici di PL/SQL Modularizzazione programmi DECLARE BEGIN EXCEPTION END; Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Benefici di PL/SQL Portabile. Possono essere dichiarati identificatori. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Benefici di PL/SQL Si puo’ programmare con un linguaggio procedurale che possiede strutture di controllo. Consente la gestione degli errori. Giugno-Pulvirenti AA 2005-2006

PL/SQL Struttura Blocco DECLARE – Opzionale Variabili, cursori, eccezioni definite dall’utente BEGIN – Obbligatorio Comandi SQL Comandi PL/SQL EXCEPTION – Opzionale Azioni da effettuare in caso di errori END; – Obbligatorio DECLARE BEGIN EXCEPTION END; Giugno-Pulvirenti AA 2005-2006

PL/SQL Struttura Blocco DECLARE v_variable VARCHAR2(5); BEGIN SELECT column_name INTO v_variable FROM table_name; EXCEPTION WHEN exception_name THEN ... END; DECLARE BEGIN EXCEPTION END; Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Tipi di Blocchi Anonimi Procedure Funzioni [DECLARE] BEGIN --statements [EXCEPTION] END; PROCEDURE name IS BEGIN --statements [EXCEPTION] END; FUNCTION name RETURN datatype IS BEGIN --statements RETURN value; [EXCEPTION] END; Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempio Oracle PL/SQL Supponiamo che non si accettano ordini con uno scoperto >2.500 CREATE TRIGGER ControlloFido BEFORE INSERT ON Ordini DECLARE DaPagare NUMBER; BEGIN SELECT SUM(Ammontare) INTO DaPagare FROM Ordini WHERE CodiceCliente = :new.CodiceCliente; IF DaPagare > 2.500 - :new.Ammontare THEN RAISE_APPLICATION_ERROR (-2061, ‘fido superato’); END IF; END :new valore da inserire o modificato, :old e’ il valore precedente Giugno-Pulvirenti AA 2005-2006

Creazione ed aggiornamento automatico di una tabella CREATE TABLE Totali(CodiceAgente CHAR(3), TotaleOrdini INTEGER) CREATE TRIGGER aggiornaTotali AFTER INSERT ON Ordini FOR EACH ROW DECLARE esiste NUMBER; BEGIN SELECT COUNT(*) INTO esiste FROM Totali WHERE CodiceAgente = :new.CodiceAgente; IF esiste = 0 $agente non ancora presente$ THEN INSERT INTO Totali VALUES (:new.CodiceAgente, :new.Ammontare); ELSE UPDATE Totali SET TotaleOrdini = TotaleOrdini + :new.Ammontare WHERE CodiceAgente = :new.CodiceAgente; END; Giugno-Pulvirenti AA 2005-2006

Cancellazione automatica Per cancellare la riga dei Totali relativa ad un agente che viene licenziato CREATE TRIGGER cancellaAgente AFTER DELETE ON Agenti FOR EACH ROW BEGIN DELETE FROM Totali WHERE CodiceAgente = :old.CodiceAgente; END; Nota che per il DELETE e’ stato usato “:old” Giugno-Pulvirenti AA 2005-2006

Vantaggi sull’uso dei Trigger Knowledge Independence, si semplificano le applicazioni che non devono fare i controlli dei trigger Permettono di centralizzare i controlli che quindi non possono essere evitati dagli utenti del DB Arricchimento semantico della base di dati Il controllo diventa parte della transazione stessa, se il controllo fallisce l’intera transazione fallisce Puo’ anche essere eseguito in ‘differita’ su alcuni DBMS Giugno-Pulvirenti AA 2005-2006

Problemi di Applicabilita’ dei Trigger Complessita’: Bisogna conoscere tutti gli effetti diretti ed indiretti dell’azione del trigger (ancora peggio per quelli che attivano altri trigger in cascata) Rigidita’: Si potrebbe volere occasionalmente una eccezione al trigger, ma non si puo’ evitare l’attivazione del trigger Debugging: Difficile da eseguire, manca un sistema di controllo e debugging in genere Stessi problemi dei linguaggi dichiarativi (CLIPS, OPS5) Giugno-Pulvirenti AA 2005-2006

Altri problemi semantici Risoluzione di conflitti. Piu’ trigger sono attivabili allo stesso momento. Varie politiche di gestione L’ordine di esecuzione e’ quello di definizione (ORACLE) L’utente specifica un ordine per ogni trigger (e.g., after trig1) Gestito arbitrariamente dal sistema Trigger in Cascata. Trigger si attivano a vicenda, ricorsivamente. Varie politiche di gestione Non permesso Limitazione del numero di attivazioni Dinamico (Sybase) ammette la ricorsione. In ORACLE la ricorsione e’ vietata. Giugno-Pulvirenti AA 2005-2006

Interazione con le transazioni Se il trigger interagisce con la transazione che l’attiva,in generale l’azione diventa parte della transazione cosi’ che se il trigger abortisce anche la transazione abortisce e viceversa. Se invece voglio registrare su una tabella di controllo tutto quello che succede allora questo deve essere fatto anche se la transazione abortisce. Giugno-Pulvirenti AA 2005-2006

Aspetti sistemistici dell’SQL

Giugno-Pulvirenti AA 2005-2006 Schemi Sono collezioni di tabelle, viste, asserzioni, trigger, moduli PSM, ecc. Gli schemi sono l’unità di base dell’organizzazione gerarchica e sono vicini al concetto di database che ognuno di noi ha. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Schemi Esterni Schema Esterno e’ la definizione di uno schema per un DB per una certa classe di utenti e degli accessi ad essi consentiti Giugno-Pulvirenti AA 2005-2006

Modi di definire Schemi esterni Si definisce, con il comando CREATE SCHEMA, un unico schema S e, con il meccanismo dei Grant, si dichiara chi puo’ accedere alle tabelle o view di S ed in quali modi. Fatto questo si possono definire schemi Si che usano tabelle o view di S. Per ogni schema Si si possono autorizzare alcuni utenti ad usare gli elementi di Si sempre con il meccanismo dei Grant . Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Grant Grant Autorizzazion //select, insert, //update, update(attributi), delete, all //previleges On Tabella TO (Public, utente,{, utente}) With grant option //gli utenti possono //concedere le stesse autorizzaizoni ad //altri Revoke [grant option for] autorizzazioni ON Tabella FROM utente {, utente} Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cataloghi Sono collezioni di schemi. Ogni catalogo ha uno o più schemi. Ogni catalogo ha uno schema speciale chiamato INFORMATION_SCHEMA che contiene informazioni riguardo a tutti gli schemi memorizzati in esso. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cataloghi in SQL L’INFORMATION_SCHEMA (cataloghi di sistema) contiente delle tabelle speciali che contengono i meta-dati del DB (tabelle, view, vincoli, trigger, utenti, autorizzazioni, indici etc..) Esempi: PASSWORD(NomeUtente,ParolaChiave) SYSDB(NomeBaseDati, Proprietario, Cammino, Commenti) SYSTABLE(NomeTabella, Proprietario, BaseODerivata, NumeroColonne, NomeArchivioFisico, Commenti) SYSCOLS(NomeColonna, Tabella, Numero, Tipo, Lunghezza, Default, Commenti) SYSINDEX(NomeIndice, Tabella, Proprietario, NumeroColonna, Commenti) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Altri Cataloghi Una decina di altre tabelle per view, vincoli, grant ecc.. Altri riguardano aspetti quantitativi sui dati, le statistiche, utilizzate dall’ottimizzatore delle query. Giugno-Pulvirenti AA 2005-2006

Utilizzo dei cataloghi Normalmente consultabili ma non modificabili dagli utenti. Possono tuttavia essere consultate mediante SQL e per questa ragione sono autoreferenziate (ad esempio SYSTABLE conterrà una n-upla corrispondente a se stessa. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cluster Sono collezioni di cataloghi. Ogni utente ha un cluster associato, relativo all’insieme di cataloghi che egli può accedere. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Gerarchia SQL environment Cluster Massimo scope per una Operazione sul DB Catalogo Catalogo Catalogo Schema Schema Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Locking Consiste nel bloccare un dato in lettura o scrittura rispettivamente prima di modificare o leggere quel dato. Quando una transazione T1 cerca di ottenere un blocco in scrittura su di un dato già bloccato da T2 allora T1 viene messa in attesa finché T2 termina rilasciando il lock. Si garantisce così la serializzabilità e l’isolamento in modo che ogni transazione non veda mai le modifiche di un’altra transazione non ancora terminata. Le richieste di blocco sono fatte dal sistema automaticamente. Giugno-Pulvirenti AA 2005-2006

Transazioni nei linguaggi che ospitano SQL I DBMS relazionali permettono di spezzare i programmi in più transazioni mediante i comandi COMMIT e ROLLBACK. Nel caso dell’SQL ospitato una transazione viene considerata iniziata dal sistema quando un programma esegue un’operazione su una tabella (SELECT, UPDATE, INSERT, DELETE, OPEN CURSOR) Giugno-Pulvirenti AA 2005-2006

Interruzione di transazioni La transazione prosegue finché: viene eseguito EXEC SQL COMMIT WORK : la transazione termina normalmente con il rilascio dei blocchi sui dati usati che diventano disponibili viene eseguito EXEC SQL ROLLBACK WORK (abort transaction) : comporta la terminazione prematura della transazione e quindi (a) il disfacimento di tutte le modifiche (atomicità) (b) il rilascio dei blocchi usati. Il programma termina senza errori , normalmente. Il programma termina con fallimento e provoca l’aborto della transazione Giugno-Pulvirenti AA 2005-2006

Transazioni con livelli diversi di isolamento Con l’aumentare del numero di transazioni eseguite concorrentemente in modo serializzabile si può ridurre l’effettivo grado di concorrenza del sistema a causa del fatto che aumenta la probabilità di avere transazioni in attesa di dati bloccati da altre o interrotte per il verificarsi di situazioni di stallo Per questa ragione i sistemi commerciali prevedono la possibilità di programmare transazioni rinunciando alla proprietà di serializzabilità e quindi di isolamento delle transazioni. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 SQL-92: SET TRANSACTION SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED| READ COMMITTED | REPEATABLE READ | SERIALIZABLE ] Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 READ UNCOMMITTED Il primo livello di isolamento read uncommitted (detto anche dirty read o degree of isolation 0) consente transazioni che fanno solo operazioni di lettura che vengono eseguite dal sistema senza bloccare in lettura i dati. Come conseguenza abbiamo che una transazione può leggere dati modificati da un’altra transazione non ancora completata. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 READ COMMITTED Il livello di isolamento read committed (detto anche cursor stability o degree of isolation 1) stabilisce che i blocchi in lettura vengano rilasciati subito mentre quelli in scrittura vengono rilasciati alla terminazione della transazione. In questo modo una transazione T che modifica un dato, quel dato non può essere letto da altri fino a che T non abbia effettuato un commit o un rollback. Conseguenza: una transazione puo’ fare letture non ripetibili, letture degli stessi dati possono essere diverse perche’ nell’intervallo sono state modificati da altre transazioni. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 REPEATABLE READ Repeatable read o anche degree of isolation 2 prevede che i blocchi in lettura e scrittura siano assegnati solo su n-uple di tabelle e vengano rilasciati alla terminazione della transazione. Presenta il fenomeno dei fantasmi (phantoms), abbiamo che dati inseriti nella tabella possono non essere visti. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 SERIALIZABLE Degree of isolation 3. Consiste nel blocco temporaneo della tabella; In certe applicazioni troppo restrittivo. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Livello Letture sporche Letture non ripetibili Dati fantasmi READ UNCOMMITTED X READ COMMITTED - REPEATABLE READ SERIALIZABLE Giugno-Pulvirenti AA 2005-2006

Altri strumenti per amministrare un DB Strumenti per progettare concettualmente il DB: Erwin,S-Designor,Er/1 Strumenti per definire la memoria da assegnare alle varie strutture e sua riorganizzazione nel caso di eccessiva frammentazione: S-Designor, DB-General,TS-Reorg Strumenti per controllare l’esecuzione dei comandi SQL per migliorare le prestazioni nei punti critici: Plan Analyzer Strumenti per la pianificazione ed esecuzione delle procedure per il back-up di sicurezza del DB: Patrol,Platinum Fast Unload (per Oracle) Strumenti per il controllo del funzionamento del DBMS, generazioni di statistiche sull’utilizzazione della memoria e del buffer, operazioni di I/O, condizioni di stallo delle transazioni ecc..: SQL Enterprise Manager (Microsoft), Enterprise Manager (Oracle) ecc... Giugno-Pulvirenti AA 2005-2006