Corso di Basi di Dati - Il Linguaggio SQL

Pagina creata da Luca Schiavone
 
CONTINUA A LEGGERE
Corso di Basi di Dati

    Il Linguaggio SQL
           Home page del corso:
 http://www.cs.unibo.it/~difelice/dbsi/
Il Linguaggio SQL
SQL (Structured Query Language) e’ il linguaggio di
riferimento per le basi di dati relazionali.

Diverse versioni del linguaggio:
Ø   SQL-86 à Costrutti base
Ø   SQL-89 à Integrita’ referenziale
Ø   SQL-92 (SQL2) à Modello relazionale, struttura a livelli
Ø   SQL:1999 (SQL3) à Modello ad oggetti
Ø   SQL:2003 (SQL3) à Nuove parti: SQL/JRT, SQL/XML
Ø   SQL:2006 (SQL3) à Estensione di SQL/XML
Ø   SQL:2008 (SQL3) à Lievi aggiunte
Il Linguaggio SQL
Oltre ad i costrutti base di SQL2 visti fin qui,
esistono molti costrutti avanzati (i) definiti in
SQL3 e/o (ii) dipendenti dallo specifico DBMS.

Ø Procedure (Stored Procedures)

Ø Trigger

Ø Permessi
Il Linguaggio SQL
Stored Procedures à Frammenti di codice SQL,
con la possibilità di specificare un nome, dei
parametri in ingresso e dei valori di ritorno.

Procedure ModificaStipendio (MatricolaN:
varchar(20), StipendioNew: smallint)
     update Impiegati
     set Stipendio=StipendioNew
     where Matricola=MatricolaN

Ogni DBMS offre estensioni procedurali differenti …
Il Linguaggio SQL
                   SQL
                          APPLICAZIONE            MODELLO senza
        DB                  ESTERNA             STORED PROCEDURE
    TABELLE        DATI

                                    NOME PROCEDURA
                                      + PARAMETRI
   MODELLO con
STORED PROCEDURE                                  APPLICAZIONE
                               DB                   ESTERNA
Ø Efficienza                TABELLE      DATI
Ø Maggiore espressività
                           PROCEDURE
Ø …
Il Linguaggio SQL
Esempio: definizione di funzioni in MySQL:

CREATE FUNCTION function_name
RETURNS type_return
… List of SQL routine statements

CREATE FUNCTION echo(s CHAR(20))
RETURNS CHAR(50)
RETURN(s)

mysql>> SELECT echo(“Hello”);
Il Linguaggio SQL
Le estensioni procedurali consentono di:

Ø Aggiungere strutture di controllo al linguaggio
  SQL (es. cicli, strutture condizionali if then else,
  etc).

Ø Dichiarare variabili e tipi di dato user-defined.

Ø Definire funzioni avanzate ed ottimizzate, che
  sono ritenute “sicure” dal DBMS.
Il Linguaggio SQL
Ogni DBMS offre una sua estensione procedurale:

Ø PL/SQL à Linguaggio di Oracle Server

Ø SQL PL à Linguaggio di IBM DB2

Ø PL/pgSQL à Linguaggio di PostgreSQL

Ø SQL/PSM à Linguaggio di MySQL/SQL2
Il Linguaggio SQL
Costrutti procedurali in PostgreSQL:

Ø Costrutti condizionali
if  then … else … endif

IF user_id  0 THEN
      UPDATE USERS
             SET USERS.email=v_email
             WHERE (USERS.user_id = user_id)
ENDIF
Il Linguaggio SQL
Costrutti procedurali in PostgreSQL:
Ø Costrutti iterativi (while)
while (Expression) LOOP
     statements
END LOOP
WHILE ncycle>0 LOOP
       UPDATE SALARY
       SET SALARY.amount=SALARY.amount -100
       ncycle:=ncycle -1;
END LOOP
Il Linguaggio SQL
Costrutti procedurali in PostgreSQL:

Ø Costrutti iterativi (for)
For record_or_row IN query LOOP
     statements
END LOOP
FOR Studente IN SELECT * FROM STUDENTI LOOP
       UPDATE ESAMI
       SET Voto=30
       WHERE (Corso=“Basi di Dati”)
END LOOP
Il Linguaggio SQL
Oltre ad i costrutti base di SQL2 visti fin qui,
esistono molti costrutti avanzati (i) definiti in
SQL3 e/o (ii) dipendenti dallo specifico DBMS.

Ø Procedure (Stored Procedures)

Ø Trigger

Ø Permessi
Il Linguaggio SQL
        ORDINE

         Nome                 Codice   Quantita

         Xbee Radio Shield    123      3

         Arduino Uno Shield   5565     2

         Arduino Ethernet     14354    1

Vorrei implementare un comportamento del tipo:

Ø Ogni volta che viene inserito/modificato un nuovo ordine
  in più di 5 quantità viene inviata una mail al Titolare
  dell’azienda ..
Il Linguaggio SQL
ORDINE                                  MAGAZZINO           ACQUISTO

Nome                Codice   Quantita   Codice   Quantita   Codice   Q.a   Data

Xbee Radio Shield   123      3          123      0          123      3     1/2/
                                                                           2012
Arduino Uno         5565     2          5565     2
Shield
                                        14354    1
Arduino Ethernet    14354    1

Vorrei implementare un comportamento del tipo:

Ø Ogni volta in cui l’utente fa un’ordine, si aggiorna la tabella
  Magazzino, e nel caso non ci siano più prodotti di quel
  tipo, si aggiorni anche la tabella Acquisti …
Il Linguaggio SQL
Trigger (o regole attive) à meccanismi di gestione
della base di dati basati sul paradigma ECA
(Evento/Condizione/Azione).

Ø Evento: primitive per la manipolazione dei dati
  (insert, delete, update)
Ø Condizione: Predicato booleano
Ø Azione: sequenza di istruzioni SQL, talvolta
  procedure SQL specifiche del DBMS.
Il Linguaggio SQL
Trigger (o regole attive) à meccanismi di gestione
della base di dati basati sul paradigma ECA
(Evento/Condizione/Azione).

A che servono i Trigger?

1. Garantire il soddifacimento di vincoli di integrità
referenziale, e/o specificare meccanismi di reazione
ad hoc in caso di violazione dei vincoli!
Il Linguaggio SQL
CORSI                                  ESAMI

Nome                Codice   Crediti   Corso    Studente     Voto

Basi di dati        6464     12        0121     4324235245   30L

Programmazione      1213     12        1213     4324235245   25

Sistemi Operativi   1455     6         1213     9854456565   18

Q. Che accade se un valore nella tabella esterna viene
cancellato o viene modificato?

A. Il vincolo di integrità referenziale nella tabella interna
potrebbe non essere piu’ valido! Cosa fare?
Il Linguaggio SQL
Trigger (o regole attive) à meccanismi di gestione
della base di dati basati sul paradigma ECA
(Evento/Condizione/Azione).

A che servono i Trigger?

2. Specificare regole aziendali (business rules),
ossia vincoli generici sullo schema della base di dati
(es. Un impiegato non può avere un aumento di stipendio
superiore al 10%, pena annullamento della transazione).
Il Linguaggio SQL
Trigger (o regole attive) à meccanismi di gestione
della base di dati basati sul paradigma ECA
(Evento/Condizione/Azione).
SINTASSI SQL3

        Create trigger Nome
        Modo Evento on Tabella              EVENTO
        [referencing Referenza]
        [for each Livello]
        [when (IstruzioneSQL)]             CONDIZIONE
        Istruzione/ProceduraSQL             AZIONE
Il Linguaggio SQL
Ø Modo à before/after
Ø Evento à insert/delete/update
Ø Referencing à qui possono essere inserite variabili
  globali per aumentare l’espressività del trigger…
Ø Livello à row (Il trigger agisce a livello di righe)
  statement (Il trigger agisce globalmente a livello
  di tabella)

Due modalità di esecuzione: immediata vs differita.
Il Linguaggio SQL
         Esempio di Trigger in SQL3
CREATE TRIGGER CHECKAUMENTO
BEFORE UPDATE OF CONTO ON IMPIEGATO
FOR EACH ROW
WHEN (NEW.STIPENDIO > OLD.STIPENDIO * 1.2)
SET NEW.STIPENDIO=OLD.STIPENDIO * 1.2

Ø Modo è definito come before.
Ø Evento è definito come update.
Ø Livello è definito come row.
Il Linguaggio SQL
Oltre ad i costrutti base di SQL2 visti fin qui,
esistono molti costrutti avanzati (i) definiti in
SQL3 e/o (ii) dipendenti dallo specifico DBMS.

Ø Procedure (Stored Procedures)

Ø Trigger

Ø Permessi
Il Linguaggio SQL
SQL2/SQL3 prevede meccanismi di controllo di
accesso alle risorse dello schema del DB.

Di default, ogni risorsa appartiene all’utente che
l’ha definita … Su ciascuna risorsa sono definiti
dei privilegi (grant):
Ø   insert/update/delete à tabelle/viste
Ø   select à tabelle/viste
Ø   references àtabelle/attributi
Ø   usage à domini
Il Linguaggio SQL
Il comando grant consente di assegnare privilegi
su una certa risorsa ad utenti specifici.

grant Privilegio on Risorsa/e to Utente/i
[with grant option]

L’opzione with grant option consente di
propagare il privilegio ad altri utenti del sistema…
grant select on Impiegati to Marco with grant option
grant delete on Impiegati, Salari to Marco, Michele
Il Linguaggio SQL
Il comando revoke consente di revocare privilegi
su una certa risorsa ad utenti specifici.

revoke Privilegio on Risorsa/e from Utente/i
[cascade|restrict]

L’opzione cascade agisce ricorsivamente sui
privilegi eventualmente concessi da quell’utente …
revoke select on Impiegati to Marco cascade
revoke delete on Impiegati, Salari to Marco, Michele
Il Linguaggio SQL
In SQL3 è possibile definire dei ruoli per l’accesso
alle risorse di un database.

    Ruolo = Contenitore di privilegi
ESEMPIO di RUOLO

ØInsert su Tabella Impiegati
ØSelect su Tabella Retribuzioni
ØUpdate su Tabella Progetti

Ø Comandi SQL3: create role/set role
Puoi anche leggere