Introduzione a SQL Server

Slides:



Advertisements
Presentazioni simili
Tecnologia delle basi di dati: Strutture fisiche di accesso
Advertisements

DBMS (DataBase Management System)
SQL applicato a SQL Server
Sicurezza e concorrenza nelle basi di dati
© 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)
PHP.
Esercizio zSi vuole realizzare un data warehouse per una azienda che vende mobili allingrosso. zIl data warehouse deve permettere di analizzare i ricavi.
Type Checking (1° parte)
Algoritmi e Programmazione
Biglietti e Ritardi: schema E/R
Biglietti: schema E/R.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Basi di Dati prof. A. Longheu
SQL Structured Query Language
La Modifica dei Dati in una Base Dati La modifica dei dati contenuti allinterno di una base dati è unoperazione delicata Infatti, ogni potenziale problema.
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.
1 IT FOR BUSINESS AND FINANCE ACCESS INTRODUCTION.
File.
Corso di Informatica (Basi di Dati)
1 Corso di Laurea in Biotecnologie Informatica (Basi di Dati) SQL: Data Manipulation Language (DML) Anno Accademico 2009/2010 Da: Atzeni, Ceri, Paraboschi,
Laboratorio di Basi di Dati Introduzione ad Access 2ª Parte.
Basi di dati. Vantaggi degli archivi digitali Risparmio di spazio: sono facilmente trasferibili e duplicabili Risparmio di tempo: si può accedere ai dati.
Basi di dati Università Degli Studi Parthenope di Napoli
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.
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:
Daniel Stoilov Tesi di Laurea
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.
SQL basato su ANSI (American National Standards Institute) – standard SQL SQL – Structured Query Language è un linguaggio dichiarativo e permette di comunicare.
Basi di dati Claudia Raibulet
SQL: Structured Query Language
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
INTRODUZIONE l sistema operativo è il primo software che lutente utilizza quando accende il computer; 1)Viene caricato nella memoria RAM con loperazione.
DAGLI ARCHIVI AI DATABASE
Basi di Dati e Sistemi Informativi
Corso di Basi di Dati Il Linguaggio SQL Home page del corso:
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:
Dati e DBMS DBMS relazionali SQL Progettazione di una base di dati Programma del Corso.
Microsoft Access (parte 5) Introduzione alle basi di dati Scienze e tecniche psicologiche dello sviluppo e dell'educazione, laurea magistrale Anno accademico:
ITCG “V. De Franchis” - PON FSE Modulo G/1 l’informatica”
Pagine ASP parte 3 I data base Stefano Schacherl.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
Il Linguaggio SQL. Le interrogazioni in SQL (continua…) La parte di SQL dedicata alla formulazione di interrogazioni fa parte del DML. SQL esprime le.
IV D Mercurio DB Lezione 2
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
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;
MySQL Database Management System
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
Funzionalità del DBMS relazionale l Funzioni per –definizione della base di dati –inserimento / rimozione /aggiornamento di informazioni deve soddisfare.
Approfondimenti SQL.
Microsoft Access Filtri, query. Filtri Un filtro è una funzione che provoca la visualizzazione dei soli record contenenti dati che rispondono a un certo.
Le basi di dati.
Linguaggi per basi di dati Linguaggi di definizione dei dati Utilizzati per definire gli schemi e le autorizzazioni per l’accesso Linguaggi di manipolazione.
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
Access Breve introduzione. Componenti E’ possibile utilizzare Access per gestire tutte le informazioni in un unico file. In un file di database di Access.
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.
Lezione 4 – Linguaggi ed Interazione. Linguaggi La comunicazione è essenziale tra gli esseri umani Se vogliamo chiedere informazioni stradali ad un passante.
Transcript della presentazione:

Introduzione a SQL Server

Giorno I Introduzione all’architettura di un DBMS Architettura di SQL Server Componenti di base di un database in SQL Server DDL da Enterprise Manager Cenni DDL da Query Analyzer Manipolazione di un database in SQL Server interrogazioni modifiche esercitazione

Giorno II Componenti avanzate Full-text search (cenni architetturali) Stored procedures triggers Full-text search (cenni architetturali) esercitazione

Introduzione all’architettura di un DBMS

Che cos’è un DBMS? Un DBMS è un sistema software che permette di gestire grosse quantità di dati in modo: efficiente sicuro concorrente affidabile

Il modello dei dati Un DBMS permette di descrivere I dati in base ad un modello dei dati il modello supportato da Access è il modello relazionale, in base al quale I dati vengono rappresentati in tabelle, ciascuna composta da tuple - o record - un insieme di dati rappresentati secondo un determinato modello prende il nome di schema I dati contenuti nelle tabelle possono poi venire collegati attraverso il meccanismo delle chiavi

Esempio 1 Imp# Nome dip# mansione data_a stipendio 1 Dip# Nome_dip Ufficio divisione attività dirigente n n

I linguaggi Un DBMS in genere supporta tre tipi di linguaggi Data Definition Language (DDL) permette di descrivere lo schema Data Manipulation Language (DML) permette di interrogare I dati (Query Language) e di modificarli Data Storage Language (DSL) permette di influenzare la memorizzazione dei dati prevista dal sistema SQL (Structured Query Language) è un linguaggio standard per l’accesso a basi di dati relazionali che supporta tutte le funzionalità sopra elencate

Funzionalità di un DBMS Il modello dei dati permette di rappresentare dati a livello logico, che è il livello corretto per gli utenti del DB Affinché però un sistema software possa essere definito DBMS, è necessario che I dati possano essere utilizzati in modo: efficiente strutture di memorizzazione, strutture di accesso, ottimizzazione di interrogazioni concorrente transazioni affidabile sicuro accesso dipendente dal contenuto

Efficienza In un DBMS l’efficienza è garantita dalle strutture dati utilizzate per rappresentare lo schema logico e dall’efficienza del sistema nell’operare su tali strutture Esistono varie strutture alternative per implementare un modello dei dati La scelta dalla strutture più efficienti dipende dal tipo di accessi che si eseguono sui dati Normalmente un DBMS ha le proprie strategie di implementazione di un modello dei dati; tuttavia l'utente (esperto) può influenzare le scelte fatte dal sistema

Supporti di memorizzazione I dati memorizzati in una base di dati devono essere fisicamente memorizzati su un supporto fisico di memorizzazione Basi di dati in genere memorizzate su memoria secondaria (dischi magnetici) troppo grosse per risiedere in memoria principale maggiori garanzie di persistenza dei dati costo per unita' di memorizzazione decisamente inferiore I dati sono trasferiti tra il disco e la memoria principale in unita' chiamate blocchi un blocco e' una sequenza di byte contigui la dimensione del blocco dipende dal sistema operativo

Organizzazione di file I dati sono generalmente memorizzati in forma di record un record è costituito da un insieme di valori (campi) collegati un file e' una sequenza di record Poiche' i dati sono trasferiti in blocchi tra la MS e la MM, e' importante assegnare i record ai blocchi in modo tale che uno stesso blocco contenga record tra loro interrelati Se si riesce a memorizzare sullo stesso blocco record che sono spesso richiesti insieme si risparmiano accessi a disco

Organizzazione di file Per DBMS di piccole dimensioni (es. per PC) una soluzione spesso adottata e' di memorizzare ogni relazione in un file separato Per DBMS large scale una strategia frequente e' di allocare per il DBMS un unico grosso file, in cui sono memorizzate tutte le relazioni la gestione di questo file e' lasciata al DBMS es. Access

Strutture ausiliarie di accesso Spesso le interrogazioni accedono solo un piccolo sottoinsieme dei dati Per risolvere efficientemente le interrogazioni puo' essere utile allocare delle strutture ausiliarie che permettano di determinare direttamente i record che verificano una data query (senza scandire tutti i dati) indici Esempio: se voglio determinare lo stipendio del Sig. Rossi, un indice permette di recuperare direttamente la tupla che memorizza le informazioni relative al Sig. Rossi, senza scandire tutta la tabella

Esecuzione di interrogazioni Quindi quando una query e' presentata al sistema occorre determinare il modo piu' efficiente per eseguirla usando le strutture disponibili Per interrogazioni complesse esistono piu' strategie possibili La scelta della strategia e' fatta principalmente in base al numero di accessi a disco Anche se il costo di determinare la strategia ottima puo' essere alto, il vantaggio in termini di efficienza che se ne ricava e' tale che in genere conviene eseguire l'ottimizzazione

Transazioni Per mantenere le informazioni consistenti e' necessario controllare opportunamente le sequenze di accessi e aggiornamenti ai dati Tali sequenze sono dette transazioni Ogni transazione e’ eseguita o completamente (cioe' effettua il commit), oppure per nulla (cioe' effettua l'abort) se si verifica un qualche errore (hardware o software) durante l'esecuzione Necessita' di garantire che le transazioni eseguite concorrentemente si comportino come se fossero state eseguite in sequenza correttezza concorrenza Necessita' di tecniche per ripristinare uno stato corretto della base di dati a fronte di malfunzionamenti di sistema affidabilità

Sicurezza Il controllo dell’accesso regola le operazioni che si possono compiere sulle informazioni e le risorse in una base di dati Scopo: limitare e controllare le operazioni che gli utenti effettuano, prevenendo accidentali o deliberate azioni che potrebbero compromettere la correttezza e la sicurezza dei dati Nel controllo dell’accesso: oggetti: risorse a cui si vuole garantire protezione soggetti: agenti che richiedono di potere esercitare privilegi sui dati

Sicurezza I modelli di controllo dell’accesso per basi di dati differiscono da quelli definiti per sistemi operativi: una BD è caratterizzata da un numero maggiore di oggetti rispetto ad un SO deve potere avvenire a diversi livelli di granularità: relazione, tupla, attributo risorse reali e logiche (es. Viste) deve tenere conto anche della semantica dei dati diversi DBMS supportano diverse politiche di controllo dell’accesso SQL permette di specificare alcune di queste politiche

Architettura Dalla discussione precedente, segue che un DBMS contiene diverse strutture dati che includono: i file con i dati (cioe' i file per memorizzare il DB stesso) file dei dati di sistema (che includono il dizionario dei dati e le autorizzazioni) indici (esempio B­tree o tabelle hash) dati statistici (esempio il numero di tuple in una relazione) che sono usati dallo strategy selector per determinare la strategia ottima di esecuzione

Architetture per l’utilizzo di un DBMS

Architetture client-server Modello generale di interazione tra processi software, in cui I processi che interagiscono si suddividono in: client: richiedono servizi ruolo attivo server: forniscono servizi ruolo reattivo I client richiedono un insieme limitato di servizi ad uno o più server I server rispondono a molte richieste provenienti da molti processi client

Architetture client-server

Architetture client-server Nel contesto delle basi di dati sono ormai diffuse portano ad una chiara separazione tra le funzionalità di client e server separazione tra progettazione e gestione caratteristiche macchine client/server: client: adatti ad interazione con l’utente (per ad esempio, interrogazione dati) server: adatti alla gestione dati (memorizzazione e gestione, elevata efficienza)

Architetture client-server SQL offre un paradigma di programmazione ideale per l’identificazione dell’interfaccia di servizi: l’interrogazione sono formulate dal client e inviate al server I risultati delle interrogazioni sono calcolati dal server e inviati al client grazie alla standardizzazione di SQL, è possibile progettare applicazioni che interagiscono con diversi server

Esempi Alcuni DBMS supportano sia la versione Desktop (Oracle, SQL Server) che la versione client/server Access può essere visto come un Desktop database non può essere definito un DBMS in quanto non supporta tutte le funzionalità elencate in precedenza

Architettura di SQL Server

Architettura SQL Server è un DBMS relazionale, progettato per funzionare efficientemente in due ambienti: client/server desktop

Client/server architecture

Desktop architecture

Architettura La versione Desktop supporta qualche funzionalità in meno in termini di ottimizzazione noi utilizzeremo la versione Desktop I tool supportati sono gli stessi

Architettura SQL Server Enterprise Manager SQL Server Engine

SQL Server Engine É un motore basato su SQL compatibile con SQL-92, entry-level il dialetto SQL implementato da SQL Server è chiamato Transact-SQL (T-SQL) T-SQL estende SQL, fornendo versioni semplificate di alcune operazioni supporta inoltre costrutti tipici dei linguaggi di programmazione (es. IF-THEN-ELSE) e permette di organizzare sequenze di statement SQL in procedure (stored procedure)

SQL Server Enterprise Manager Interfaccia di amministrazione permette di amministrare server multipli dalla stessa console permette di gestire ciascun server gestione database: creazione, modifica, cancellazione, mantenimento gestione oggetti contenuti in un database: tabelle, viste, vincoli, ecc. gestione server replicazione sicurezza

SQL Query Analyzer Permette di eseguire interattivamente statement T-SQL è possibile visualizzare il piano di esecuzione prescelto per lo statement specificato è possibile determinare quali indici associare alle tabelle considerate in una query (Index Tuning Wizard) è possibile visualizzare statistiche sulle query eseguite

Componenti di base di un database in SQL Server

Architettura In SQL Server 2000, I dati sono organizzati in database esistono due tipi di organizzazione: logica: schema relazionale fisica: strumenti di memorizzazione l’utente interagisce solo con l’organizzazione logica l’amministratore può intervenire anche sull’organizzazione fisica

Architettura

Database Ogni istanza di SQL Server contiene 4 database di sistema e uno o più database creati dall’utente Master: contiene I dati di sistema (cataloghi) tempdb: contiene dati temporanei msdb: utilizzato da SQL Server Agent, per schedulare attività come backup e replicazioni model: modello dal quale vengono creati tutti I database

Database Ogni utente del sistema è associato ad un database di default quindi quando l’utente si connette, può direttamente lavorare su tale database tale database può comunque essere cambiato é comunque possibile cambiare database (se si hanno I diritti)

Database ogni database contiene tabelle e altri oggetti ogni database viene mappato in un insieme di filegroups uno primario, che contiene informazioni su startup e tabelle uno secondario, utilizzato per motivi di efficienza transaction log, utilizzato per gestire le transazioni l’amministratore può intervenire nell’organizzazione di tali file possono anche essere read-only utilizzati ad esempio per memorizzare dati storici, non più operativi

Gestione database da Enterprise Manager Enterprise Manager permette di eseguire tramite interfaccia molte operazioni sui database: Creazione modifica proprietà cancellazione creazione oggetti associati condivisione con altri server definizione piani di mantenimento (integrità, backup, statistiche,…) import/export dati generazione script backup ...

Gestione Database tramite SQL La generazione script da Enterprise Manager permette di generare gli script SQL per la creazione e la cancellazione degli oggetti contenuti nel database questi sono comandi DDL, perché permettono di modificare lo schema del database gli stessi comandi SQL possono essere specificati ed eseguiti dalla finestra del Query Analyzer

Gestione Database tramite SQL CREATE DATABASE <nome database>; DROP DATABASE <nome database>; USE <nome database>; Esempio CREATE DATABASE prova; DROP DATABASE prova; ; non è obbligatorio, se manca viene aggiunto automaticamente I messaggi indicano la creazione del filegroup primario e del transaction log

Elementi di un DB Componenti: Tabelle Viste Stored Procedures Trigger ... Ogni componente può essere creata direttamente da SQL Server Enterprise Manager Nel seguito: analizzeremo le componenti principali vedremo come crearle da SQL Enterprise Manager e da SQL Query Analyzer tramite DDL

Tabelle Ogni database è composto da insieme di tabelle, come in Access vengono supportate due tipi di tabelle: persistenti temporanee le tabelle temporanee vengono memorizzate nel db tempdb e cancellate quando l’utente si disconnette dal sistema due tipi di tabelle temporanee: locali: iniziano con # e sono visibili solo alla connessione che le ha create globali: iniziano con ## e sono visibili a tutte le connessioni

Principali tipi di dato supportati Binary data types: permettono di memorizzare dati in formato esadecimale binary: dati a lunghezza fissa (fino a 8Kb) varbinary: dati a lunghezza variabile (fino a 8Kb) image: lunghezza arbitraria, fino ad un max di 2Gb utile per memorizzare ad esempio documenti word, immagini, ecc. character data types: permettono di memorizzare informazioni testuali, rappresentate con un set di caratteri stabilito dal sistema (quello della tastiera) char: dati a lunghezza fissa (fino a 8Kb) varchar: dati a lunghezza variabile (fino a 8Kb) text: dati a lunghezza variabile, fino ad un max di 2Gb ad esempio documenti HTML o XML

Principali tipi di dato supportati Unicode Data types:permettono di memorizzare caratteri provenienti da set diversi (es. Alfabero giapponese, russo) nchar: lunghezza fissa, fino a 4000 caratteri nvarchar: lunghezza variabile, fino a 4000 caratteri ntext: lunghezza variabile, maggiore di 4000 caratteri, fino ad un max di 2Gb preceduti da N Date and time data datetime, smalldatetime ...

Principali tipi di dato supportati numeric data int, smallint, numeric, float, real, money,smallmoney special data timestamp: numero crescente, in formato binario, che rappresenta l’istante in cui la riga è stata modificata per l’ultima volta bit uniqueidentifier sql_variant: colonna che memorizza valori di vario tipo, ad eccezione di text, ntext, timestamp, image, sql_variant

Gestione tabelle da Enterprise Manager Le tabelle possono essere create e manipolate direttamente da Enterprise Manager interfaccia simile a quella di Access ma estesa a supporto di aspetti presenti in SQL Server e non in Access permessi constraint indici trigger

Gestione tabelle da SQL CREATE TABLE <nome tabella> ( <nome campo_1> <tipo_1>, … <nome campo_n> <tipo_n> ) Esempio: CREATE TABLE Impiegati (Imp# numeric(4) PRIMARY KEY, Nome VarChar(20), Mansione VarChar(20), Data_A Datetime, Stipendio Numeric(7,2), Premio_P Numeric(7,2), Dip# Numeric(2));

User defined data types SQL Server 2000 permette all’utente di definire nuovi tipi di dato questi tipi di dato non sono altro che sinonimi di tipi di dato direttamente supportati dal sistema nessuna possibilità di definire tipi composti nessun concetto object-oriented per definire un tipo di dato è necessario specificare: nome nome tipo a cui si riferisce possibilità di utilizzare valori nulli questi tipi di dato possono essere generati sia dall’Enterprise Manager che usando T-SQL

Esempio in T-SQL EXEC sp_addtype phone_number, 'varchar(20)', 'not null' CREATE TABLE customer (cust_id smallint NOT NULL, cust_name varchar(50) NOT NULL, cust_addr1 varchar(50) NOT NULL, cust_addr2 varchar(50) NOT NULL, cust_city varchar(50) NOT NULL, cust_state char(2) NOT NULL, cust_zip varchar(10) NOT NULL, cust_phone phone_number, cust_fax varchar(20) NOT NULL, cust_email varchar(30) NOT NULL, cust_web_url varchar(20) NOT NULL)

Generazione automatica di valori È possibile generare in modo automatico valori univoci da assegnare ad un campo l’unicità può essere locale, all’interno di una singola tabella globale, all’interno del database

Identificatore locale CREATE TABLE prova (campo1 int IDENTITY(1,2)); valore iniziale: 1 incremento: 2 quando si inserisce una tupla non si devono specificare valori per campo1 vengono gestiti direttamente dal sistema

Identificatore globale CREATE TABLE prova (campo1 uniqueidentifier); oppure (campo1 int ROWGUIDCOL);

Vincoli di integrità (constraints) I vincoli di integrità rappresentano condizioni che I dati devono soddisfare per essere coerenti con la realtà che rappresentano I vincoli possono essere strutturali: rappresentano relazioni tra I dati memorizzati nel database semantici: rappresentano condizioni semantiche sui dati

Vincoli strutturali PRIMARY KEY: vincolo di chiave primaria FOREIGN KEY: vincolo di chiave esterna UNIQUE constraint: valori unici all’interno di una tabella DEFAULT: permette di specificare un valore di default per un attributo NULL, NOT NULL: permette di specificare se I valori di un attributo possono o meno essere nulli CHECK: permette di specificare il range di valori ammissibili per un certo attributo

Vincoli strutturali Per I vincoli di FOREIGN KEY è possibile specificare il comportamento da adottare in caso di cancellazione e/o aggiornamento ON DELETE CASCADE ON DELETE NO ACTION ON UPDATE CASCADE ON UPDATE NO ACTION

Esempio CREATE TABLE Docente (Dno Char(7), Dnome Varchar(20) NOT NULL, Residenza Varchar(15), PRIMARY KEY (Dno)); CREATE TABLE Studente (Sno Char(6), Sname Varchar(20), Residenza Varchar(15), Birthdate Date, PRIMARY KEY (Sno)); CREATE TABLE Relatore (Dno Char(7), Sno Char(6) DEFAULT 23, PRIMARY KEY (Sno), FOREIGN KEY (Dno) REFERENCES Docente ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Sno) REFERENCES Studente(Sno) ON DELETE CASCADE, ON UPDATE CASCADE);

Vincoli semantici Possono essere specificati tramite I trigger li vedremo più avanti

Diagrammi I diagrammi sono oggetti di database che permettono di rappresentare le relazioni, in termini di chiavi esterne, esistenti tra tabelle permettono inoltre di definire tramite interfaccia grafica tali vincoli analogo alle relazioni di Access

Esempio Nel seguito utilizzeremo le seguenti tabelle negli esempi: Impiegati(Imp#, Nome, Mansione, Data_A, Stipendio, Premio_P, Dip#) Dipartimenti(Dip#, Nome_Dip, Ufficio, Divisione, Attività, Dirigente)

Modifica e cancellazione Tutte le proprietà delle tabelle possono essere modificate e cancellate da Enterprise Manager con T-SQL non lo vediamo

Manipolazione di un database in SQL Server

Manipolazione dei dati Dopo avere progettato il database, è necessario potere interrogarlo e modificarlo SQL Server permette di interrogare e aggiornare I dati in due modi differenti: tramite SQL dal Query Analyzer tramite interfaccia grafica simile a quella di Access, dall’Enterprise Manager

Interrogazioni in SQL SELECT Ri1.C1 , Ri2.C2 , ....., Rin.Cn FROM R1 , R2 , ....., Rk WHERE F; dove R1 , R2 , ....., Rk e' una lista di nomi distinti di relazioni; Ri1.C1 , Ri2.C2 , ....., Rin.Cn e' una lista di nomi di colonne la notazione R.C indica la colonna di nome C nella relazione R se una sola relazione nella lista di relazioni nella clausola FROM ha una colonna di nome C, si puo' usare C invece di R.C F e' un predicato

Significato interrogazione Genera il prodotto Cartesiano d R1 , R2 , ....., Rk (cioè combina in tutti I modi possibili le tuple di R1 , R2 , ....., Rk) Applica alla relazione risultante la selezione F Restituisci solo le componenti Ri1.C1 , Ri2.C2 , ....., Rin.Cn

Esempio Q1: selezionare gli impiegati che hanno uno stipendio maggiore di 2000 SELECT * FROM Impiegati WHERE Stipendio>2000; Il simbolo * nella clausola di proiezione indica che tutte le colonne delle relazione devono essere ritrovate

Esempio Q2: selezionare il nome e il numero di dipartimento degli impiegati che hanno uno stipendio maggiore di 2000 e hanno mansione di ingegnere SELECT Nome, Dip# FROM Impiegati WHERE Stipendio>2000 AND Mansione = 'ingegnere';

Esempio Q3: selezionare il numero degli impiegati che lavorano nel dipartimento 30 e sono ingegneri o tecnici SELECT Imp# FROM Impiegati WHERE Dip#=30 AND (Mansione = 'ingegnere' OR Mansione = 'tecnico');

Operatori: Between condizioni su intervalli di valori: l'operatore BETWEEN permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato; C BETWEEN v1 AND v2 forma negata C NOT BETWEEN v1 AND v2 Esempio SELECT Nome, Stipendio FROM Impiegati WHERE Stipendio BETWEEN 1100 AND 1400;

Operatori: LIKE confronto tra stringhe di caratteri: l'operatore LIKE permette di eseguire alcune semplici operazioni di pattern matching su colonne di tipo stringa un predicato di confronto espresso con l'operatore LIKE ha il seguente formato C LIKE pattern dove pattern e' una stringa di caratteri che puo' contenere i caratteri speciali % e _ il carattere % denota una sequenza di caratteri arbitrari di lunghezza qualsiasi (anche zero) il carattere _ denota esattamente un carattere .

Esempio LIKE Determinare tutti gli impiegati che hanno 'R' come terza lettera del cognome SELECT Nome FROM Impiegati WHERE Nome LIKE '_ _ R%';

Ordinamento Negli esempi visti, l'ordine delle tuple risultato di una interrogazione e' determinato dal sistema (dipende dalla strategia usata per eseguire l'interrogazione) e' possibile specificare un ordinamento diverso aggiungendo alla fine dell'interrogazione la clausola ORDER BY , ORDER BY DESC

Esempio SELECT Stipendio, Mansione, Nome FROM Impiegati WHERE Dip#=30 ORDER BY Stipendio; SELECT Mansione, Stipendio, Nome ORDER BY Mansione, Stipendio DESC;

DISTINCT Una query può anche restituire duplicati per eliminarli: clausola DISTINCT SELECT Mansione FROM Impiegati; SELECT DISTINCT Mansione FROM Impiegati;

Join L'operazione di join rappresenta un'importante operazione in quanto permette di correlare dati rappresentati da relazioni diverse In genere il join e' espresso in SQL tramite un prodotto Cartesiano a cui sono applicati uno o piu' predicati di join un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell'interrogazione

Esempio Esempio: determinare il nome del dipartimento in cui lavora l'impiegato Rossi SELECT Nome_Dip FROM Impiegati, Dipartimenti WHERE Nome = 'Rossi' AND Impiegati.Dip# = Dipartimenti.Dip#; il predicato di join e' Impiegati.Dip# = Dipartimenti.Dip#

Espressioni e funzioni aritmetiche i predicati usati nelle interrogazioni possono coinvolgere, oltre a nomi di colonna, anche espressioni aritmetiche tali espressioni sono formulate applicando gli operatori aritmetici (+, , *, /) ai valori delle colonne delle tuple le espressioni artimetiche possono comparire nella clausola di proiezione e nelle espressioni di assegnamenti del comando di UPDATE

Esempio trovare il nome, lo stipendio, il premio di produzione, e la somma dello stipendio e del premio di produzione di tutti gli ingegneri per cui la somma dello stipendio e del premio di produzione e' maggiore di 2000 SELECT Nome, Stipendio, Premio_P, Stipendio+Premio_P FROM Impiegati WHERE Mansione = 'ingegnere' AND Stipendio+Premio_P > 2000;

Funzioni per stringhe Concatenazione: SELECT Cognome + ' ' + Nome + ' ' + Indirizzo FROM Persone; Funzioni: len(str): calcola la lunghezza di un stringa WHERE len(Cognome) > 3 substring(str, m, n) (m ed n sono interi) estrae dalla stringa 'str' la sottostringa dal carattere di posizione m per una lunghezza n

Funzioni per date Le date possono essere sommate e sottratte DATEADD(day, 21, GETDATE()) DATEDIFF(day,date, GETDATE()) GETDATE() restituisce la data corrente

Funzioni di gruppo Una funzione di gruppo permette di estrarre informazioni da gruppi di tuple di una relazione Le funzioni di gruppo si basano su due concetti fondamentali: partizionamento delle tuple di una relazione in base al valore di una o piu' colonne della relazione le colonne da usare sono specificate tramite la clausola GROUP BY calcolo della funzione di gruppo per ogni gruppo ottenuto dal partizionamento una funzione di gruppo ha come argomento una colonna e si applica all'insieme di valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo

Funzioni di gruppo le funzioni di gruppo comunemente presenti sono: MAX, MIN, SUM, AVG, COUNT tutte le funzioni di gruppo, ad accezione di COUNT, possono essere applicate solo su insiemi che consistono di valori semplici e non su insiemi di tuple la funzione COUNT puo' avere due tipi di argomenti un nome di colonna in tal caso nello standard SQL2 e' obbligatorio l'uso del qualificatore DISTINCT esempio: COUNT (DISTINCT Stipendio) il carattere speciale '*' la funzione restituisce il numero di tuple presenti in un dato gruppo esempio: COUNT(*)

Esempio si vuole raggruppare gli impiegati in base al numero di dipartimento e si vuole determinare il massimo stipendio di ogni gruppo SELECT Dip#, MAX(Stipendio) FROM Impiegati GROUP BY Dip#;

Esempio supponiamo di voler raggruppare gli impiegati sulla base del dipartimento e della mansione; per ogni gruppo si vuole determinare il nome del dipartimento, la somma degli stipendi, quanti impiegati appartengono ad ogni gruppo, e la media degli stipendi SELECT Nome_Dip, Mansione, SUM(Stipendio), COUNT(*), AVG(Stipendio) FROM Dipartimenti, Impiegati WHERE Dipartimenti.Dip#=Impiegati.Dip# GROUP BY Nome_Dip, Mansione;

Funzioni di gruppo importante restrizione: una clausola di proiezione di una query contenente la clausola GROUP BY puo' solo includere: una o piu' colonne tra le colonne che compaiono nella clausola GROUP BY le funzioni di gruppo possono apparire in espressioni aritmetiche esempio: SUM(Stipendio) + SUM(Premio_p)

Having e' possibile specificare condizioni di ricerca su gruppi di tuple Esempio: supponiamo di voler eseguire una query come la precedente ma di essere interessati solo ai gruppi che contengono almento due impiegati SELECT Nome_Dip, Mansione, SUM(Stipendio), COUNT(*), AVG(Stipendio) FROM Dipartimenti, Impiegati WHERE Dipartimenti.Dip#=Impiegati.Dip# GROUP BY Nome_Dip, Mansione HAVING COUNT(*) > 2;

Un modello di esecuzione si applica la condizione di ricerca specificata nella clausola WHERE a tutte le tuple della relazione oggetto della query la valutazione avviene tupla per tupla alle tuple ottenute al passo precedente, si applica il partizionamento specificato dalla clausola GROUP BY ad ogni gruppo di tuple ottenuto al passo precedente, si applica la condizione di ricerca specificata dalla clausola HAVING i gruppi ottenuti al passo precedente sono i gruppi di tuple che verificano la query per tali gruppi, vengono calcolate le funzioni di gruppo specificate nella clausola di proiezione della query i valori restituiti da tali funzioni costituiscono il risultato della query

Valori nulli SQL usa una logica a tre valori per valutare il valore di verita' di una condizione di ricerca (clausola where) True (T), False (F), Unknown (?) un predicato semplice valutato su un attributo a valore nullo da' come risultato della valutazione ? il valore di verita' di un predicato complesso viene calcolato in base alle seguenti tabelle di verita' AND OR T F ? T F ? T T F ? T T T T F F F F F T F ? ? ? F ? ? T ? ? una tupla per cui il valore di verita' e' ? non viene restituita dalla query NOT T F F T ? ?

IS NULL il predicato IS NULL applicato ad un dato attributo di una tupla restituisce True se la tupla ha valore nullo per l'attributo il predicato IS NOT NULL applicato ad un dato attributo di una tupla restituisce True se la tupla ha valore non nullo per l'attributo

Viste Una vista è una tabella virtuale il contenuto della tabella non è infatti memorizzato su disco ma definito tramite una query, al cui risultato viene assegnato un nome tale nome identifica la vista una vista può essere utilizzata in ogni contesto in cui può essere utilizzata una tabella In genere vengono utilizzate per semplificate la percezione che l’utente ha del database possono essere utilizzate come base per definire politiche di sicurezza

Viste

Gestione viste da Enterprise Manager L’interfaccia fornita è del tutto simile a quella di Access per definire le query La stessa interfaccia può essere utilizzata per definire la vista e per eseguire la query corrispondente, in modo da verificarne il risultato

Gestione viste da SQL AS CREATE VIEW <nome vista> <query SQL che definisce la vista> Esempio CREATE VIEW High_salary SELECT Name, salary FROM Employee WHERE salary >2000;

Esempio si vuole creare una vista costituita da un sottoinsieme delle tuple della relazione Impiegati; piu' precisamente la vista deve elencare le colonne Imp#, Nome e Mansione degli impiegati del dipartimento 10 CREATE VIEW Imp10 AS SELECT Imp#, Nome, Mansione FROM Impiegati WHERE Dip#=10;

View resolution Le viste possono essere utilizzate nelle query ogni volta che ci si riferisce ad una vista, il nome della vista viene rimpiazzato dalla sua definizione (query) quindi la query di partenza viene composta con la query che definisce la vista, ottenendo una nuova query, che viene eseguita le viste possono anche essere definite in termini di altre viste, in questo caso si itera il procedimento precedente Esempio: selezionare le tuple della vista Imp10 SELECT * FROM Imp10;

Aggiornamenti in SQL Tre possibili aggiornamenti: inserimento cancellazione modifica eseguibili da Enterprise Manager tramite interfaccia grafica, simile a quella di Access oppure da Query Analyzer con SQL

Inserimento in SQL Tre possibilità: si inserisce una nuova tupla INSERT INTO Dipartimenti VALUES (40, 'Edilizia Industriale', 6100, 'D2',7698); si selezionano tuple dal database e si inseriscono in una tabella esistente INSERT INTO Promozioni (Nome, Stipendio, Premio_P) SELECT Nome, Stipendio, Premio_P FROM Impiegati WHERE Premio_P > 0.25*Stipendio AND Mansione = 'ingegnere';

Inserimento in SQL si selezionano tuple dal database e si inseriscono in una nuova tabella SELECT Nome, Sipendio, Premio_P INTO Promozioni FROM Impiegati WHERE Premio_P > 0.25*Stipendio AND Mansione = 'ingegnere';

Cancellazione in SQL Si specifica la condizione che devono soddisfare le tuple da cancellare DELETE FROM Dipartimenti WHERE Dip# = 40;

Modifica in SQL Si deve specificare quali tuple devono essere modificate e come UPDATE Impiegati SET Mansione = 'dirigente', Stipendio = 1.10*Stipendio WHERE Nome = 'Gianni';

Aggiornamento di viste Ogni volta che vengono modificate le tabelle di base di una view, cambia implicitamente anche il contenuto della view è comunque possibile aggiornare direttamente una view sotto alcune condizioni, tra cui: e' possibile eseguire l'operazione di DELETE se l'interrogazione di definizione della vista soddisfa le seguenti condizioni: e' su una sola relazione non contiene la clausola GROUP BY, la clausola DISTINCT, o una funzione di gruppo e' possibile eseguire l'operazione di UPDATE se l'interrogazione di definizione della vista soddisfa le due condizioni precedenti ed inoltre la colonna modificata non e' definita da un'espressione e' possibile eseguire l'operazione di INSERT se l'interrogazione di definizione della vista soddisfa le tre condizioni precedenti ed inoltre qualsiasi colonna per cui valga il vincolo NOT NULL sia presente nella vista

Esercitazione proposta Utilizzare l’utente “giunti”, passwd: corsodbms Creare da Enterprise Manager un database corsi, che mantenga le informazioni relative ai corsi on-line che si intendono gestire. In particolare, creare: database tabelle vincoli una vista per una specifica operazione inserire opportuni dati nella tabella da Enterprise Manager e/o da Query Analyzer (provare entrambe le modalità)

Esercitazione proposta da Query Analyzer, eseguire una decina di interrogazioni, ritenute significative in SQL e salvarne il testo in un file modificare un corso (provare da Enterprise Manager e da SQL) cancellare un corso (provare da Enterprise Manager e da SQL)

Componenti avanzate di un database in SQL Server

Statement multipli Per eseguire operazioni che processano più statement SQL, SQL Server fornisce 4 possibilità: batches script stored procedure trigger

Batch Gruppi di statement T-SQL inviati ed eseguiti contemporanemante all’SQL Engine vengono compilati in un singolo piano di esecuzione se si verifica errore di compilazione il piano non viene generato se si verifica un errore in esecuzione gli statement seguenti non vengono eseguiti per speficare un batch da SQL Query Analyzer: GO

Esempio GO SELECT Nome, Dip# FROM Impiegati CREATE TABLE Impiegati (Imp# numeric(4) PRIMARY KEY, Nome VarChar(20), Mansione VarChar(20), Data_A Datetime, Stipendio Numeric(7,2), Premio_P Numeric(7,2), Dip# Numeric(2)); SELECT Nome, Dip# FROM Impiegati WHERE Stipendio>2000 AND Mansione = 'ingegnere'; GO

Script Sequenza di statement T-SQL memorizzati in un file e quindi eseguiti, utilizzando una funzionalità particolare di SQL Server possono essere eseguiti dalla shell del DOS mediante il comando: osql osql -U <nome utente> -i <nome file input> -o <nome file risultato> viene chiesta la password

Stored Procedures Le stored procedure sono simili al concetto di procedura (o funzione) presente nei linguaggi di programmazione come vedremo le applicazioni possono poi utilizzare le stored procedure per interagire con il DBMS funzionamento di base: accettano parametri di input usano T-SQL per elaborare I dati contenuti nel DB settano parametri di output restituiscono valori di stato per indicare se l’esecuzione ha avuto successo Possono essere create sia da Enterprise Manager che da Query Analyzer, ma è sempre necessario specificare il codice T-SQL

Store procedures Esistono stored procedure predefinite, associate al database Master I nomi di tali procedure iniziano con sp_ nel seguito ne vedremo alcune

Creazione Come per le tabelle anche le stored procedure possono essere temporanee valgono le stesse convenzioni viste per le tabelle CREATE PROCEDURE <nome> <parametri> AS <codice> EXECUTE <nome> CREATE PROCEDURE deve essere l’unico comando all’interno di un batch

Dichiarazioni In T-SQL è possibile dichiarare variabili locali, valide all’interno del batch eseguito e assegnare valori per ogni tipo supportato da T-SQL I nomi di variabili devono essere preceduti da @ DECLARE @ImpID int SET @ImpID = 1234

Esempio DECLARE @ImpID INT SET @ImpID = 1234 GO CREATE PROCEDURE ImpSelect AS SELECT * FROM Impiegati Where #Imp = @ImpID;

Parametri I parametri sono utilizzati per scambiare valori tra la procedura e l’applicazioni o il tool che la richiama Tipi di parametri: input output valore di ritorno (se non specificato si assume 0)

Parametri di input CREATE PROCEDURE ImpSelect @ImpID INT AS SELECT * FROM Impiegati Where Imp# = @ImpID; GO EXEC ImpSelect @ImpID = 1234

Parametri di input É possibile specificare un valore di default in questo caso, non sarà necessario passare un valore per il parametro CREATE PROCEDURE ImpSelect @ImpID INT = 1234 AS SELECT * FROM Impiegati Where Imp# = @ImpID; GO EXEC ImpSelect EXEC ImpSelect

Parametri di Output Per restituire valori all’ambiente chiamante, è possibile utilizzare parametri di output CREATE PROCEDURE AvgSal @Dip int, @Avg int OUTPUT AS SELECT @Avg = avg(stipendio) FROM Impiegati WHERE Dip# = @Dip; GO DECLARE @AVGex int EXEC AvgSal @Dip = 1, @Avg = @AVGex OUTPUT PRINT @AVGex

Valori di ritorno L’istruzione RETURN permette di restituire un valore all’ambiente chiamanete Per default 0 indica che l’esecuzione è andata a buon fine 1 indica che l’esecuzione ha generato errori

Esempio CREATE PROCEDURE AvgSal @Dip int, @Avg int OUTPUT AS DECLARE @ErrorSave INT SET @ErrorSave = 0 SELECT avg(stipendio) FROM Impiegati WHERE Dip# = @Dip; IF (@@ERROR <>0) SET @ErrorSave = @@ERROR RETURN @ErrorSave GO DECLARE @AVGex int DECLARE @ReturnStatus INT EXEC @ReturnStatus = AvgSal @Dip = 1, @Avg = @AVGex OUTPUT PRINT 'Return Status= ' + CAST(@ReturnStatus AS CHAR(10)) PRINT @AVGex GO

Costrutti di controllo Classici costrutti imperativi per alterare il flusso sequenziale di esecuzione degli statement specificati BEGIN END stesso ruolo {} in Java IF ELSE classico costrutto di scelta WAITFOR WAITFOR DELAY ‘00:00:02’ aspetta due secondi WAITFOR TIME ‘22:00’ riparte alle 22 WHILE come in Java

Costrutti di controllo CASE SELECT name, CASE state WHEN 'CA' THEN 'California' WHEN 'KS' THEN 'Kansas' WHEN 'TN' THEN 'Tennessee' WHEN 'OR' THEN 'Oregon' WHEN 'MI' THEN 'Michigan' WHEN 'IN' THEN 'Indiana’ WHEN 'MD' THEN 'Maryland' WHEN 'UT' THEN 'Utah' END AS StateName FROM Authors

Cursori Gli statement SQL restituiscono un insieme di tuple può capitare di dovere analizzare le tuple una per una in questo caso è necessario associare al risultato un cursore, cioè un puntatore che permette di muoversi all’interno di un insieme di tuple risultato un cursore deve: essere dichiarato aperto utilizzato per muoversi sulle tuple chiuso è possibile dichiarare una variabile di tipo cursore

Cursori Dichiarazione DECLARE <nome cursore> CURSOR FOR <select statement> Apertura OPEN <nome cursore> Recupero tupla successiva FETCH NEXT FROM <nome cursore> INTO <lista variabili> Chiusura CLOSE <nome cursore> Deallocazione DEALLOCATE <nome cursore>

Cursori @@FETCH_STATUS Variabile di sistema, è uguale a 0 se la tupla è stata letta, è < 0 se si è verificato qualche problema (ad esempio la tupla non esiste, siamo arrivati alla fine del result set)

Esempio DECLARE ImpCursor CURSOR FOR SELECT Nome FROM Impiegati OPEN ImpCursor DECLARE @NomeImp VARCHAR(10) FETCH NEXT FROM ImpCursor INTO @NomeImp WHILE (@@FETCH_STATUS = 0) BEGIN PRINT @NomeImp END CLOSE ImpCursor DEALLOCATE ImpCursor

Creazione statement a runtime É possibile creare a run time stringhe che rappresentano statement SQL tali statement devono essere rappresentati come stringhe Unicode vengono eseguiti utilizzando la stored procedure di sistema sp_executesql ogni batch eseguito con sp_executesql non può accedere le variabili definite nel batch a cui appartiene la chiamata di sp_executesql e viceversa

Esempio DECLARE @SQLString NVARCHAR(100) SET @SQLSTRING = N'SELECT * FROM Impiegati' EXEC sp_executesql @SQLString

Problema DECLARE @SQLString NVARCHAR(100) DECLARE @MyImp =12 SET @SQLSTRING = N'SELECT * FROM Impiegati’ + ‘WHERE Imp# = @MyImp’ EXEC sp_executesql @SQLString DECLARE @MyImp =14 La stessa stringa viene compilata due volte

Soluzione: uso di parametri SET @SQLSTRING = N'SELECT * FROM Impiegati’ + ‘WHERE Imp# = @MyImp’ SET @ParamDef = N’@MyImp INT’ EXEC sp_executesql @SQLString, @ParamDef, @MyImp = 12 EXEC sp_executesql @SQLString, @ParamDef, @MyImp = 24 in questo caso alla seconda esecuzione il sistema si accorge di avere già compilato lo statement e riutilizza il piano generato

Trigger I trigger possono essere visti come un tipo particolare di stored procedure che viene attivata automaticamente quando I dati di una certa tabella vengono inseriti, modificati, cancellati Vengono spesso utilizzati per: forzare vincoli di integrità semantici, che coinvolgono più di una relazione per aggiornare viste per attivare azioni esterne

Esempio Supponiamo di avere un campo n_imp nella tabella Dipartimenti che tiene conto di quanti impiegati lavorano in un dato dipartimento un trigger potrebbe essere utilizzato per aggiornare automaticamente questo valore quando si inserisce o si cancella un impiegati

Trigger In base ai vincoli fissati su una relazione, ogni operazione di aggiornamento richiede una verifica dei vincoli di integrità come side effect In SQL Server esistono due tipi di trigger, classificati in base al loro comportamento rispetto al side effect delle operazioni di aggiornamento: INSTEAD OF: eseguiti prima di side effect AFTER: eseguiti dopo side effect ogni tabella può avere al più un INSTEAD OF trigger per ogni operazione di aggiornamento ma più AFTER trigger

Trigger CREATE TRIGGER <nome trigger> ON <nome tabella> INSTEAD OF INSERT| INSTEAD OF UPDATE| INSTEAD OF DELETE| AFTER INSERT| AFTER UPDATE| AFTER DELET| AS <corpo del trigger, simile a stored procedure, con qualche estensione>

Trigger Prima vengono eseguiti INSTEAD OF trigger (una sola volta, non possono essere attivati ricorsivamente) poi vengono eseguiti AFTER trigger trigger INSTEAD OF sono soggetti a limitazioni Non possono essere definiti su tabelle che hanno almeno una chiave esterna associata ad un vincolo per l’operazione di cancellazione e/o aggiornamento

Condizioni speciali Test per stabilire se INSERT e UPDATE hanno aggiornato I valori contenuti in una certa colonna CREATE TABLE my_table(a int NULL, b int NULL) GO CREATE TRIGGER my_trig ON my_table FOR INSERT AS IF UPDATE(b) PRINT 'Column b Modified'

Tabelle speciali Un’operazione di UPDATE può essere vista come un’operazione di DELETE seguita da un’operazione di INSERT SQL Server 2000 mantiene automaticamente, per ogni tabella, due ulteriori tabelle: INSERTED: contiene tutte le tuple inserite con INSERT o UPDATE DELETED: contiene tutte le tuple cancellate con DELETE o UPDATE Queste tabelle, temporanee, possono essere utilizzate nel corpo dei trigger

Esempio Se lo stipendio di Rossi è stato modificato e supera 2000 allora Rossi passa al dipartimento 4 CREATE TRIGGER updateRossi ON Impiegati AFTER UPDATE, INSERT AS DECLARE @StipRossi INT SELECT @StipRossi = Stipendio FROM INSERTED WHERE Nome = ‘Rossi’ IF @StipRossi > 2000 BEGIN UPDATE Impiegati SET Dip# = 4 WHERE Nome = ‘Rossi’ END

Esercitazione proposta Creare una stored procedure per eseguire le seguenti operazioni: prende in input un argomento e un costo determina tutti I corsi relativi a quell’argomento e con costo minore a quello dato stampa I corsi determinati in ordine crescente rispetto al costo provare ad eseguire la stored procedure attribuendo diversi valori ai parametri

Esercitazione proposta Creare un trigger per la tabella corsi in modo che, quando viene inserito un nuovo corso, stampi il numero totale di corsi esistenti nel database

Full-text search

Problema Le tabelle possono contenere campi contenenti informazioni testuali Char Varchar Text Image Nasce il problema di come effettuare ricerche su tali campi

Esempio Supponiamo che la tabella DIPARTIMENTI contenga un campo ATTIVITA’, che contiene una descrizione testuale delle attivita’ portate avanti dal dipartimento Il campo ATTIVITA’ puo’ essere definito come VARCHAR(200) Supponiamo di volere determinare tutti I dipartimenti che si occupano di ricerca In questo caso, ragionevolmente il campo ATTIVITA’ dovra’ contenere parole come “ricerca”, “ricerche”, ma anche magari “attivita’ scientifiche”, in quanto identificano ricerche La ricerca potrebbe essere eseguita utilizzando il predicato LIKE, ma le possibiita’ a nostra disposizione in questo caso sarebbero ridotte rispetto a quelle supportate, come vedremo, da ricerche full-text

Full-text search SQL Server permette di eseguire ricerche di questo tipo su campi testuali, mediante un procedimento in due passi: Indicizzazione: durante questa fase, si istruisce il sistema sul contenuto delle colonne testuali da interrogare Interrogazione: durante questa fase, si possono eseguire le interrogazioni sulle colonne testuali Permette inoltre di indicizzare e interrogare Documenti binari (file WORD, ecc.) File memorizzati su file system

Full-text index Per potere interrogare campi testuali e’ necessario istruire il sistema sul contenuto di tali campi Cioe’ il sistema deve processare il contenuto di tali campi ed identificare le parole significative, da utilizzare poi in fase di ricerca Esempio di informazione: La colonna 3 della tabella DIPARTIMENTI contiene nel campo ATTIVITA’ la parola “ricerca” a partire dalla posizione 25, come parola numero 5 Non tutte le parole sono significative Noise word (es. articoli) Le parole non significative non vengono considerate nella fase di indicizzazione

Full-text index Se si vogliono utilizzare ricerche testuali sui campi di determinate tabelle, per ciascuno di questi campi e’ necessario: Creare un indice (da SQL Server Enterprise Manager) Popolare l’indice, cioe’ fare in modo che contenga informazioni circa il contenuto della colonna considerata Solo dopo avere eseguito I passi precedenti, sara’ possibile eseguire full-text query sulla colonna considerata La popolazione dell’indice puo’ essere automatica o manuale e’ automatica ma deve essere fatta manualmente, o schedulata E’ possibile definire un solo indice per tabella (l’indice puo’ coinvolgere piu’ colonne)

Query Full-text T-SQL supporta due predicati per interrogare campi testuali: CONTAINS FREETEXT Due funzioni: CONTAINSTABLE FREETEXTTABLE Questi predicati possono essereutilizzati nella clausola WHERE degli statement di interrogazione

Contains Alcune delle ricerche che possono essere espresse con CONTAINS possono anche essere espresse con LIKE, ma non tutte CONTAINS e’ case insensitive, al contrario di LIKE Nel seguito, per gli esempi useremo le seguenti strutture: DB: Northwind, Tabella: Categories, Campo: Description(ntext(16)) DB: pubs, Tabella: titles, Camp1: notes (varchar(80)), title (varchar(200))

Esempio di base SELECT Description FROM Categories WHERE Description LIKE '%bean curd%' WHERE CONTAINS(Description, ' "bean curd" ') FRASE

Ricerche esprimibili Una o piu’ parole e/o frasi Inflectional forms di una parola (drive, drives, drove, droven Parole con un certo prefisso: auto* Parole o frasi pesate, in relazione all’importanza Parole o frasi simili ad altre (proximity search) Ricerche combinate con OR, AND, NOT

Ricerche per specifiche parole e/o frasi SELECT title_id, title, notes FROM titles WHERE CONTAINS(notes, 'business') WHERE CONTAINS(notes, ' "common business applications" ') PAROLA FRASE

Ricerche per specifiche parole e/o frasi Si possono utilizzare anche piu’ campi nella ricerca SELECT title_id, title, price FROM titles WHERE CONTAINS( *, ' "French gourmet" ' ) La ricerca viene effettuata in tutte le colonne indicizzate

Ricerche combinate SELECT title, notes FROM titles WHERE CONTAINS( notes, ' "favorite recipes" OR "gourmet recipes" ' ) SELECT title_id, title, ytd_sales WHERE CONTAINS( title, ' cooking AND NOT ("computer*" )' ) SELECT CategoryName, Description FROM Categories WHERE CONTAINS( Description, ' beers AND ales ' )

Prefissi SELECT Description, CategoryName FROM Categories WHERE CONTAINS (Description, ' "ice*" ' ) WHERE CONTAINS (Description, ' "light bread*" ' )

Inflection form SELECT Description, CategoryName FROM Categories WHERE CONTAINS (Description, 'FORMSOF(INFLECTIONAL, "dry")')

Ricerche pesate Ogni parola o frase puo’ essere pesata Peso minimo 0 Peso massimo 1 SELECT CompanyName, ContactName, Address FROM Customers WHERE CONTAINS(Address, 'ISABOUT ("*des*", Rue WEIGHT(0.5), Bouchers WEIGHT(0.9) ) ' ) NON PESATO

Proximity terms Permette di trovare sequenze di parole vicine nel testo SELECT title, notes FROM titles WHERE CONTAINS (notes, 'user NEAR computers') Equivalente a WHERE CONTAINS (notes, 'user ~ computers') WHERE CONTAINS(Description, ' "wheat*" ~ "bread mix" ')

Freetext Implementa una query “by example” Forniamo una parola o una frase e il sistema trova tutti I testi simili Idea: Il sistema costruisce una query dalla parola o frase specificata Usa CONTAINS per risolvere la nuova query SELECT Description, CategoryName FROM Categories WHERE FREETEXT (description, ' "The Fulton County Grand Jury said Friday an investigation of Atlanta recent primary election produced no evidence that any irregularities took place." ')

Combinazione predicati full-text con altri predicati I predicati full-text possono essere combinati nella clausola WHERE con altri predicati non full-text SELECT Description, CategoryName FROM Categories WHERE CONTAINS (Description, ' "ice*" ' ) AND Category_name = “Beverage”

Containstable e Freetexttable CONTAINS e FREETEXT sono predicati, quindi per ogni tupla restituiscono vero o falso Utilizzati nella clausola WHERE CONTAINSTABLE e FREETEXTTABLE sono funzioni che restituiscono tabelle Utilizzati nella clausola FROM La tabella restituita ha due attributi: KEY: identificatore tupla (chiave) RANK: valore da 0 a 1000 che rappresenta la similarita’ del testo con la query specificata, piu’ e’ alto, piu’ e’ simile

Containstable e Freetexttable Per utilizzare il campo RANK, e’ necessario fare il join della tabella CONTAINSTABLE o FREETEXTTABLE con la tabella considerata nella query SELECT C.Description, C.CategoryName, K.RANK FROM Categories AS C, CONTAINSTABLE (Categories, Description, '("sweet and savory" NEAR sauces) OR ("sweet and savory" NEAR candies)' , 10 ) AS K WHERE C.CategoryID = K.[KEY]

Esempio SELECT K.RANK, CompanyName, ContactName, Address FROM Customers AS C, CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*", Rue WEIGHT(0.5), Bouchers WEIGHT(0.9) ) ' ) AS K WHERE C.CustomerID = K.[KEY]

Ranked queries Permettono di ritrovare I k testi che maggiormente assomigliano alla query Si estende CONTAINSTABLE e FREETEXTTABLE con una parametro che indica quanto vale k SELECT K.RANK, CompanyName, ContactName, Address FROM Customers AS C, CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*", Rue WEIGHT(0.5), Bouchers WEIGHT(0.9))', 3) AS K WHERE C.CustomerID = K.[KEY]

Esercitazione proposta Creare un full-text index su un campo testuale della tabella corsi Modificare la stored procedure definita in modo che prenda in input una stringa ed esegua un’operazione full-text provare vari operatori full text e analizzarne il risultato provare ad eseguire la procedura con vari input

Alcuni cenni architetturali

Cosa vedremo Indici (cenni) transazioni (cenni) sicurezza (cenni)

Strutture ausiliarie di accesso Spesso le interrogazioni accedono solo un piccolo sottoinsieme dei dati Per risolvere efficientemente le interrogazioni puo' essere utile allocare delle strutture ausiliarie che permettano di determinare direttamente i record che verificano una data query (senza scandire tutti i dati) tali strutture sono chiamate indici

Strutture ausiliarie di accesso Una ricerca puo' essere effettuata per: chiave primaria: il valore della chiave identifica un unico record il contribuente con codice fiscale GRRGNN69R48 chiave secondaria: il valore della chiave puo' identificare piu' record (es. i contribuenti di Genova) intervallo di valori (sia per chiave primaria che per secondaria) (es. i contribuenti con reddito compreso tra 60 e 90 milioni) combinazioni delle precedenti (es. i contribuenti di Genova e La Spezia con reddito compreso tra 60 e 90 milioni) Per effettuare la ricerca in modo piu' efficiente si puo' pensare di mantenere il file ordinato secondo il valore di una chiave di ricerca il costo di ricerca e' lineare nel numero di blocchi del file la ricerca su altri campi e' inefficiente

Indici Idea base: associare al file dei dati una ``tabella''nella quale l'entrata i­esima memorizza una coppia (ki ,ri ) dove: ki e'un valore di chiave del campo su cui l'indice e' costruito ri e'un riferimento al record (eventualmente il solo) con valore di chiave ki il riferimento puo' essere un indirizzo (logico o fisico) di record o di blocco questa tabella può poi essere memorizzata in vari modi spesso viene rappresentata come albero (B-tree)

Indici

Indici

Indici Ordinamento dei record nel file dei dati indice clusterizzato (o indice primario): indice sull'attributo secondo i cui valori il file dei dati e' mantenuto ordinato indice non clusterizzato (o indice secondario): indice su un attributo secondo i cui valori il file dei dati non e' mantenuto ordinato l'uso di piu' indici secondari rende l'esecuzione delle interrogazioni piu' efficiente, ma rende piu' costosi gli aggiornamenti quando si esegue l'inserzione o la cancellazione di un record e' necessario modificare tutti gli indici allocati sul file

Indici Data un’interrogazione, il sistema determina tutti I possibili modi con cui la stessa può essere eseguita: senza usare indice usando indici, in vari modi (potrebbero essercene più di uno) ogni modalità = piano di esecuzione viene determinato il piano di esecuzione con il minor costo (in termini di numero di accesso a disco) si esegue il piano con il minor costo

Perché ottimizzare? Studenti(MatrS,Nome,Ind,AltreInfo) Esami(Corso,MatrS,Voto,Data) Supponiamo di voler trovare il nome degli studenti e la data degli esami per gli studenti che hanno sostenuto BD con 30 SELECT Nome,Data FROM Studenti NATURAL JOIN Esami WHERE Corso ='BD' AND Voto =30

Perché ottimizzare? Consideriamo un database con 2.000 studenti e 20.000 esami, di cui 500 di BD e di questi solo 50 con 30 (consideriamo solo la scansione sequenziale delle relazioni) Se si fa il prodotto cartesiano delle due relazioni, si ottiene una relazione temporanea con 40.000.000 tuple, da queste si estraggono poi le 50 tuple desiderate (costo proporzionale a 120.000.000 accessi) Se si selezionano i 50 esami di BD con 30 e poi si fa il join di questa relazione temporanea con Studenti si ha un costo proporzionale a 120.050

Indici in SQL Server Clusterizzati/non clusterizzati valori unici/valori non unici colonna singola/colonna multipla coprenti/non coprenti

Clusterizzazione SQL Server Supporta sia indici clusterizzati che non clusterizzati viene automaticamente creato un indice clusterizzato sulla chiave primaria della tabella gli indici possono essere creati da Enterprise Manager o con SQL poiché un indice clusterizzato stabilisce l’ordine con cui I dati vengono memorizzati su file, una tabella può essere associata ad un solo indice clusterizzato è possibile stabilire se I dati devono essere organizzati secondo l’ordinamento crescente o decrescente utile su colonne utilizzate per range queries o ricerca valore

Clusterizzazione Gli indici non clusterizzati sono utili per ricerche su singolo valore una tabella può essere associata a più indici non clusterizzati

Unicità Unique index: la colonna indicizzata non contiene duplicati Non-Unique index: la colonna indicizzata può contenere duplicati necessari vincoli UNIQUE o PRIMARY KEY per garantire l’unicità dei dati

Numero colonne Un indice può essere costruito su una singola colonna o su una combinazione di colonne in questo ultimo caso, vengono indicizzate le tuple ottenute dalla combinazione

Fill factor Ogni volta che si inseriscono nuove tuple, l’indice deve essere aggiornato questo aggiornamento permette di inserire I nuovi valori in una pagina dell’indice se la pagina è piena, è necessario dividerla in due pagine (split) questa operazione è piuttosto costosa soluzione: lasciare parzialmente vuote le pagine in modo da ridurre il costo in fase di inserimento fill factor: stabilisce la percentuale delle pagine che deve essere occupata al momento della creazione dell’indice viene considerato solo al momento della creazione dell’indice

Operazioni sugli indici Gli indici possono essere: creati ricalcolati cancellati modificati (per quanto riguarda le proprietà) con Enterprise Manager possiamo solo: crearli modificarli cancellarli ma NON possiamo ricalcolarli (non lo vediamo)

Transazioni Gli utenti interagiscono con la base di dati attraverso programmi applicativi ai quali viene dato il nome di transazioni Una transazione e' un insieme parzialmente ordinato di operazioni di lettura e scrittura L'insieme di operazioni che costituiscono una transazione deve soddisfare alcune proprieta', note come proprieta' ACID: Atomicita' Consistenza Isolamento Durabilità

Transazioni Atomicita' proprieta' tutto­o­niente tutte le operazioni di una transazione devono essere trattate come una singola unita': o vengono eseguite tutte, oppure non ne viene eseguita alcuna l'atomicita' delle transazioni e' assicurata dal sottosistema di ripristino (recovery)

Transazioni Consistenza una transazione deve agire sulla base di dati in modo corretto se viene eseguita su una base di dati in assenza di altre transazioni, la transazione trasforma la base di dati da uno stato consistente (cioe' che riflette lo stato reale del mondo che la base di dati deve modellare) ad un altro stato ancora consistente l'esecuzione di un insieme di transazioni corrette e concorrenti deve a sua volta mantenere consistente la base di dati il sottosistema di controllo della concorrenza (concurrency control) sincronizzale transazioni concorrenti in modo da assicurare esecuzioni concorrenti libere da interferenze

Transazioni Isolamento Durabilita' (persistenza) ogni transazione deve sempre osservare una base di dati consistente, cioe', non puo' leggere risultati intermedi di altre transazioni la proprieta' di isolamento e' assicurata dal sottosistema di controllo della concorrenza che isola gli effetti di una transazione fino alla sua terminazione Durabilita' (persistenza) i risultati di una transazione terminata con successo devono essere resi permanenti nella base di dati nonostante possibili malfunzionamenti del sistema la persistenza e' assicurata dal sottosistema di ripristino

Controllo di transazioni Facciamo riferimento al modello di transazioni piu' semplice (transazioni flat), che prevede un solo livello di controllo a cui appartengono tutte le transazioni eseguite (e' il modello usato nei DBMS commerciali) Tutte le istruzioni eseguite devono essere contenute tra le istruzioni BeginWork e CommitWork l'istruzione BeginWork dichiara l'inizio di una transazione flat l'istruzione CommitWork e' invocata per indicare che il sistema ha raggiunto un nuovo stato consistente La transazione puo’: terminare la propria esecuzione con successo (commit) e rendere definitivi i cambiamenti prodotti sulla base di dati dalle istruzioni eseguite tra BeginWork e CommitWork oppure sara' disfatta (cioe' i suoi effetti saranno annullati) e tutti gli aggiornamenti eseguiti andranno persi (abort) In questo caso, si dice che viene eseguito il rollback della transazione

Tipi di transazioni Esistono vari modelli per rappresentare e gestire transazioni il modello più semplice è quello delle flat transaction per definire una flat transaction è necessario specificare: l'inizio di una transazione flat la fine della transazione e il risultato transazionale La transazione puo’: terminare la propria esecuzione con successo (commit) e rendere definitivi i cambiamenti prodotti sulla base di dati dalle istruzioni eseguite tra BeginWork e CommitWork oppure sara' disfatta (cioe' i suoi effetti saranno annullati) e tutti gli aggiornamenti eseguiti andranno persi (abort) In questo caso, si dice che viene eseguito il rollback della transazione

Transazioni in SQL Server SQL Server supporta flat transaction e transazioni con savepoints (non le vediamo) Diversi modi per iniziare una transazione: transazioni esplicite transazioni autocommit transazioni implicite due possibili risultati transazionali: commit: tutte le modifiche effettuate dalla transazione vengono rese permanenti rollback: nessuna modifica viene eseguita a causa di errori il rollback viene effettuato automaticamente nel caso di gravi errori, non gestiti a livello di applicazione (es. Si rompe il disco)

Transazioni esplicite Vengono utilizzati comandi T-SQL per specificare l’inizio e la fine della transazione Inizio: BEGIN TRANSACTION Fine: COMMIT TRANSACTION ROLLBACK TRANSACTION

Esempio BEGIN TRANSACTION UPDATE Impiegati SET Stipendio = Stipendio * 1.2; UPDATE Dipartimenti SET Dirigente = 3 IF (@@ERROR = 0) BEGIN PRINT 'Transazione eseguita' COMMIT TRANSACTION END ELSE PRINT 'Errore' ROLLBACK TRANSACTION

Transazioni autocommit Default viene effettuato il commit di ogni statement T-SQL che non genera errori se viene generato almeno un errore, lo statement viene abortito in presenza di batch, l’autocommit rimane a livello di singolo statement l’autocommit viene annullato quando si comincia in modo esplicito una transazione viene ripristinato quando la transazione esplicita termina

Transazioni implicite Simili alle esplicite, ma non si deve specificare l’inizio delle transazioni al termine di ogni transazione (COMMIT o ROLLBACK) viene automaticamente iniziata una nuova transazione Per attivare le transazioni implicite: SET IMPLICIT_TRANSACTION ON Per disattivarle: SET IMPLICIT_TRANSACTION OFF

Sicurezza (cenni)

Sicurezza Utenti (Windows, SQL Server) gruppi (Windows): insieme di gruppi e/o utenti ruoli (SQL Server): gruppi di utenti, organizzati per scopi

Livelli di sicurezza Due fasi: autenticazione validazione permessi: stabilisce se un utente si può connettere ad una istanza di SQL Server validazione permessi: dopo la validazione, vengono analizzati I permessi per stabilire cosa l’utentepuò fare sull’istanza

Modi di autenticazione Due possibilità (in NT e 2000): Autenticazione Windows autenticazione basata su login e password Windows autenticazione mista uso di account Windows e account creati direttamente in SQL Server In Windows 9x e ME: solo autenticazione mista (ma in realtà si considerano solo gli account SQL Server)

Modi di autenticazione

Validazione permessi Un utente autenticato ha bisogno di un account per ogni database che deve accedere ogni account specifica quali oggetti possono essere acceduti dall’utente e in che modo per ogni statement T-SQL eseguito da un utente, si verifica che l’utente abbia I permessi per poterlo eseguire, altrimenti viene rilevato un errore

Quindi ... Per ogni SQL Server, un insieme di account di autenticazione: login (utenti/gruppi Windows, login SQL Server) ruoli (SQL Server) per ogni database: un insieme di utenti e ruoli ai quali è garantito l’accesso al database per ogni accesso, si devono specificare I permessi particolari per ogni oggetto

Database owner dbo è un utente che implicitamente ha il permesso di eseguire ogni possibile operazione su un database ogni membro del ruolo sysadmin che utilizza un database viene mappato nell’utente speciale dbo ogni oggetto creato da un membro del ruolo sysadmin ha come owner dbo

Database owner Quando un utente crea un oggetto ne diventa proprietario ha permessi totali sull’oggetto e può delegare I permessi ad altri utenti anche tramite Enterprise Manager