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