Abbiamo finito per utilizzare una combinazione di generazione di script SSMS per estrarre schema e dati, quindi utilizzare il nostro strumento di database che consente l'analisi delle parole chiave e la sostituzione basata su token negli script. Assicura inoltre che gli script vengano applicati solo una volta.
Perché?
- Dobbiamo supportare le installazioni su SQL Server 2000, 2005 e 2008 e sono state apportate modifiche ai tipi di dati tra le versioni, ad esempio 2005+ hanno nvarchar (max), mentre 2000 supporta solo ntext. Quindi i nostri script usano un token e in base alla scelta del db lo sostituiscono con il tipo corretto.
- L'esecuzione di alcuni script richiede un periodo di attesa dopo l'esecuzione, ad es. Abbiamo scoperto che se non hai atteso alcuni secondi dopo aver creato un nuovo database tramite uno script, SQL Server potrebbe a volte fallire (perché non ha avuto il tempo di creare il db file) quando ha creato tabelle, ecc.
- Volevamo mantenere una cronologia di quali script sono stati eseguiti e quando.
- Volevamo consentire al nostro programma di installazione Wix MSI di specificare la stringa di connessione e le credenziali e avevamo bisogno di un modo per passarle negli script, quindi ancora una volta, usando i token e una logica condizionale.
Script di esempio (modificato per brevità)
-- Sleep: 5
-- Sleep after creating database to allow file system to create db files
CREATE DATABASE [$Database$]
GO
EXEC sp_dbcmptlevel [$Database$], $CompatabilityLevel$
GO
USE [$Database$]
GO
IF '1'!='$IntegratedSecurity$'
BEGIN
CREATE LOGIN [$Login$] WITH PASSWORD=N'$Password$', DEFAULT_DATABASE=[$Database$]
CREATE USER [$User$] FOR LOGIN [$Login$]
EXEC sp_addrolemember N'db_owner', N'$User$'
END
GO