Upload
nguyenquynh
View
274
Download
0
Embed Size (px)
Citation preview
Informatica - Classe Quinta robertomana.it
SQL Server
pag 1
SQL Server Rev. Digitale 1.0 del 01/09/2016
Introduzione a Microsoft SQL Server ………………………….…….…..………….………… 2
Tipi di Dati ……………………………………………………………..…...………………….. 2
SQL Express ……………………………………….…………………………..……………….. 4
Tabelle ……………………………………….………………………………………….…….. 5
Query ……………………………………….……………………………….…….…….…….. 6
Viste ……………………………………….………………………………………….....…….. 6
Funzioni …………………………………….………………………………………..….…….. 6
Stored Procedure …………………………….………………………………….……….…….. 8
Transact SQL ……….……………………………….…………………………..……….…….. 12
Trigger …………………………………….…………………………………………….…..….. 13
Transazioni …………………………………….…………….…………………..…….…..….. 15
Gestione delle Relazioni …………………….………………………………...………….…….. 16
Enterprise manager …………………….………………………………...……………...…….. 17
Spostamento e backup del database …………………………………...……………...…….. 17
Import Export di dati …………………………………...…………………..………...…….. 18
Gestione degli utenti …………………………………………………...……………...…….. 19
Informatica - Classe Quinta robertomana.it
SQL Server
pag 2
Introduzione a Microsoft SQL Server http://www.w3schools.com/sql/
http://www.html.it/guide/guida-t-sql/
Caratteristiche: velocità, affidabilità, sicurezza
Usa un linguaggio SQL conforme allo standard ANSI SQL9, case unsensitive.
SQL Srver è un database di tipo Client Server, con un Server che opera in background (talvolta indicato come
processo „demone’, nel senso di invisibile all‟utente) e che gestisce le richieste dei vari client. Tutte le operazioni di
archiviazione ed elaborazione dei dati vengono eseguite sul server, mentre il client è poco più di un dumb terminal
(terminale stupido). Ha anche la possibilità di gestire le SSL Secure Cockets Layer per proteggere i dati durante il
passaggio tra server e client.
Attivazione del SERVER
Per poter utilizzare SQL Server per prima cosa occorre avviare il Server dati. Normalmente in fase di installazione
si imposta il check “Avvia automaticamente il servizio all‟avvio del Sistema Operativo” ed il servizio parte in
automatico ad ogni accensione del PC.
Per verificare lo stato del server andare su START / PROGRAMMI /
MICROSOFT SQL SERVER 2005 / CONFIGURATION TOOLS / SQL SERVER CONFIGURATION MANAGER
Il Server può essere Avviato / Interrotto manualmente. Dalla sottofinestra “SERVICE” delle Proprietà è possibile
reimpostare l‟opzione di Avvio manuale o Avvio automatico del servizio.
Una volta avviato il server rimane attivo in modalità batch e gestisce una elaborazione multithreading, che
permette a più client di connettersi contemporaneamente al database ed eseguire interrogazioni simultanee.
Tipi di Dati
I Dati Numerici
TINYINT – 1 byte - Valore numerico compreso tra –128 e 127. TINYINT UNSIGNED 0 e 255
SMALLINT – 2 byte - Valore numerico tra –32768 e 32767. SMALLINT UNSIGNED 0 e 65535
INT– 4 byte Valore numerico tra –2.147.483.648 e 2.147.483.647. INT UNSIGNED 0 e 4Mld
BIGINT – 8 byte Valore numerico compreso tra 2 63
BIGINT UNSIGNED 0 e 2 64
REAL – 4 byte - Floating point tra -3.402823466E+38 e -1.175494351E-38.
FLOAT – 8 byte - Floating point tra -1.7976931348623157E+308 e -2.2250738585072014E-308
DECIMAL (N) o NUMERIC(N) – Identici. Valore numerico ad altissima precisione. Hanno una dimensione
fissa di 5 bytes per la parte intera, più un numero di bytes variabile a seconda della precisione richiesta
(numero di cifre dopo la virgola)
MONEY valuta ($400.50). 8 bytes complessivi fissi, con 4 sole cifre dopo la virgola.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 3
Le Stringhe
CHAR (N) – Stringa a lunghezza fissa pari a N (max 8000 caratteri). Il campo viene completato con spazi. Notare
che, a differenza di Access, quando si elaborano queste stringhe da un programma HOST, le stringhe mantengono
SEMPRE gli spazi finali, per cui occorre necessariamente accodare sempre al campo proveniente da SQL Server il
metodo
xxx.ToString.Trim( )
VARCHAR (N) – Stringa di lunghezza variabile. In pratica è identico a CHAR, cambia solo la modalità di
registrazione. Vengono memorizzati soltanto i caratteri effettivamente presenti (max 8000) più due byte per
la lunghezza. Eventuali caratteri eccedenti N vengono eliminati. Occupa meno spazio ma è più lenta della
precedente. In MySQL i campi definiti CHAR con lunghezza superiore a 4 vengono automaticamente
convertiti in VARCHAR.
NCHAR(N) – Stringa a lunghezza fissa UNICODE (max 4000 caratteri)
NVARCHAR (N) – Stringa a lunghezza variabile UNICODE
TEXT (N) – Stringa a lunghezza variabile. Max 4 Mld di caratteri + 4 byte per la lunghezza
NTEXT (N) – Stringa UNCODE a lunghezza variabile. Max 2 Mld di caratteri + 4 byte per la lunghezza
Altri tipi di dati
BIT – 1 / 0 sono riconosciuti i valori TRUE / FALSE (in modo case unsensitive)
DATETIME – Data e Ora, nel formato del S.O.. cioè GG / MM / AAAA- hh:mm:ss
Può contenere solo la data o solo l‟ora. Occupa 8 bytes. Ha una precisione di 3,3 msec, gestisce date dal
1° gennaio 1753 al 31 dicembre 1999
SMALLDATETIME – Data e Ora su soli 4 bytes. Ha una precisione di 1 minuto, gestisce date dal
1° gennaio 1900 al 6 giugno 2079
BINARY (N) – Dati Binari a lunghezza fissa (max 8000 bytes)
VARBINARY (N) – Dati Binari a lunghezza variabile (max 8000 bytes)
IMAGE (N) – Dati Binari a lunghezza variabile . Max 4 Mld di caratteri + 4 byte per la lunghezza
ROWVERSION (vecchio TIMESTAMP) Numero univoco a livello di database automaticamente aggiornato
in corrispondenza di ogni aggiornamento del record. ReadOnly. Utile per la gestione della concorrenza. Ogni
tabella può includere una sola colonna di tipo ROWVERSION
UNIQUEIDENTIFIER Identificatore Univoco Globale (GUID Globaly Unique Identifier). Si stratta di una
stringa esadecimale del tipo XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX (8-4-4-4-12).
Gli si può assegnare un valore diretto mediante la funzione NEWID
Gestione dei contatori
Un contatore è un campo numerico incrementato automaticamente. Un qualunque campo numerico può essere
gestito come contatore (cioè ad incremento automatico) settando la proprietà
Identità = SI
Si può anche impostare per il contatore un valore iniziale a piacere ed un incremento diverso da 1.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 4
SQL Express
Visual Studio mette a disposizione del programmatore un server SQL meno prestante rispetto a quello
“professionale” e con una interfaccia grafica piuttosto ridotta, ma in cui è possibile testare tutti i possibili comandi
SQL riconosciuti dal server “professionale”.
Avvio del Server
SQL Express viene installato automaticamente insieme a Visual Studio, Dalla versione Visual Studio 2012 in
avanti il demone di ascolto non viene più avviato insieme alla macchina, e nemmeno risulta visibile come servizio
interrotto nella lista dei servizi, ma viene avviato automaticamente nel momento in cui da Visual Studio si crea una
nuova connessione ad un DB, e viene avviato non come servizio ma come semplice processo utente.
Creazione di una nuova connessione
Dall‟interno di Visual Studio aprire Server Explorer, selezionare DataConnections e, mediante tasto destro,
selezionare Add Connection
Sulla finestra che si apre selezionare “Microsoft SQL Server Database File” che consente di localizzare il file
dati attraverso il file system. Scegliendo invece “Microsoft SQL Server” il DB verrebbe automaticamente creato
nello spazio dati di Sql Server. Comoda la spunta alla voce “Always use this selection”.
Sulla finestra successiva, tramite sfoglia, ricercare la cartella in cui si intende creare il database ed impostare il
nome SENZA estensione (che verra aggiunta automaticamente).
Informatica - Classe Quinta robertomana.it
SQL Server
pag 5
Dopo aver creato la connessione ad un database (nuovo o esistente), in basso a destra, nella finestra delle proprietà,
è possibile vedere la connection string utilizzata per l‟accesso al database. Questa connection string potrà poi
essere replicata pari pari nelle applicazioni C#.
Il Connection Timeout (tipicamente 30 sec) è il tempo di attesa nell‟attivazione della connessione. Se in questo
tempo la connessione non va a buon fine verrà segnalato un messaggio di errore.
DBA Data Base Administration
Tabelle
Tabelle / tasto destro / Nuova Tabella. Si apre in corrispondenza n ambiente che un approccio parallelo alla
definizione della tabella, che può essere definita in formato grafico e/o in formato SQL. Il nome della tabella può
essere definito SOLTANTO all‟interno dell‟SQL.
Col tasto destro sul campo codice, di può impostare la chiave primaria (esattamente come in Access).
Notare, in coda, all‟SQL, la definizione di Primary key, Foreign Key e Check.
Come salvare la tabella creata
Terminata la creazione della tabella, per salvare la struttura clickare sul pulsante Aggiorna (in figura quello
cerchiato). Il database viene aggiornato con la creazione della nuova tabella. Se di chiude la finestra senza aver
aggiornato il Database, SQL Server chiede se si desidera salvare il codice SQL all‟interno di un file di testo per
eventuali usi futuri. Clickando su Aggiorna questa domanda non viene fatta.
Il corrispondenza dell‟OK il DB verrà
creato automaticamente.
Il pulsante Test Connection consente di
verificare se la connessione è OK
Informatica - Classe Quinta robertomana.it
SQL Server
pag 6
Se si desidera cambiare il nome ad una tabella già creata, è sufficiente cambiare il nome all‟interno dell‟SQL e
aggiornare il DB. Verrà creata una nuova tabella con il nuovo nome e occorrerà poi rimuovere la vecchia tabella.
Attenzione che i dati NON vengono ovviamente copiati e dovrà essere predisposta apposita procedura.
Aggiornamento dell’interfaccia
Dopo aver creato una nuova Vista, Funzione o Stored Procedure, o inserito nuovi dati, per poterli vedere andare su
sulla voce corrispondente del DB a fare tasto destra / Aggiorna
Query
Le query sono tipicamente applicazioni client eseguite sul client.
Sul Server è possibile definire in alternativa tre tipi di procedure: Viste, Funzioni e Stored Procedure .
Viste
Una vista è una Query memorizzata sul server che può essere vista come una Tabella Virtuale.
La vista è in pratica una mini tabella direttamente linkata al database vero e proprio. All‟interno di una vista :
Lo scopo delle Viste è quello di rendere più flessibile la visibilità dei dati. Ad esempio su una tabella contenente
una anagrafica dei Dipendenti, contenenti sia dati anagrafici generali (nome, cognome, residenza) sia dati più
sensibili come ad esempio lo stipendio, si può creare una Vista che esclude i campi sensibili e, a certi utenti,
assegnare i privilegi di accesso soltanto alla Vista.
CREATE VIEW dbo.View1
AS
SELECT Correntisti.Nome, Correntisti.Tel FROM Correntisti;
All‟interno di una Vista:
E‟ possibile utilizzare ESCLUSIVAMENTE l‟istruzione SELECT
Non è consentito utilizzare ORDER BY (Standard ANSI : la view come la tabella deve ritornare un set di
dati che non possiede alcun ordinamento)
Non sono ammessi parametri di ingresso
In SQL Server una Stored Procedure non può utilizzare un’altra Stored Procedure come sorgente dati
(come in Access), ma può invece utilizzare come sorgente dati una VISTA che, come detto, a tutti gli effetti si
comporta come una normale tabella. Per cui se una Stored Procedure Q3 deve utilizzare altre due procedure Q1 e
Q2 è sufficiente creare Q1 e Q2 come viste e poi utilizzarle come sorgente dati all‟interno del FROM di Q3.
C‟è però il problema che le Viste NON accettano parametri di ingresso. A tale scopo SQL Server utilizza le
Funzioni Inline possono essere utilizzate per ottenere proprio la funzionalità delle viste parametrizzate.
Funzioni
Sono lo strumento per definire funzioni / procedure (nel senso classico del temine) all‟interno del DBMS, non
necessariamente legate alla restituzione di un recordset. Devono avere sempre un RETURN finale.
Consentono un accesso al DB in sola lettura, per cui non possono eseguire comandi DDL / DML
Consentono il passaggio in-line dei parameri
Consentono di restituire al chiamante un singolo risultato, un intero record o un intero recordet.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 7
Funzioni Inline -
Restituiscono un recordset completo. Costituiscono la funzionalità di SQL Server più vicina alle Query di Access.
CREATE FUNCTION dbo.CercaFiliali(
@cComune int,
)
RETURNS TABLE
AS
RETURN (
SELECT filiali.*
FROM filiali
WHERE filiali.cComune=@cComune )
A livello di query client, la precedente funziona può essere richiamata nel modo seguente :
string sql = "select * FROM dbo.CercaFiliali(18, 'BRE') ";
ado.EseguiQuery(sql, CommandType.Text);
Eventuali parametri devono essere comunque passati, anche se presentano un valore di default.
Funzioni con Valori Scalari - Restituiscono un singolo valore:
CREATE FUNCTION dbo.CercaBancaSingola (
@cFiliale int
)
RETURNS varchar(20)
AS
DECLARE @ret varchar(20);
SELECT @ret = filiali.nome
FROM filiali
WHERE filiali.cFiliale=@cFiliale;
IF (@ret IS NULL)
SET @ret = '';
RETURN @ret;
A livello di query client, la precedente funziona può essere richiamata nel modo seguente :
string sql = "select dbo.CercaBancaSingola(3) ";
string ris= ado.EseguiScalar(sql, CommandType.Text);
Esecuzione delle Query: nota su Date e Numeri Float
Dopo aver scelto una tabella (es Movimenti) e fatto / Mostra Dati tabella / è possibile accodare nuovi valori
inserendoli nel formato del SO, senza l‟utilizzo di apici
Viceversa i valori
scritti direttamente all‟interno di Insert Into
passati all‟interfaccia grafica di esegui query
passati tramite C#
devono essere scritti in formato internazionale senza apici, obbligatori solo caso di date e strighe
insert into Movimenti
(codConto, importo, data, tipo)
values( 7, 99.33, '11/26/2013' , 'P’); // oppure
values('7', '99.33', '11/26/2013', 'P');
Nel caso dell‟interfaccia grafica di EseguiQuery, numeri (int e float) e anche stringhe vanno scritti senza apici
Nel caso invece dei parametri passati da C#, vanno scritti tutti con gli apici, (tranne gli interi)
Informatica - Classe Quinta robertomana.it
SQL Server
pag 8
Stored Procedure
Strumento più generale dei precedenti.
Il nome di una Stored Procedura non può iniziare con un numero ma deve iniziare con una lettera.
Pur chiamandosi Stored Procedure, queste procedure, prima di terminare, resituiscono un valore al
chiamante (normalmente Return 0). Questo valore non centra nulla con il valore ritornato da EseguiScalar.
Query che restituiscono un recordset
Possono essere eseguite solo tramite eseguiQuery, la quale, esattamente come in Access, può essere eseguita
solo nei modi seguenti:
In caso di query testuale si usa il CommandType.Text.
In caso di procedura su DBMS si usa il CommandType.StoredProcedura
Eventuali parametri della stored procedure possono essere passati solo tramite l‟oggetto Parameters
Esempio
CRETE PROCEDURE CercaFiliali (
@parameter1 int = 18,
@parameter2 varchar(20) = 'BRE' )
AS
SELECT filiali.*
FROM filiali, banche
WHERE filiali.cBanca=Banche.cBanca
AND filiali.cComune=@parameter1
AND banche.nome = @parameter2;
Richiamo da C#
SqlParameter par2 = new SqlParameter();
par2.ParameterName = "@parameter2";
par2.Direction = ParameterDirection.Input;
par2.DbType = DbType.String;
par2.Size = 20; // obbligatorio nel caso di stringhe !!
par2.Value = “Unicredit”;
ado.cmd.Parameters.Add(par2);
string sql = "CercaFiliali";
ado.EseguiQuery(sql, CommandType.StoredProcedure);
L‟ordine con cui vengono creati e aggiunti i parametri è irrilevante.
Quello che conta è soltanto il nome che DEVE essere lo stesso utilizzato all‟interno della StoredProcedure.
La preinizializzazione dei parametri di input non vale nel caso di SQL embedded, in cui occorre in ogni caso
passare TUTTI i parametri attesi dalla procedura.
Non è consentito accodare i parametri al nome della procedura e usare CommandType.Text
Comandi DDL/DML
Possono essere eseguiti solo con eseguiNonQuery, la quale può essere eseguita in tre modi diversi:
In caso di query testuale si usa al solito il CommandType.Text.
In caso di procedura su DBMS si hanno due possibilità:
Accodare i parametri al nome della Procedura e usare il CommandType.Text
Passare i parametri tramite l‟oggetto Parameters e usare il CommandType.StoredProcedure
Non è possibile utilizzare una combinazione mista dei due casi.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 9
Esempio – Creazione di una tabella
CREATE PROCEDURE CreaTabMovimenti AS
create table MOVIMENTI2 (
cMov int identity(1,2), /* a partire da 1 con incr di 2 */
cConto int,
tipo varchar(10) NOT NULL,
data dateTime,
importo real,
primary key (cMov),
foreign key (cConto) references Conti(cConto) ON DELETE CASCADE,
check (import > 10),
check(data between '1/1/2012' and '31/12/2012')
);
ALTER TABLE MOVIMENTI2
ADD CHECK (tipo='Prelievo' OR tipo='Versamento');
Query scalari (che restituiscono un singolo valore)
Sono richiamate normalmente con EseguiScalar. Per risultato scalare si intende quello restituito dalla select che
viene AUTOMATICAMENTE ritornato al chiamante come stringa. Tutto ciò è indipendente dal return finale.
Esempio
CREATE PROCEDURE [dbo].[queryScalar] @cod int = 0 AS SELECT Banche.nome from Banche where Banche.codBanca = @cod; RETURN 0;
Il chiamante può usare EseguiScalar nel modo seguente:
string ris = ado.eseguiScalar(“queryScalar”, CommandType.StoredProcedure);
Con eseguiScalar è passibile:
Accodare i parametri al nome della Procedura e usare il CommandType.Text
Passare i parametri tramite l‟oggetto Parameters e usare il CommandType.StoredProcedure
Query che restituiscono campi multipli di un solo record - Parametri di output
Le Stored Procedure posso anche gestire uno o più parametri di output che sono tipicamente utilizzati nel caso in
cui una query restituisca più campi di un unico record . Nel caso di un solo campo l‟utilizzo di un parametro di
output è del tutto inutile in quanto il risultato viene già automaticamente ritornato dalla select senza dover fare
nulla.
Queste query possono essere indifferentemente richiamate trmite
EseguiScalar senza però andare a leggere il risultato della select
EseguiNonQuery
Il confine tra EseguiNonQuery e EseguScalar è in pratica soltanto formale: eseguiScalar, nel caso di query
effettivamente scalare, restituisce automaticamente il risultato, eseguiNonQuery no.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 10
Esempio
CREATE PROCEDURE [dbo].[cercaBanca]
@cod int = 0,
@nome varchar(20) output,
@citta varchar(20) output
AS
SET NOCOUNT ON;
begin
SELECT @nome = Banche.nome, @citta = Banche.citta
from Banche
where Banche.codBanca = @cod;
RETURN 0;
end
SET NOCOUNT ON Stops the message indicating the number of rows affected by a Transact-SQL statement
from being returned as part of the results. Riduce il traffico specie nel caso di Stored Procedure costituite da più
statements.
I parametri di output possono essere gestiti solo mediante l‟oggetto Parametrs e non possono essere accodati in
forma testuale.
Richiamo da C#
Come detto all‟inizio si può utilizzare indifferentemente eseguiScalar (senza andare a leggere il valore
restituito) oppure eseguiNonQuery.
SqlParameter par1 = new SqlParameter();
par1.ParameterName = "@cod";
par1.Direction = ParameterDirection.Input;
par1.DbType = DbType.Int16;
par1.Value = "4";
ado.cmd.Parameters.Add(par1);
SqlParameter par2 = new SqlParameter();
par2.ParameterName = "@nome";
par2.Direction = ParameterDirection.Output;
par2.DbType = DbType.String;
par2.Size = 20; // obbligatorio nel caso di stringhe !!
par2.Value = ""; // non obbligatorio
ado.cmd.Parameters.Add(par2);
ado.eseguiNonQuery(“cercaBanca”, CommandType.StoredProcedure); // oppure :
ado.eseguiScalar ( “cercaBanca”, CommandType.StoredProcedure);
MessageBox.Show(par2.Value.ToString() + " - " + par3.Value.ToString());
Codice di ritorno delle Stored Procedure
Il valore ritornato dal return finale può essere letto dal chiamante mediante un parameter speciale avente nome =
RETURN_VALUE e direction = ReturnValue.
SqlParameter par1 = new SqlParameter();
par1.ParameterName = "@RETURN_VALUE";
par1.Direction = ParameterDirection.ReturnValue;
par1.DbType = DbType.Int32;
ado.cmd.Parameters.Add(par1);
. . . . . . . . . . . . . . . . .
MessageBox.Show(par1.Value.ToString());
Informatica - Classe Quinta robertomana.it
SQL Server
pag 11
Esempio - Inserimento di un nuovo record
CREATE PROCEDURE inserisciMovimento (
@cConto int,
@tipo varchar(10),
@data datetime,
@importo float
)
AS
INSERT INTO movimenti // I campi contatore non devono essere passati
(cConto, Tipo, Data, Importo)
VALUES(@cConto, @tipo, @data, @importo);
RETURN SCOPE_IDENTITY();
Il return finale restituisce al chiamante l’ID del nuovo record appena aggiunto.
Comodissimo. Risolve perfettamente il problema della multiutenza.
Richiamo da C#
string sql = "inserisciMovimento 3, 'prelievo', '12/25/2012', '1.99'";
ado.EseguiNonQuery(sql, CommandType.Text);
oppure
ado.cmd.Parameters.Add("@cConto", SqlDbType.Int).Value = "2";
ado.cmd.Parameters.Add("@tipo", SqlDbType.VarChar, 10).Value = "Prelievo";
ado.cmd.Parameters.Add("@data", SqlDbType.Date).Value = "12/25/2012";
ado.cmd.Parameters.Add("@importo", SqlDbType.Float).Value = "1.99";
// Dichiarazione del return value come da pagina precedente.
ado.EseguiNonQuery(inserisciMovimento, CommandType.StoredProcedure);
MessageBox.Show(“ID del nuovo record = “ + par1.Value.ToString());
L‟utilizzo di questa forma abbreviata può essere utilizzata SOLO per i parametri di INPUT.
Se i parametri provengono da Text Box occorre utilizzare la notazione del SO. La conversione viene fatta in
automatico.
In alternativa è anche possibile eseguire la procedura precedente con eseguiScalar(). Per trasformare la
procedura precedente in scalare è sufficiente aggiungere prima del return (oppure al posto del return),
una istruzione select che restituisca lo scope_identity come risultato scalare: SELECT SCOPE_IDENTITY();
Se non si elimina il return, il risultato potrà essere letto in due modi diversi, con il ris di eseguiScalar o con par1
Esempio - Cancellazione di un record
CREATE PROCEDURE p5_CancellaMovimento(
@cMov int = null
)
AS
delete
from movimenti
where cMov=@cMov;
Richiamo da C#
string sql = "cancellaMovimento '15'";
ado.EseguiNonQuery(sql, CommandType.Text);
oppure
ado.cmd.Parameters.Add("@cMov", SqlDbType.Int).Value = "48";
ado.EseguiNonQuery(“cancellaMovimento”, CommandType.StoredProcedure);
Informatica - Classe Quinta robertomana.it
SQL Server
pag 12
Transact SQL : Stored Procedure con Comandi Multipli
Dentro le Stored Procedure possono essere memorizzati più comandi SQL ciascuno terminato dal punto e virgola.
Più comandi inseriti all‟interno di una unica Stored Procedure consentono prestazioni migliori rispetto
all‟esecuzione singola (minor generazione di traffico tra Client e Server).
Per meglio combinare tra loro i vari statement SQL da eseguire all‟interno della Stored Procedure, SQL Server
mette a disposizione il cosiddetto Transact SQL cioè tutti i costrutti tipici della programmazione come istruzioni
per il controllo del flusso (if e while per esempio), variabili, gestione degli errori, ecc.
BEGIN - END
Le istruzioni BEGIN END vengono utilizzati esattamente come le graffe del C, cioè per raggruppare più istruzioni
SQL o T-SQL in un unico blocco. Nel caso di istruzione singola possono essere omessi.
DECLARE
Nella sezione di codice (dopo gli eventuali parametri) è possibile, tramite un blocco DECLARE, definire delle
variabili locali di appoggio all‟esecuzione della Transact SQL. Es: Declare cConto int;
SET
Consente di assegnare un valore ad una variabile. Es: Set cConto =5;
IF - ELSE
Struttura fondamentale per l‟elaborazione condizionale. Il Test di uguaglianza è il semplice uguale: if (a=b)
Ciclo WHILE
Le istruzioni SQL interne al ciclo sono racchiuse all‟inteno di un blocco BEGIN END. Le istruzioni SQL vengono
eseguite ripetutamente finchè la condizione specificata è vera, a quel punto si esce dal loop. E‟ possibile controllare
l‟esecuzione delle istruzioni all‟interno del loop attraverso le parole chiave BREAK e CONTINUE.
CASE - END
Analogo allo switch del C.
Esempio Completo
CREATE PROCEDURE dbo.p6_ComandiMultipli (
@cConto int,
@Tipo varchar(10),
@Data datetime,
@Importo real
)AS
BEGIN
INSERT INTO movimenti
(cConto, Tipo, Data, Importo)
VALUES(@cConto, @Tipo, @Data, @Importo);
if (@Tipo='prelievo')
update conti
set saldo = saldo - @Importo
where cConto=@cConto;
else
update conti
set saldo = saldo + @Importo
where cConto=@cConto;
END
Informatica - Classe Quinta robertomana.it
SQL Server
pag 13
Altro Esempio
CREATE PROCEDURE p7_ComandiMultipli2 (
@cConto int=null,
@Tipo varchar(10) =null,
@Data datetime =null,
@Importo real =null )
AS
IF NOT exists(select cConto from Conti Where cConto=@cConto)
BEGIN
return(-1); /* errore */
END
ELSE
BEGIN
INSERT INTO movimenti
(cConto, Tipo, Data, Importo)
VALUES(@cConto, @Tipo, @Data, @Importo);
return(1); /* OK */
END
Richiamo da C#
SqlParameter par = new SqlParameter();
par.ParameterName = "@RETURN_VALUE";
par.Direction = ParameterDirection.ReturnValue;
par.DbType = DbType.Int16;
par.Value = "0";
ado.cmd.Parameters.Add(par);
string sql = "p7_ComandiMultipli2";
ado.EseguiNonQuery(sql, CommandType.StoredProcedure);
MessageBox.Show(par.Value.ToString());
Stored Procedure di Sistema
Per rinominare una tabella o una Stored Procedure o altro, si può utilizzare la Sytem Stored Procedure
sp_rename richiamabile secondo la normale sintassi delle Stored Procedure.
adoNet ado = new adoNet();
string sql = "sp_rename 'movimenti', 'movimentiNew';";
ado.EseguiNonQuery(sql, CommandType.Text);
Trigger
Un trigger è una Stored Procedure non richiamabile lato client, ma che “scatta” automaticamente in corrispondenza
di una operazione di INSERT / DELETE / UPDATE. I Trigger vengono salvati NON all‟interno della voce Stored
Procedure, ma al di sotto della tabella a cui si riferiscono.
Il codice interno al trigger può accedere alle tabelle speciali INSERTED e DELETED che contengono i record
inseriti o cancellati in corrispondenza dell‟ultima azione SQL. Per cui:
Un Trigger dichiarato FOR INSERT andrà a leggere i record INSERTED
Un Trigger dichiarato FOR DELETE andrà a leggere i record DELETED
Nel caso dei Trigger dichiarati FOR UPDATE la tabella DELETED conterrà i dati prima della modifica
(le vecchie righe) mentre la INSERTED conterrà i dati dopo la modifica (le nuove righe).
Informatica - Classe Quinta robertomana.it
SQL Server
pag 14
Esempio 1:
CREATE TRIGGER p8_updateSaldo ON Movimenti
FOR INSERT /* , delete, update : sono ammesse più azioni contemporanee */
AS
begin
DECLARE @cConto int;
DECLARE @tipo varchar(10);
DECLARE @importo float;
SELECT @cConto = cConto, @tipo = tipo, @importo = importo
from INSERTED;
IF(@tipo='versamento')
update conti
set conti.saldo = conti.saldo + @importo
where conti.cConto = @cConto;
ELSE
update conti
set conti.saldo = conti.saldo - @importo
where conti.cConto = @cConto;
end
Esempio 2:
CREATE PROCEDURE dbo.Aggiorna_Saldo
( @versamento real, @cConto int )
AS
update Conti set saldo = saldo + @versamento
where cConto = @cConto;
CREATE TRIGGER AggiungiMovimento ON Conti
FOR UPDATE
AS
begin
declare @cConto int;
declare @saldoOld real;
declare @saldoNew real;
declare @importo real;
select @cConto = cConto, @saldoNew = saldo from INSERTED;
select @saldoOld = saldo from DELETED;
set @importo = @saldoNew-@saldoOld;
insert into Movimenti (cConto, Tipo, Data, Importo)
Values (@cConto, 'versamento', getDate(),@importo);
end
Attenzione che le tabelle INSERTED e DELETED sono accessibili soltanto come tabelle nel FROM di una
preventiva istruzione SELECT e non sono utilizzabili direttamente all‟interno del WHERE o INSERT
dell‟istruzione successiva.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 15
Transazioni
I comandi multipli inseriti all‟interno di una unica Stored Procedure non costituisco di per sé una transazione.
Prima di eseguire i comandi l‟interprete SQL esegue un controllo sintattico sui comandi stessi. Se uno dei comandi
(eventualmente anche l‟ultimo) contiene un errore sintattico, allora nessuno dei comandi viene eseguito. Se però
non sono presenti errori sintattici, allora viene avviata l‟esecuzione e se qualcuno dei comandi fallisce (perché ad
esempio è venuta a mancare la rete), l‟esecuzione dei comandi si interrompe, ma i comandi eseguiti in precedenza
non vengono più annullati. Per racchiudere i comandi all‟interno di una transazione occorre utilizzare la seguente
sintassi:
CREATE PROCEDURE [dbo].[P12_Bonifico]
@importo float = 0,
@contoSorgente int,
@contoDestinazione int
AS
if(@contoDestinazione=@contoSorgente)
return -2;
BEGIN TRANSACTION
INSERT INTO Movimenti(importo,data,tipo,codConto)
VALUES(@importo,GETDATE(),'P',@contoSorgente)
if(@@ERROR<>0)
BEGIN
ROLLBACK
// 16=Severity Level (da 1 min a 18 max).
// 1=state (da 1 a 255 identifica la procedura utente che è andata in errore). RAISERROR('Errore durante il prelievo',16,1)
return -1;
END
INSERT INTO Movimenti(importo,data,tipo,codConto)
VALUES(@importo,GETDATE(),'V',@contoDestinazione)
if(@@ERROR<>0)
BEGIN
ROLLBACK
RAISERROR('Errore durante il versamento',16,2)
return -1;
END
-- STEP 4: If we reach this point, the commands completed successfully
COMMIT
RETURN 0
Informatica - Classe Quinta robertomana.it
SQL Server
pag 16
Gestione delle Relazioni
Diagrammi / Nuovo Diagramma Database
Se il database è grande, si possono creare e salvare più diagrammi disgiunti (ciascuno inerente ad un certo gruppo
di tabelle).
Aggiungere le tabelle utente desiderate.
Le relazioni si costruiscono eseguendo un trascinamento con il mouse tra i campi interessati esattamente come in
Access. In fase di creazione dell‟Associazione si presenta la seguente finestra di configurazioni:
Verifica Dati esistenti Durante la Creazione. E‟ possibile, in fase di creazione dell‟associazione, attivare /
disattivare la verifica sulla bontà dei dati esistenti rispetto al vincolo che si sta introducendo.
Attiva Vincolo della Chiave Esterna Per ogni Associazione SQL Server imposta per default il check di
integrità referenziale che non consente modifiche di inserimento / Aggiornamento / Cancellazione tali da
compromettere l‟integrità della relazione.
Agenti di Replica Gli Agenti di Replica sono dei file eseguibili che fanno parte di SQL Server e che si
occupano della creazione di copie di schemi e di dati, il rilevamento di aggiornamenti nel server e la
distribuzione delle modifiche tra i server. Questo check Indica se applicare il vincolo di integrità quando un
agente di replica esegue un inserimento o un aggiornamento nella tabelle correlate.
Opzione Elimina regola In caso di eliminazione di un record dalla tabella 1 è possibile :
Nessuna azione Un messaggio di errore indica che l'eliminazione dalla tabella 1 non è consentita e viene
eseguito il rollback dell'operazione DELETE.
Sovrapponi Elimina tutte le righe della tabella N che contengono dati coinvolti nella relazione di chiave
esterna. E‟ la solita eliminazione a catena
Imposta Null Imposta al valore Null il campo chiave esterna della tabella N (ammesso che questo possa
possa accettare valori Null)
Imposta predefinito Imposta al valore Predefinito il campo chiave esterna della tabella N. Se non sono
stati impostati valori predefiniti viene impostato il valore Null. Se questo non è ammesso viene impedita
l‟eliminazione.
Opzione Aggiorna regola Analogo al precedente nel caso in cui venga modificata la chiave di un record della
tabella 1.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 17
Enterprise Manager
Spostamento e Backup del database
Enterprise Manager tiene traccia dei database gestiti e del loro percorso, database che dunque non possono essere
spostati né eliminati. Se si vuole copiare il database (per utilizzarlo ad esempio su un altro computer), il modo più
semplice è quello di copiare il file .MDF da Gestione Risorse dopo aver chiuso EnterpriseManager ed arrestato il
Server Sql
Copiato il file sul nuovo PC ( oppure eliminato da Enterprise Manager il file originale mediante tasto Destro /
Elimina), si può andare sulla voce Database, tasto Destro / Tutte le Attività / Collega Database e ricercare
mediante il solito comando Sfoglia il database .MDF da collegare a SQL Server. Si può selezionare anche, fra gli
utenti disponibili, chi sarà il Proprietario (dbo) del database in fase di collegamento..
Attenzione che questo copia incolla manuale funziona solo se il database non è partizionato, cioè distribuito su più
files (eventualmente posizionati su macchine differenti). In tal caso occorre lanciare la procedura completa di backup
Procedura di Backup
Selezionare il database, tasto destro / Tutte le Attività / Backup Database.
Impostazioni:
database da salvare
nome e Descrizione del database da
salvare
tipologia di backup (Database - completo)
Destinazione (Percorso / Nome da
assegnare al file di backup)
Sovrascrittura (opzione di sovrascrittura o
accodamento rispetto ad un eventuale file
di backup già esistente)
Pianificazione: il backup può essere
pianificato ad una data precisa (giorno X
ora Y) oppure in modo periodico (ogni
settimana di domenica alle ore 0:00:00)
Informatica - Classe Quinta robertomana.it
SQL Server
pag 18
Il file di backup è slegato da SQL Server, che però tiene traccia del nome e percorso in cui il file di backup è stato
salvato (tipica cartella di backup posizionata insieme al database). E‟ sicuramente buona cosa non spostare questo
file in modo da poter sfruttare al meglio lo storico gestito da SQL Server.
L‟opzione Backup Database – differenziale aggiunge nel file di backup soltanto le modifiche eseguite dopo
l‟ultimo backup. E‟ anche possibile salvare queste modifiche su un nuovo file rispetto al file in cui è stato salvato il
backup completo (ogni volta si ripete “Aggiungi” cambiando il nome). In tal modo si potrà avere un file principale
di backup aggiornato, ad esempio, alla fine del mese, e poi ogni giorno un file di backup differenziale. In tal modo
si potrà ritornare indietro a qualsiasi giorno del mese. Per fare il RESTORE fino al giorno desiderato occorrerà
dapprima fare il Restore del database completo e poi, uno alla volta, dei primi N file differenziali.
Per ripristinare il file di backup, andare su Database e fare tasto Destro / Tutte le Attività / Ripristina Database e
selezionare, nella parte inferiore della finestra, il file che si intende ripristinare.
Import / Export di dati
Per importare i dati (ad esempio da un database Access) occorre :
1) creare un nuovo database vuoto senza specificare il percorso. Il db verrà creato all‟interno del percorso di default
C:\Programmi\Microsoft SQL Server\MSSQL.1\MSSQL\Data
2) Selezionare il database appena creato e fare Tasto Destro / Tasks / Importa Dati
In italiano TASKS = “Tutte le Attività”
Selezionare Access
Fare il Browse del database
Use Windows Authentication
Selezionare tutte le tabelle
FINISH
3) db / Tasto Destro Refresh
Per recuperare / trasferire il database appena creato occorre chiudere Enterprise Manager, arrestare il demone (che
altrimenti mantiene bloccato il database, andare nella precedente cartella di SQL Server e copiare il databse.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 19
Gestione degli utenti
Facendo click sulla voce Utenti compare l‟elenco degli utenti attualmente abilitati ad accedere al database dbLibri.
Inizialmente l‟unico utente abilitato è dbo, data base owner cioè colui che ha creato il database; normalmente
coincide con sa (System Administrator) ma potrebbe essere uno qualsiasi degli altri utenti. Facendo tasto desto /
Proprietà si vede che dbo è db_owner, cioè proprietario del database e può dunque fare sul database tutto ciò che
vuole.
Selezionando invece Utenti / Nuovo Utente Database, sul primo ComboBox (Nome Account Accesso) compare un
elenco di utenti già esistenti ma non ancora abilitati ad eccedere al database corrente. Scegliendo “nuovo” si può
creare un nuovo utente ed abilitarlo ad accedere al database.
L‟ultima finestra “Accesso Database” consente di aggiungere l‟utente attuale ad uno dei gruppi predefiniti (ogni
utente appartiene per default al gruppo PULBIC, ma può essere aggiunti ad altri gruppi, ad esempio db_datareader)
La parola Ruoli in SQL Server è sinonimo di Gruppi.
Si può scegliere
se eseguire una autenticazione Windows
(utente attualmente loggato) oppure una
autenticazione SQL Server (default)
il database predefinito in corrispondenza
dell‟accesso di quell‟utente.
La lingua predefinita
Informatica - Classe Quinta robertomana.it
SQL Server
pag 20
Dopo aver creato l‟utente “Segreteria”, esso verrà aggiunto a dbo nella lista degli utenti abilitati ad accedere al
database corrente. Facendo doppio click oppure tasto desto / Proprietà si apre la finestra dei diritti dell‟utente
Segreteria . Cliccando su “Autorizzazioni” si possono impostare le autorizzazioni dell‟utente su:
Tabelle del database (Visualizzazione dei dati, Inserimento, Modifica, Cancellazione)
StoredProcedure (diritto di Esecuzione)
Singole colonne delle tabelle (diritto di Visualizzazione, e di Modifica dei dati).
Selezionando invece la cartella Protezione (cartella sullo stesso livello di Database), è possibile rimuove i vari
utenti, modificare le password, modificare il database di apertura.
Generazione di Script SQL
Selezionata una tabella, fare Tasto Destro / Tutte le Attività / Genera Script SQL.
Questa utility consente di creare un file .sql contenente una sequenza di comandi sql che verranno eseguiti uno
dopo l‟altro in corrispondenza del lancio dello script. Utile quando si intende eseguire sul database una
manutenzione periodica che richiede sempre la stessa sequenza di operazioni.
Cliccando su “Mostra Tutto” viene mostrato in basso a sinistra l‟elenco di Tabelle, Viste, Stored Procedure
memorizzate all‟interno del database corrente. Mediante i pulsanti Aggiungi / Rimuovi si possono selezionare gli
oggetti per i quali si vuole creare uno script. Per default è preimpostata la tabella da cui è stata aperta l‟attuale
finestra degli Script.
Le sottofinestre Formattazione e Opzioni consentono di selezionare i comandi che si intendono eseguire
all‟interno dello script. Per default sono selezionati i comandi “Create Table” e “Drop Table” per la tabella
selezionata (Script che in pratica cancella la tabella attuale (se esiste) e quindi provvede a ricrearla). Utile ad
esempio dopo che è stato eseguito il back up dei dati da un server ad un altro.
Il pulsante “Anteprima” mostra il codice, generato automaticamente, relativo allo script corrente (in base a quanto
selezionato nelle sottofinestre precedenti).
Lo script, salvato in un file .sql, potrà poi essere lanciato da Query Analizer.
Informatica - Classe Quinta robertomana.it
SQL Server
pag 21
DTS Data Transformation Services
La cartella Data Transformation Services si trova allo stesso livello della cartella Database. Si tratta di un strumento
sempre di tipo Importa / Esporta dati che però rispetto allo strumento precedente, consente di manipolare i dati da
Importare / Esportare. Anche su file molto grandi i DTS sono sempre rapidissimi.
Esmpio:
Tasto Destro / Nuovo Pacchetto
Trascinare sul lato destro la sorgente Dati (ad esempio Microsoft OLEDB Provider for SQL Server) e selezionare il
database che fungerà da origine dati. (nella primo combo selezionare Nuova Connessione).
Trascinare sul lato destro la destinazione Dati (ad esempio Excel 2000) e selezionare il file su cui si andrà ad
esportare i dati.
Trascinare sul lato destro l‟Attività “Trasforma Dati” (ruota dentata). (Entrambe le icone precedenti devono essere
disselezionate). Al rilascio del mouse viene richiesto di selezionare l‟origine dati (clickare sull‟icona di SQL
Server), quindi viene richiesto di selezionare la destinazione dei dati (clickare sull‟icona di Excel).
Facendo doppio click sulla relazione creata (oppure Tasto Destro / Proprietà) si apre una finestra di configurazione
della trasformazione:
Sul tab Origine si possono selezionare i dati da
esportare, dati che possono provenire da una
tabelle oppure da una query SQL.
Sul tab Destinazione si può selezionare il foglio di
Excel su cui si vuole esportare i dati. Mediante il
tasto CREA, se la destinazione è un database, si
può creare una nuova tabella con i campi impostati
mediante una Create Table. Se la dest è Excel è
possibile creare un nuovo foglio (tabella) avente
come colonne i campi impostati da CreateTable.
Sul tab Trasformazioni si imposta la formula di
trasformazione dei dati. (associazione dei campi
della query con le colonne da creare su Excel).
NOME indica semplicemente il nome assegnato
alla trasformazione. All‟apertura del tab ci sono
giò alcune relazioni proposte ma in genere non
sono corrette per cui conviene fare SELEZIONA
TUTTO, ELIMINA e poi selezionare NUOVO
Informatica - Classe Quinta robertomana.it
SQL Server
pag 22
Cliccando su Nuovo si apre una finestra che chiede quali tipo di DTS si intende applicare. Le più frequenti sono
CopyColumn per copiare semplici tabelle di database (ad esempio da Access a SQL Server) oppure
ActiveXScript che consente in pratica di inserire uno script Visual Basic / Java Script all‟interno della
trasformazione, script che verrà eseguito in fase di importazione. In questo script si possono utilizzare tutte le
istruzioni del linguaggio (if, cicli, etc.) più le funzioni di libreria. Soluzione estremamente flessibile per esportare
dati tra ambienti differenti.
L‟ultimo tab della finestra precedente Opzioni consente di impo stare dei delimitatori e fare l‟import With Key.
Nome è un semplice nome identificativo della trasformazione che si sta creando. Cliccando su Proprietà si apre la
finestra di configurazione dello Script. Nel combo in alto a sinistra selezionare lo script che si intende utilizzare.
“Genera Automatico” genera automaticamente un codice di trasformazione che potrà essere raffinato manualmente.
Terminata l‟editazione si può salvare la DTS mediante il menù Pacchetto / Salva con Nome (dts1) e lanciare
l‟esecuzione mediante il tasto Play ►.
Chiusa la DTS, mediante Tasto Destro / Pianifica Pacchetto si può pianificare l‟esecuzione della DTS in modo che
venga automaticamente eseguita ad esempio ogni domenica sera alle 22