GERARCHIE RICORSIVE - SQL SERVER 2008 SQL

GERARCHIE RICORSIVE - SQL SERVER 2008
DISPENSE
http://dbgroup.unimo.it/SIA/GerarchieRicorsive/
L’obiettivo è quello di realizzare la tabella di navigazione tramite una query ricorsiva utilizzando SQL
SERVER 2008
Per utilizzare SQL SERVER 2008 (Express Edition) ci sono due possibilità
1) scaricarlo dalla rete ed installarlo, secondo le istruzioni riportate in “INSTALLAZIONE SQL
SERVER 2008”; funziona con tutti i sistemi operativi Microsoft
(si consiglia di seguire questa strada)
2) usare la macchina virtuale secondo le istruzioni riportate in “MACCHINA VIRTUALE CON SQL
SERVER 2008”;
SQL SERVER 2008
INSTALLAZIONE SQL SERVER 2008
oppure in alternativa
MACCHINA VIRTUALE CON SQL SERVER 2008
UTILIZZO SQL SERVER 2008
GERARCHIE RICORSIVE :TABELLA DI NAVIGAZIONE
1
SQL SERVER 2008
INSTALLAZIONE SQL SERVER 2008
oppure in alternativa
MACCHINA VIRTUALE CON SQL SERVER 2008
2
INSTALLAZIONE SQL SERVER 2008
1) download dell’installazione
Dal sito Microsoft
http://www.microsoft.com/express/Database/InstallOptions.aspx
scaricare l’installazione relativa all’opzione (terza colonna)
Database with Management Tools
3
2) Installazione: selezionare New Installation …. Come in figura
4
3) Installazione: selezionare Default Instance…. Come in figura
5
4) Installazione: lasciare le configurazioni di default Come in figura
6
5) Installazione: Selezionare WINDOWS AUTHENTICATION MODE … Come in figura
Verificare che ci sia l’utente corrente nel riquadro “Specify SQL Server Administrator”
7
6) Fine Installazione (Close)
8
MACCHINA VIRTUALE CON SQL SERVER 2008
Si utilizza Virtual BOX
A) Scaricare ed installare VIRTUAL BOX
http://www.virtualbox.org/wiki/Downloads
B) Contattare il docente per avere la macchina virtuale :
XPTest_onlyXP.vdi
C) Attivare la macchina virtuale :
XPTest_onlyXP.vdi
Nel seguito le indicazioni per attivare la macchina virtuale
9
Aprire Virtual Box
quindi ciccare NUOVA
10
11
Inserire Nome, ad esempio SIA
12
Assegnare Memoria
13
Selezionare USA DISCO FISSO ESISTENTE
quindi cliccare sulla freccia verde
14
cliccare su aggiungi
15
selezionare il file XPTest_onlyXP.vdi
16
quindi Seleziona
17
quindi avanti
18
Quindi fine
19
La macchina virtuale è stata creata
20
Selezionare IMPOSTAZIONI
21
Selezionare SISTEMA
22
ABILITARE IO APIC
23
ORA LA MACCHINA VIRTUALE E’ PRONTA PER ESSERE AVVIATA
24
25
UTILIZZO SQL SERVER 2008
Per aprire SQL SERVER : SQL SERVER Management Studio
Quindi connettersi al server
26
Si ottiene
Per creare un nuovo DB oppure fare il restore di uno esistente
27
E’ POSSIBILE FARE IL RESTORE DI UN DATABASE SQL SERVER 2000:
1) Inserire il nome del DB in “TO DATABASE”
2) Selezionare il file di Backup in “FROM DEVICE”
3) Accertarsi di aver selezionato il DB da ripristinare nella finestra centrale
28
Se non “si vede” il vostro backup (questo avviene quando il file non ha estensione .bak) selezionare ALL FILE
e quindi il backup
29
Il restore di un DB fatto con SQL SERVER 2000 non crea automaticamente i diagrammi.
I diagrammi non sono indispensabili.
Nelle prossime due pagine vengono date istruzioni su come creare i diagrammi.
SE NELLA CREAZIONE DEL DIAGRAMMA VIENE QUESTO ERRORE
CON NEW QUERY
QUI è POSSIBILE SCRIVERE QUERY SQL
Scrivere ed eseguire
ALTER AUTHORIZATION ON DATABASE::RITARDI TO [DB-PC\DB]
Sostituendo a [DB-PC\DB] il vostro nome utente (usare le []); E’ quello che si vede al punto 5)
dell’installazione, nel riquadro “Specify SQL Server Administrator”
30
Altro esempio (su un altro PC):
si noti che il nome dell’utente specificato in TO è anche disponibile come Login name nel riquadro laterale
destro.
Quindi creare il Diagramma
31
GERARCHIE RICORSIVE :
TABELLA DI NAVIGAZIONE
DISPENSE
http://dbgroup.unimo.it/SIA/GerarchieRicorsive/
L’obiettivo è quello di realizzare la tabella di navigazione tramite una query ricorsiva utilizzando SQL
SERVER 2008
PASSO 1) DB operazionale in SQL SERVER 2000
PASSO 2) DB operazionale in SQL SERVER 2008
PASSO 3) Creazione della TABELLA DI NAVIGAZIONE IN SQL SERVER 2008
PASSO 4) RIPORTARE IL CONTENUTO DELLA TABELLA DI NAVIGAZIONE NEL DATAMART
32
PASSO 1) DB operazionale in SQL SERVER 2000
DB operazionale (PAG 21 delle dispense)
E’ un DB SQL SERVER 2000 il cui BackUp è disponibile in
http://dbgroup.unimo.it/SIA/GerarchieRicorsive/EsempioRicorsione2010
http://dbgroup.unimo.it/SIA/GerarchieRicorsive/EsempioRicorsione2010.zip
http://dbgroup.unimo.it/SIA/GerarchieRicorsive/EsempioRicorsione2010.bak
Aprirlo con SQL SERVER 2000 e verificarne il contenuto
33
PASSO 2) DB operazionale in SQL SERVER 2008
Effettuare il restore in SQL SERVER 2008
Non è necessario creare il diagramma in quanto già disponibile in SQL SERVER 2000.
Visualizzare il contenuto delle table tramite “SELECT TOP 1000 ROWS” (la query viene scritta
automaticamente dal sistema)
34
PASSO 3) Creazione della TABELLA DI NAVIGAZIONE IN SQL SERVER 2008
Si eseguono tutti i passaggi descritti a pag 18 delle dispense (Calcolo della Tabella di Navigazione:SQL-99)
Dopo aver aperto un nuovo riquadro per le query (NUOVA QUERY : ATTENZIONE  selezionare il
database giusto!)
Eseguo
WITH CAPO (NOME, NOMECAPO,LIVELLO) AS (
SELECT NOME, NOMECAPO, 1 AS LIVELLO
FROM IMPIEGATO
UNION
SELECT CAPO.NOME, IMPIEGATO.NOMECAPO, LIVELLO + 1
FROM CAPO, IMPIEGATO
WHERE CAPO.NOMECAPO = IMPIEGATO.NOME )
SELECT * FROM CAPO;
Msg 252, Level 16, State 1, Line 1 Recursive common table expression 'CAPO' does not contain a
top-level UNION ALL operator.
INFATTI
La precedente interrogazione può essere eseguita in SQL-SERVER 2005 con la seguente variazione
sintattica : Sostituire UNION con UNION ALL
WITH CAPO (NOME, NOMECAPO,LIVELLO) AS (
SELECT NOME, NOMECAPO, 1 AS LIVELLO
FROM IMPIEGATO
UNION ALL
SELECT CAPO.NOME, IMPIEGATO.NOMECAPO, LIVELLO + 1
FROM CAPO, IMPIEGATO
WHERE CAPO.NOMECAPO = IMPIEGATO.NOME )
SELECT * FROM CAPO;
35
36
1)Riportare la query nella vista CAPO_V1
CREATE VIEW CAPO_V1
AS
WITH CAPO (NOME, NOMECAPO,LIVELLO) AS (
SELECT NOME, NOMECAPO, 1 AS LIVELLO
FROM IMPIEGATO
UNION ALL
SELECT CAPO.NOME, IMPIEGATO.NOMECAPO, LIVELLO + 1
FROM CAPO, IMPIEGATO
WHERE CAPO.NOMECAPO = IMPIEGATO.NOME )
SELECT * FROM CAPO;
37
2)L’interrogazione ricorsiva restituisce anche tutte le tuple di IMPIEGATO, quindi anche le tuple che hanno
NULL come NOMECAPO: queste tuple non devono comparire nella tabella di navigazione e quindi vengono
eliminate
CREATE VIEW CAPO_V2 AS
SELECT * FROM CAPO_V1 WHERE NOMECAPO is not null
38
3)Per definizione l’interrogazione ricorsiva restituisce la sola chiusura transitiva di IMPIEGATO: per
aggiungere anche la chiusura riflessiva di IMPIEGATO, con un livello pari a 0, si effettua una UNION
CREATE VIEW CAPO_V3 AS
SELECT * FROM CAPO_V2
UNION
SELECT CAPO AS CAPO,CAPO AS NOMECAPO, 0 AS LIVELLO
FROM IMPIEGATO
L’errore è nella seconda parte della UNION ,nella chiusura riflessiva che si deve ottenere come
39
Quindi
CREATE VIEW CAPO_V3 AS
SELECT * FROM CAPO_V2
UNION
SELECT NOME, NOME AS NOMECAPO, 0 AS LIVELLO
FROM IMPIEGATO
40
4)Per avere corrispondenza con la tabella di Navigazione occorre effettuare la seguente rinomina dei campi:
NOME come FIGLIO e NOMECAPO come PADRE
CREATE VIEW CAPO_V4 AS
SELECT NOMECAPO AS PADRE, NOME AS FIGLIO, LIVELLO
FROM CAPO_V3
41
5)Ultima cosa è l’aggiunta della colonna Foglia: è facile verificare che
FIGLIO → FOGLIA (infatti FOGLIA è true se il FIGLIO non è a sua volta PADRE, ovvero se non compare
nella colonna PADRE). Per semplicità effettuiamo il calcolo del valore FOGLIA tramite una nuova vista
CREATE VIEW FOGLIA(FIGLIO,FOGLIA) AS
SELECT FIGLIO, 'TRUE' AS FOGLIA FROM CAPO_V4
WHERE FIGLIO NOT IN (SELECT PADRE FROM CAPO_V4)
UNION
SELECT FIGLIO, ’FALSE' AS FOGLIA FROM CAPO_V4
WHERE FIGLIO IN (SELECT PADRE FROM CAPO_V4)
42
6)La tabella di navigazione si ottiene con un semplice join tra CAPO_V4 e FOGLIA.
Essendo un join, per comodità creiamo questa vista tramite interfaccia grafica
43
IL join deve essere fatto tra FIGLIO e FOGLIA
44
Si esegue per verificare il contenuto della vista
e quindi si salva la vista chiamandola TABELLA_DI_NAVIGAZIONE
45
PASSO 4) RIPORTARE IL CONTENUTO DELLA TABELLA DI NAVIGAZIONE NEL DATAMART
IL DATAMART è UN DB GESTITO IN SQL SERVER 2000:
SI DEVE QUINDI
FARE UN TRASFERIMENTO DI DATI
DA SQL SERVER 2008 A SQL SERVER 2000
Il modo più semplice è usare gli script
IN SQL SERVER 2008 il contenuto della vista TABELLA_DI_NAVIGAZIONE viene riportato in una tabella
che chiameremo TABLE_TABELLA_DI_NAVIGAZIONE
A) Si crea la tabella con il seguente create table: si noti che a destra vedo le colonne della vista
TABELLA_DI_NAVIGAZIONE in modo da usare nella create table la stessa tipologia di dati
46
B) Inserisco e verifico
Generazione script per TABLE_TABELLA_DI_NAVIGAZIONE
Seleziono Generate Script
47
48
49
IMPORTANTE : SELEZIONARE SCRIPT DATA = TRUE
50
51
52
53
54
55
Con CLOSE viene quindi aperta una nuova finestra di query con all’interno lo script
56
Salvare questo script (dal menu File o usando l’icona)
57
Ora occorre eseguire lo script nel datamart di SQL SERVER 2000
Si apre SQL QUERY ANALIZER
Si apre quindi il file di script
58
SI ottiene
59
IMPORTANTE : SI CANCELLA LA PRIMA RIGA CON
USE EsempioRicorsione
E si esegue lo script
quindi si verifica la creazione della tabella
60
61