SSDT Database Projects
Deep Dives
Casi reali di utilizzo dei Database
Project
Luca Zavarella
May 23, 2015
#sqlsatTorino
#sqlsat400
Sponsors
May 23, 2015
#sqlsatTorino
#sqlsat400
Organizers
ISS
U
#sqlsatTorino
#sqlsat400
May 23, 2015
Luca Zavarella
Microsoft SQL Server BI MCTS & MCITP
Lavoro su SQL Server dal 2007
BI Architect @
Email:
Twitter:
LinkedIn:
Feedback:
May 23, 2015
[email protected]
@lucazav
http://it.linkedin.com/in/lucazavarella
http://speakerscore.com/SSDT
#sqlsatTorino
#sqlsat400
Antefatto...
Il committente ci chiede di realizzare un db
che soddisfi le esigenze di business
Da bravi analisti-sviluppatori noi:
Raccogliamo le specifiche in modo oculato
Modelliamo il tutto opportunamente
Implementiamo quanto modellato in Dev
Facciamo gli opportuni test
Rilasciamo il nostro database in Produzione
May 23, 2015
#sqlsatTorino
#sqlsat400
Modello Imperativo: the old way
Arrivano nuove change request
Il database in Dev subisce delle modifiche
Devo rilasciare queste modifiche in Produzione
Il db live ha un determinato schema in questo istante
Devo applicare una specifica strategia a seconda
dello stato in cui si trova il database (stateful)
Realizzo questa strategia tramite uno script che
«descrive» come raggiungere la versione finale del
database desiderata (imperative)
May 23, 2015
#sqlsatTorino
#sqlsat400
Sfide del Modello Imperativo
•
Dipendenze
•
Rilevamento a posteriori degli errori
Modifica dello schema di una tabella usata da una vista
vista rotta!
Ci si accorge che lo script non funziona soltanto dopo il rilascio
•
Drift detection
Il DBA applica una patch direttamente in Prod
disallineata!
L’applicazione in Dev è
Le differenze sono individuate e riconciliate soltanto se si viene avvisati, se ci se ne
accorge per caso oppure in fase di rilascio!
•
Versioning
Rilascio
script che aggiunge/modifica solo quello che serve
Si perde la definizione dello schema globale del database al quale associare una
versione
Difficoltà nel passare ad una versione precedente del database
•
Deployment
A seconda dello stato del target di rilascio, ho uno script diverso
es. script incrementale, full; schema dei db differenti; versioni diverse di SQL Server
May 23, 2015
#sqlsatTorino
#sqlsat400
May 23, 2015
#sqlsatTorino
#sqlsat400
Modello Dichiarativo: take it easy!
Si sviluppa su un modello di database
globale
Tutti gli oggetti sono definiti come CREATE
(declarative)
Definito il modello, lo script da applicare
all’ambiente target (change script) viene generato
automaticamente all’atto del rilascio in base allo
stato del database target
May 23, 2015
#sqlsatTorino
#sqlsat400
Ambienti di Sviluppo a Confronto
Modello dichiarativo
SSDT (Visual Studio)! ☺
Perché abbandonare il «comodo» SSMS?
Controllo della sintassi degli oggetti/database referenziati in fase
di progettazione
Refactoring agevole (es. rename di colonne/tabelle con
propagazione di modifiche)
Script di change generati automaticamente
Schema e Data Compare a portata di click
No tool di terze parti ☺
Database sotto source control
Team Foundation Version Control (TFVC) oppure Git
No tool di terze parti ☺
Possibilità di testare le modifiche in un ambiente «sandbox»
Non direttamente sul database sul quale lavora tutto il team!
May 23, 2015
#sqlsatTorino
#sqlsat400
Modalità Connessa in SSDT
Si ha l’impressione di «operare a cuore aperto» sul
database live (come in SSMS, imperative)
Dietro le quinte SSDT crea un modello (M1) del db
on-the-fly e permette di editarlo
Quando si operano delle modifiche e si salva:
Crea lo script di change che descrive le modifiche fatte al
modello M1
Crea un nuovo modello M2 dal database D
Confronta M1 con M2 per verificare se nel frattempo sono
state fatte modifiche sul database D
In caso di modifiche riscontrate, avviso di «drift detection»
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 1
Sviluppo in Modalità Connessa
May 23, 2015
#sqlsatTorino
#sqlsat400
Modalità Disconnessa in SSDT
Si lavora su un project di VS (Database Project)
Offline
Tutti i vantaggi di VS
Refactoring
Rename
Move to Schema
IntelliSense
Goto Definition
Si scende a livello di column di tabella
Find All References
Si scende a livello di column di tabella
“Background compilation”
progettazione
Code Analysis
Source Control
Errori e warning in fase di
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 2
Sviluppo in Modalità Disconnessa
May 23, 2015
#sqlsatTorino
#sqlsat400
Cosa sono i DACPAC?
Il modello del database in memoria può essere
«serializzato» in un file
DACPAC = Data-tier Application Component
PACkage
Può essere «deserializzato» per tornare ad essere un
modello in memoria
Può essere utilizzato come database reference per un
progetto
Può essere utilizzato per rilasciare il database
Su SSDT...
...si «serializza» tramite Build
...si «deserializza» tramite Import
DACPAC
May 23, 2015
#sqlsatTorino
#sqlsat400
Snapshot = DACPAC File
È possibile generare uno snapshot di un
database project
Trattasi di un file DACPAC
È un comodo «backup» dello schema di un
database
Utile per un eventuale rollback dopo un nuovo rilascio
Utilizzabile nello Schema Compare per confronti
May 23, 2015
#sqlsatTorino
#sqlsat400
Struttura e Utilizzo di un DACPAC
Un DACPAC è un file .zip
Contenuto conforme allo
standard Open Packaging
Convention (OPC), come docx,
pptx, ispac, ecc.
DACPAC utilizzabili se
installato il Data-tier
Application Framework (=
DAC Framework o DacFx)
Se aperto con Unpack
model.sql con i CREATE di tutti
gli oggetti del modello
May 23, 2015
#sqlsatTorino
#sqlsat400
BACPAC = DACPAC + Data
BACPAC per strategie di backup su Azure
Su Azure non esistono BACKUP e RESTORE
Estensione del DACPAC. Contiene:
Oggetti standard del DACPAC
Dati contenuti nelle tabelle in formato JSON
Metadata specifici del BACPAC
Utile per migrare/clonare un db on-premise
BACPAC ≠ file di backup !
Non contiene dati di Transaction Log e History per
msdb
Non consistente a livello transazionale
May 23, 2015
#sqlsatTorino
#sqlsat400
DACPAC and BACPAC in SSMS
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 3
Generazione dei DACPAC da SSDT
May 23, 2015
#sqlsatTorino
#sqlsat400
Rilascio da SSDT
Rilascio nella «sandbox» di deploy (F5)
Configurabile dalle proprietà di progetto
Rilascio tramite Publish
Modalità di update diretto
Generazione del change script da eseguire a
mano
Rilascio tramite file di Publish salvati
Ignorare il rilascio di alcuni oggetti
May 23, 2015
#sqlsatTorino
#sqlsat400
Rilascio dei Dati
Si utilizza il Post-Deployment script
No build
imperativo
Deve essere unico
Con SQLCMD :r si gestiscono più file
Popolamento dati da poter ripetere n volte e
ottenere stesso risultato
Operazione idempotente
Usiamo il MERGE!
Chi ricorda bene la sintassi? (…panico tra gli astanti…) ☺
Interfaccia grafica (MergeUI: https://goo.gl/9oAuii by Ed
Elliot)
May 23, 2015
#sqlsatTorino
#sqlsat400
Rilascio da Riga di Comando
SQLPackage.exe
C:\Program Files (x86)\Microsoft SQL Server\[version]\DAC\bin
Si vogliono rilasciare solo alcuni oggetti del
DACPAC?
Deployment contributor: SqlPackage Deployment Filter
(http://agilesqlclub.codeplex.com by Ed Elliot)
DacServices (DacFx)
Script in PowerShell (http://goo.gl/TJTHJH by Steven
Wright)
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 4
Rilascio di un Progetto Database
May 23, 2015
#sqlsatTorino
#sqlsat400
Database Reference
Si possono referenziare
Database Project nella stessa solution
I progetti referenziati vanno prima compilati per non avere errori
in fase di design
Non sono ammesse dipendenze circolari, ma… ☺
Database di sistema
Sono dei DACPAC «precotti» e pronti all’uso (master e msdb)
DACPAC esterni
Il db referenziato può essere identificato come:
Database diverso di una stessa istanza (3-part names)
Database diverso di un’istanza diversa (4-part names)
Parte dello stesso database che lo referenzia (composite
project)
Come un namespace in .NET
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 5
Database Referenziati
May 23, 2015
#sqlsatTorino
#sqlsat400
Utilizzo dello Schema Compare
Si possono confrontare gli schema di
Database live
Progetti in SSDT
DACPAC / Snapshot
Lo Schema Compare può essere eseguito
sia da SSDT, sia da riga di comando (DBA
friendly ☺)
May 23, 2015
#sqlsatTorino
#sqlsat400
Autorizzazioni per lo Schema Compare su
database
Sul database target di confronto:
VIEW DEFINITION a livello di database
GRANT SELECT ON OBJECT::
dbo.__RefactorLog TO [<database_principal>]
La tabella dbo.__RefatorLog
Mantiene lo storico delle operazioni di refactoring
Serve in fase di deploy per evitare il DROP di un
oggetto a favore di un RENAME
Es. operazione di «move schema»
May 23, 2015
#sqlsatTorino
#sqlsat400
Pro e Contro dello Schema Compare
PRO
Flessibilità nel confronto tra diversi tipi di sorgenti
Nome del database sostituito da una SQLCMD
variable durante il confronto con un progetto
Feature non presente in simili prodotti di terze parti
CONTRO
Impossibile ignorare l’ordine delle colonne
Votate su Connect (https://goo.gl/orFHwi)! ☺
Prodotto ancora giovane rispetto ai simili di terze parti
Dopo un renaming, un ulteriore renaming (di campo o
tabella) è gestito come DROP e CREATE anziché con
sp_rename
#sqlsatTorino
#sqlsat400
May 23, 2015
Non Solo Schema... ma anche Dati!
In SSDT è presente anche la funzione di
Data Compare!
VS 2012
SQL
Data Compare
New Data Comparison
SQL Server
New Data Comparison
VS 2013
TOOLS
Ovviamente confronto tra soli database live
May 23, 2015
#sqlsatTorino
#sqlsat400
DEMO 6
Schema Compare
May 23, 2015
#sqlsatTorino
#sqlsat400
Registrazione del DACPAC sull’Istanza
Un DACPAC può essere «registrato» su
un’istanza
Il relativo database diventa un’applicazione installata
sulla macchina
Copiare un exe e dll nella macchina VS installare un msi
Durante il Publish su SSDT: «Register as Data-tier
Application»
Da SSMS: <Database>
Task
Register as Datatier Application
Da riga di comando
sqlpackage.exe /Action:Publish ...
/p:RegisterDataTierApplication=True
May 23, 2015
#sqlsatTorino
#sqlsat400
Versioning dei Database
Dopo la registrazione, quali informazioni sono
registrate sulla macchina?
Dati sul versioning
Una copia «ufficiale» dello schema del database
rilasciato
Come le reperisco dall’istanza?
SELECT * FROM [msdb].[dbo].[sysdac_instances]
May 23, 2015
#sqlsatTorino
#sqlsat400
DACPAC e Drift-Detection
Se dopo averlo registrato in fase di rilascio, il
database live viene modificato «a mano»
(non registrato con nuova ver. del DACPAC)
Ho un Drift!
Misura quanto il database live differisce dalla copia
«ufficiale» registrata
Come si misura un drift?
Sqlpackage.exe !! (sì, sempre lui ☺)
/Action:DriftReport
May 23, 2015
#sqlsatTorino
#sqlsat400
Drift Detection da SSMS
Upgrade Data-Tier Application
Il database da aggiornare deve essere già stato
registrato da DACPAC
Lo step «Detect Change» verifica se il database
live è stato modificato rispetto a quello registrato
Se sì, nonostante il drift, si può procedere all’update del
DACPAC selezionando l’opzione «Proceed despite
possible loss of change»
Nello step «Review Upgrade Plan» il DBA può
verificare l’Action Report e il Change Script prima
dell’upload
#sqlsatTorino
#sqlsat400
May 23, 2015
DEMO 7
Drift-Detection e Database Versioning
May 23, 2015
#sqlsatTorino
#sqlsat400
Limitazioni dei SSDT
Esecuzione delle query non possibile dai file di
progetto
Nuovi oggetti aggiunti in SSDT non sono
automaticamente «catalogati» nei folder relativi
a schema e a tipologia di oggetto
Variabili SQLCMD non utilizzabili nei nomi degli
oggetti diversi da database referenziati
Es. CREATE PROCEDURE [dbo].[$(my_proc_name)]
Workaround: post-deployment script
Si perdono le funzionalità di controllo di sintassi e di
consistenza degli oggetti
Es. aggiungo un nuovo oggetto, ma mi dimentico di
includerlo nel post-deployment per gestire la variabile
May 23, 2015
#sqlsatTorino
#sqlsat400
Esempi su SSDT e DacFx
Gert Drapers
https://github.com/gertd/sqlproj/tree/master/sampl
es
DacFx Public Samples
https://dacsamples.codeplex.com/
May 23, 2015
#sqlsatTorino
#sqlsat400
Link utili
SSDT Code Analysis Extensibility
(https://goo.gl/0WC1se)
SSDT Deployment Contributors
(https://goo.gl/EaKTTP)
May 23, 2015
#sqlsatTorino
#sqlsat400
Q&A
Domande?
May 23, 2015
#sqlsatTorino
#sqlsat400
#sqlsatTorino
#sqlsat400
SPEAKERSCORE
http://speakerscore.com/SSDT
THANKS!
May 23, 2015
#sqlsatTorino
#sqlsat400