Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Visual Studio Database projects<br />
Autore<br />Ricci Gian Maria<br />E-mail:	ricci.gm@nablasoft.com<br />Blog: 	http://www.nablasoft.com/alkampfer<br />http:...
Alm e database, le problematiche attuali<br />Parte prima<br />
Database ed ALM - Problemi<br />
Soluzioni tradizionali<br />Database di sviluppo condiviso<br />Aggiornamento tramite script sequenziali<br /><ul><li>Estr...
Assenza di script per il rollback delle modifiche
Difficoltà nell’individuare lo sviluppatore che ha scritto una specifica porzione di codice</li></li></ul><li>Soluzioni tr...
Soluzioni tradizionali - Deploy<br />Confronto con una struttura master per la generazione di script di update<br />DEV<br...
Si deve generare uno script per ogni possibile versione che si ha in produzione
Problemi nel caso il database di produzione sia stato modificato </li></li></ul><li>Soluzioni tradizionali - Testing<br />...
Database Project	<br />Visual Studio Database Edition (Team System Developer o Team Suite) introduce il concetto di Databa...
Quando introdurre un Database Project nel ciclo produttivo <br />Grazie all’importazione automatica è possibile introdurre...
Demo – familiarizzare con i database project<br />
Ogni oggetto un file<br />Il paradigma più importante è che ogni oggetto è identificato da un file sorgente<br />In questo...
Sviluppo dichiarativo<br />Un database project contiene al suo interno tutte le dichiarazione di creazione degli oggetti<b...
Database Logico <br />Un Database Project definisce quindi un “database logico”che è il risultato della compilazione di un...
Vengono individuate anche anomalie, come riferimenti ad oggetti inesistenti</li></li></ul><li>Compilazione<br />Analizzand...
Compilazione	<br />
Analisi di codice	<br />Procedura analoga  a quella disponibile sui normali progetti C# o VB<br />Permette di analizzare i...
Controllo di versione<br />Visualizzando la storia di un file si ottiene la storia del corrispondente oggetto del DB<br />...
DEMO – compilazione e Controllo di codice sorgente<br />
Deploy<br />Il database logico può essere confrontato con un database fisico per generare uno script di aggiornamento<br /...
Deploy in produzione<br />Le modifiche possono anche essere applicate immediatamente senza passare per uno script <br />DB...
Il confronto e l’aggiornamento vengono fatti tramite un tool ridistribuibile e gratuito, oppure direttamente da Visual Stu...
Un’altra situazione è quella in cui un database di test viene ottimizzato da un DBA, che crea indici o modifica le viste d...
In questo modo è sufficiente effettuare una sincronia al contrario per portare le modifiche, da un database reale, al Data...
Come viene effettuato il deploy<br />Il confronto passa sempre per lo schema model<br />Le differenze vengono calcolate in...
Interfaccia per VsDbCmd.exe<br />Il tool di deploy è un utility a riga di comando chiamato VSDBCMD.exe<br />Il formato “Ri...
DEMO Deploy<br />
Unit test del database<br />Si possono creare con pochi click unit test di stored procedure, trigger e funzioni<br /><ul><...
Il test è scritto in T-SQL
I test sono ripetibili e robusti.</li></li></ul><li>Unit Test del database<br />Sandbox: Ogni sviluppatore effettua i test...
Unit test del database<br />Equiparazione tra database unittesting e code unittesting<br />Strutturazione del test con il ...
Unit Test del database - Asserzioni	<br />
Data Generation Plan<br />Motore di generazione di dati per test.<br />Altamente configurabile<br />Rispetta chiavi, relaz...
DEMO Unittesting<br />
Refactoring<br />Alcune operazioni su db sono molto invasive, come ad esempio il rinominare una colonna di una tabella<br ...
Refactoring - Dettagli<br />Tabelle<br />Rename: Rinomina una tabella o colonna<br />MoveToSchema: Sposta una tabella in u...
Altre caratteristiche	<br />Visualizzazione dipendenze<br />Permette di visualizzare, partendo da un oggetto radice, le di...
Tip and tricks<br />
Mantenere il numero di versione<br />È sempre utile creare e mantenere una tabella con il numero di versione nel database<...
Ridurre le dimensioni degli script di reference<br />I file di riferimento delle strutture master sono molto grandi e rall...
Eseguire programmaticamente un data generation plan<br />Ai fini del testing può essere molto utile eseguire in maniera pr...
Integrazione con Team Build<br />E’ possibile integrare il deploy del progetto DB in una team build. Es, progetto web.<br ...
Test In memoria	<br />Grazie al concetto di “variabili” è possibile parametrizzare i sorgenti del progetto<br />In partico...
Test transazionali<br />Un test transazionale è un test che non modifica il contenuto del db<br />È possibile rendere ogni...
DEMO Unittesting<br />
Upcoming SlideShare
Loading in …5
×

Database Project in Visual Studio 2010

4,613 views

Published on

Gestire i progetti database con Visual Studio 2010 mediante i Database Projects.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Database Project in Visual Studio 2010

  1. 1. Visual Studio Database projects<br />
  2. 2. Autore<br />Ricci Gian Maria<br />E-mail: ricci.gm@nablasoft.com<br />Blog: http://www.nablasoft.com/alkampfer<br />http://blogs.ugidotnet.org/rgm<br />
  3. 3. Alm e database, le problematiche attuali<br />Parte prima<br />
  4. 4. Database ed ALM - Problemi<br />
  5. 5. Soluzioni tradizionali<br />Database di sviluppo condiviso<br />Aggiornamento tramite script sequenziali<br /><ul><li>Estrema difficoltà nel monitorare la vita degli oggetti
  6. 6. Assenza di script per il rollback delle modifiche
  7. 7. Difficoltà nell’individuare lo sviluppatore che ha scritto una specifica porzione di codice</li></li></ul><li>Soluzioni tradizionali – Source Control<br />Il database è modellato da script sequenziali<br />ALTER TABLE CUSTOMER<br />…<br />ALTER VIEW ORDERBYCUST<br />…<br />CREATE TABLE SHIPPING<br />…<br />ALTER VIEW ORDERBYCUST<br />…<br />ALTER TABLE CUSTOMER<br />…<br />ALTER TABLE SHIPPING<br />…<br />
  8. 8. Soluzioni tradizionali - Deploy<br />Confronto con una struttura master per la generazione di script di update<br />DEV<br />Prod<br /><ul><li>Confronto con una struttura master per la generazione di script di update
  9. 9. Si deve generare uno script per ogni possibile versione che si ha in produzione
  10. 10. Problemi nel caso il database di produzione sia stato modificato </li></li></ul><li>Soluzioni tradizionali - Testing<br />Difficile gestire il database di test locale<br />Generazione di script di creazione DB e procedure manuali che ricreano il DB per i test<br />Generazione di dati manuali.<br />Dati<br />Test Data DB<br />Test<br />Struttura<br />DEV SCHEMA<br />Sandbox<br />
  11. 11. Database Project <br />Visual Studio Database Edition (Team System Developer o Team Suite) introduce il concetto di Database Project<br />Un Database Project è un progetto dedicato per lo sviluppo di database<br />Lo scopo finale è garantire un’integrazione completa dello sviluppo DB nell’ALM<br />
  12. 12. Quando introdurre un Database Project nel ciclo produttivo <br />Grazie all’importazione automatica è possibile introdurre un Database Project anche in un progetto iniziato<br />Le molte funzionalità fornite, tra cui il controllo sintattico e dei riferimenti tra oggetti porta immediati vantaggi.<br />E’ comunque necessario che gli sviluppatori abbiano una familiarità con lo strumento, per cui è consigliabile un progetto pilota <br />Operare immediatamente su un progetto relativo ad un database complesso può essere dispersivo<br />Importazione<br />DB Dev<br />DB Project<br />
  13. 13. Demo – familiarizzare con i database project<br />
  14. 14. Ogni oggetto un file<br />Il paradigma più importante è che ogni oggetto è identificato da un file sorgente<br />In questo modo è possibile confrontare le varie versioni e monitorare l’evoluzione degli oggetti del database nel tempo<br />Il database viene effettivamente “modellato” partendo da dei file sorgente<br />CREATE TABLE [dbo].[Customers] (<br /> [CustomerID] NCHAR (5) NOT NULL,<br /> [CompanyName] NVARCHAR (40) NOT NULL,<br /> [ContactName] NVARCHAR (30) NULL,<br /> [ContactTitle] NVARCHAR (30) NULL,<br /> [Address] NVARCHAR (60) NULL,<br /> [City] NVARCHAR (15) NULL,<br />…<br />CREATE TABLE [dbo].[Customers] (<br /> [CustomerID] NCHAR (5) NOT NULL,<br /> [CompanyName] NVARCHAR (40) NOT NULL,<br /> [ContactName] NVARCHAR (30) NULL,<br /> [ContactTitle] NVARCHAR (30) NULL,<br /> [MainAddress] NVARCHAR (60) NULL,<br /> [City] NVARCHAR (15) NULL,<br />…<br />
  15. 15. Sviluppo dichiarativo<br />Un database project contiene al suo interno tutte le dichiarazione di creazione degli oggetti<br />Si può passare dalla dichiarazione, alla generazione del database e di nuovo al codice<br />Nel database project sono contenute le definizioni di tutti gli oggetti che compongono un database: tabelle, storedprocedures, funzioni, utenti, assembly CLR, trigger, indici, etc.<br />Tutti questi file sorgente possono essere “compilati” per generare artefatti.<br />Per contro gli sviluppatori necessitano della conoscenza della sintassi T-SQL relativa alla creazione degli oggetti, ma si può sempre usare il Management Studio e poi portare il codice in Visual Studio<br />
  16. 16. Database Logico <br />Un Database Project definisce quindi un “database logico”che è il risultato della compilazione di un database project<br /><ul><li>La compilazione individua eventuali errori di sintassi nelle definizioni degli oggetti
  17. 17. Vengono individuate anche anomalie, come riferimenti ad oggetti inesistenti</li></li></ul><li>Compilazione<br />Analizzando i sorgenti viene creato lo schema model<br />Progetto database<br />Schema Model<br />.dbschema<br />Il modello viene Interpretato, analizzato e validato<br />Eventuali anomalie nel codice vengono comunicate con errori e warning, esattamente come avviene durante la compilazione di un normale progetto C# o VB<br />
  18. 18. Compilazione <br />
  19. 19. Analisi di codice <br />Procedura analoga a quella disponibile sui normali progetti C# o VB<br />Permette di analizzare il Database Project al fine di evidenziare pattern di codice critici<br />Suddivise in tre distinte categorie: Naming, Performance e Design attivabili distintamente<br />Possibilità di attivare/disattivare non solo le categorie ma i singoli warning<br />Mostra punti con possibili problemi nel codice.<br />
  20. 20. Controllo di versione<br />Visualizzando la storia di un file si ottiene la storia del corrispondente oggetto del DB<br />Si può effettuare un confronto tra le versioni per vedere come un oggetto è cambiato nel tempo<br />Si può capire chi e quando ha scritto una particolare porzione di codice e perché<br />Si può effettuare un rollback annullando le modifiche<br />
  21. 21. DEMO – compilazione e Controllo di codice sorgente<br />
  22. 22. Deploy<br />Il database logico può essere confrontato con un database fisico per generare uno script di aggiornamento<br />Il confronto non necessita di avere una istanza “viva” del database di sviluppo<br />Confronto<br />DB Logico<br />DB Fisico<br />
  23. 23. Deploy in produzione<br />Le modifiche possono anche essere applicate immediatamente senza passare per uno script <br />DB Fisico<br />DB Logico<br /><ul><li>Vengono generati alert in caso l’aggiornamento causasse una perdita di dati
  24. 24. Il confronto e l’aggiornamento vengono fatti tramite un tool ridistribuibile e gratuito, oppure direttamente da Visual Studio</li></li></ul><li>Sincronia inversa<br />Si può procedere anche in direzione inversa, ovvero sincronizzare da un database fisico ad un database logico (solo da Visual Studio)<br />DB Fisico<br />DB Logico<br /><ul><li>Questa procedura è utile, quando alcune persone non posseggono una versione che supporti i Database Project, ma debbono comunque poter modificare lo schema di database
  25. 25. Un’altra situazione è quella in cui un database di test viene ottimizzato da un DBA, che crea indici o modifica le viste direttamente in un’istanza di test.
  26. 26. In questo modo è sufficiente effettuare una sincronia al contrario per portare le modifiche, da un database reale, al Database Project</li></li></ul><li>Gestire versioni multiple<br />1.2<br />1.5<br />Il database logico permette di sincronizzare versioni multiple<br />Non è necessario sapere a priori la versione per fare un aggiornamento<br />2.3<br />
  27. 27. Come viene effettuato il deploy<br />Il confronto passa sempre per lo schema model<br />Le differenze vengono calcolate in base agli Schema Model<br />Sulla base delle differenze viene generato lo script di upgrade<br />Nella generazione si tiene conto delle caratteristiche delle varie versioni<br />Schema Model<br />Schema Model<br />Diff<br />
  28. 28. Interfaccia per VsDbCmd.exe<br />Il tool di deploy è un utility a riga di comando chiamato VSDBCMD.exe<br />Il formato “Riga di comando” è eccezionale per includerlo in procedure automatiche di setup e di aggiornamento del db.<br />L’essere ridistribuibile permette di includerlo in programmi di aggiornamento senza spese di sorta<br />Per semplificarne l’uso, un MVP Team System ha sviluppato una interfaccia grafica che permette di specificare le opzioni tramite una GUI molto più userfriendly rispetto alla modalità in riga di comando.<br />Ulteriori dettagli sul mio blog http://blogs.ugidotnet.org/rgm/archive/2009/10/14/una-mini-ui-per-vsdbcmd.exe.aspx<br />
  29. 29. DEMO Deploy<br />
  30. 30. Unit test del database<br />Si possono creare con pochi click unit test di stored procedure, trigger e funzioni<br /><ul><li>Visual Studio si occupa di generare il database di test, allinearlo ed eseguire la generazione dati
  31. 31. Il test è scritto in T-SQL
  32. 32. I test sono ripetibili e robusti.</li></li></ul><li>Unit Test del database<br />Sandbox: Ogni sviluppatore effettua i test nella sua macchina locale<br />I test non causano iterazione, ogni sviluppatore può testare in completa autonomia<br />La validità del Sandbox, sia come struttura e come dati viene garantita dal Visual Studio<br />Si evitano quindi i classici problemi legati al test del database<br />Generazione dati<br />Data Generation Plan<br />Test<br />Allineamento struttura<br />Database Project<br />Sandbox<br />
  33. 33. Unit test del database<br />Equiparazione tra database unittesting e code unittesting<br />Strutturazione del test con il classico fourphase test.<br />Dietro le quinte è sempre presente un normale test C# o VisualBasic generato dal designer, che costituisce il wrapper del database test.<br />La classe wrapper può, se necessario, essere modificata per aggiungere funzionalità<br />Wrapper<br />FixtureSetup<br />T-Sql Code<br />TestSetup<br />T-Sql Code<br />Test<br />T-Sql Code<br />TestCleanup<br />T-Sql Code<br />FixtureTeardown<br />T-Sql Code<br />
  34. 34. Unit Test del database - Asserzioni <br />
  35. 35. Data Generation Plan<br />Motore di generazione di dati per test.<br />Altamente configurabile<br />Rispetta chiavi, relazioni e vincoli del database<br />Genera dati in maniera ripetibile<br />Può generare dati sulla base di dati preesistenti su un database di test<br />Espandibile con generatori custom per soddisfare qualsiasi esigenza<br />
  36. 36. DEMO Unittesting<br />
  37. 37. Refactoring<br />Alcune operazioni su db sono molto invasive, come ad esempio il rinominare una colonna di una tabella<br />Grazie alla conoscenza della struttura, in un Database Project questa operazione può essere automatizzata<br />Il Visual Studio mostra tutte le modifiche che verranno effettuate al progetto prima di aggiornare tutti gli oggetti che fanno riferimento all’oggetto modificato<br />È possibile avere una preview dettagliata per capire l’impatto che la modifica avrà nel database<br />I refactoring sono possibili sia per le tabelle, ma anche per altri oggetti, come trigger, storedprocedures, funzioni<br />
  38. 38. Refactoring - Dettagli<br />Tabelle<br />Rename: Rinomina una tabella o colonna<br />MoveToSchema: Sposta una tabella in uno schema differente<br />FullyQualifyName: Qualifica in modo completo i nomi con il nome a tre parti databasename.schema.name<br />View (tutte quelle delle tabelle più)<br />ExpandWildcards: Analizza una stored ed ogni volta che viene trovato il wildcard * in una selezione lo espande.<br />Stored e funzioni<br />Rename: Rinomina una stored funzione o parametro<br />MoveToSchema: Sposta una tabella in uno schema differente<br />ExpandWildcards: Analizza una stored ed ogni volta che viene trovato il wildcard * in una selezione lo espande.<br />FullyQualifyName: Qualifica in modo completo i nomi con il nome a tre parti databasename.schema.name<br />
  39. 39. Altre caratteristiche <br />Visualizzazione dipendenze<br />Permette di visualizzare, partendo da un oggetto radice, le dipendenze che esso ha nel database.<br />Vengono mostrati gli oggetti che dipendono dall’oggetto radice, ma anche gli oggetti da cui l’oggetto radice dipende<br />È possibile gestire le ExtendedProperty dei vari oggetti<br />Supporto dell’integrazione con CLR<br />Possibilità di aggiungere assembly al database project<br />Gestione dei tipi nativi<br />Modella qualsiasi oggetto supportato dal motore di database<br />Certificati<br />Chiavi di sicurezza<br />Utenti<br />Code / Servizi<br />Etc.<br />
  40. 40. Tip and tricks<br />
  41. 41. Mantenere il numero di versione<br />È sempre utile creare e mantenere una tabella con il numero di versione nel database<br />Nel post deploy script si aggiunge uno script per inserire il numero di versione, solitamente si esegue un insert, in modo da conoscere tutte le versioni passate di un database<br />Fondamentale quando avvengono modifiche al db che non possono essere propagate automaticamente dal tool di aggiornamento struttura. In questo caso infatti un predeployment script, può effettuare aggiornamenti specifici, conoscendo il numero attuale di versione.<br />Utile se da codice si vuole permettere di usare una versione vecchia del database senza forzare un aggiornamento.<br />Fondamentale per diagnostica, permette di capire la storia del database in caso di problemi<br />
  42. 42. Ridurre le dimensioni degli script di reference<br />I file di riferimento delle strutture master sono molto grandi e rallentano molto il Visual Studio<br />Dato che sono file normali XML se ne può fare una copia e lasciare in essa solo le funzioni che si vogliono referenziare.<br />Questa operazione può cambiare drasticamente i tempi di apertura del progetto e di compilazione.<br />Necessario ogni qualvolta si faccia riferimento a funzioni base presenti nel database Master<br />
  43. 43. Eseguire programmaticamente un data generation plan<br />Ai fini del testing può essere molto utile eseguire in maniera programmatica un Data Generation Plan<br />È possibile sfruttare msbuild da codice C# o VB per automatizzare l’operazione.<br />In questo modo si può decidere quando e quale piano di generazione eseguire prima di ogni test.<br />Generation Plan<br />Test Data DB<br />Database Project<br />
  44. 44. Integrazione con Team Build<br />E’ possibile integrare il deploy del progetto DB in una team build. Es, progetto web.<br />In questo modo si automatizzano le procedure di deploy, sia nell’ambiente di test che in produzione<br />TFS<br />Aggiorna Web <br />Check In<br />Sincronizza DB<br />Build Server<br />DB Test<br />
  45. 45. Test In memoria <br />Grazie al concetto di “variabili” è possibile parametrizzare i sorgenti del progetto<br />In particolare si può utilizzare un RAMDisk e far creare i file di database in memoria<br />Utilizzando questa tecnica per un deploy locale per gli unittesting, si può velocizzare l’esecuzione.<br />Test in memoria<br />
  46. 46. Test transazionali<br />Un test transazionale è un test che non modifica il contenuto del db<br />È possibile rendere ogni test di database transazionale semplicemente aggiungendo codice alla classe wrapper.<br />In questo modo dopo ogni test il contenuto del database viene riportato al contenuto iniziale, ed i test sono più ripetibili<br />Wrapper<br />FixtureSetup<br />Test Setup<br />BeginTransaction<br />Test<br />Execute test code<br />TestCleanup<br />RollbackTransaction<br />FixtureTeardown<br />
  47. 47. DEMO Unittesting<br />
  48. 48. Estendibilità<br />Il Visual Studio database edition può essere esteso in vari punti<br />http://msdn.microsoft.com/en-us/library/aa833285(VS.100).aspx<br />Condizioni di test custom per gli unit test su oggetti di database<br />Regole custom per l’analisi di codice<br />Refactoring custom, sia definendo nuovi refactoring per tipi di oggetti esistenti, sia definendo refactoring per tipi che di base non supportano refactoring.<br />Nuovi generatori dati.<br />
  49. 49. Database Supportati<br />Visual Studio 2008 Database Edition GDR2<br />Sql Server 2000<br />Sql Server 2005<br />Sql Server 2008<br />Visual Studio 2010 Database Edition<br />Aggiunto il supporto per Oracle tramite un plugin esterno chiamato TeamFuze: http://www.teamfuze.net/index.jspa<br />IBM ha annunciato il supporto a DB2, ma attualmente non c’è un link pubblico per poterlo provare.<br />L’intero modello della struttura di un database project è estendibile, è quindi possibile virtualmente fornire supporto a qualsiasi tipologia di database relazionale.<br />
  50. 50. Data Dude 2010<br />Alcune funzionalità sono presenti direttamente nella versione Professional<br />Per le team build non è più necessario installare la versione completa DatabaseEdition per compilare progetti di database. Questo evita di usare una licenza per ogni macchina di build.<br />Maggiore estendibilità<br />La nuova versione dei Database Project presenta alcune migliorie ed innovazioni rispetto la versione attuale<br />Intellisense: nell’editor del codice T-SQL è presente l’integrazione dell’intellisense dell’editor di Sql Server 2008 R2<br />T-Sqldebuger: integrazione del debugger di Sql Server 2008R2 all’interno di Visual Studio 2010<br />
  51. 51. Data Dude 2010 - Versioni<br />Visual Studio 2010 Premium/Ultimate<br />Database Unit Testing*<br />Command Line Deploy<br />Schema Compare<br />Data Compare<br />Refactoring<br />Data Generation*<br />Static Code Analysis*<br />Project System<br />IntelliSense<br />Build<br />Deploy<br />Build Integration<br />Visual Studio 2010 Professional<br />

×