public void WithScriptsAndDowngradeScriptsEmbeddedInAssembly_RunsFromFolder_SuccessfullyStoresDowngradeScripts() { // Setup string folderName = "DowngradeScripts"; Func <string, bool> scriptsFilter = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.Contains($".{folderName}.") && s.Contains("FolderUpAndDownScrips"); Func <string, bool> downgradeScriptsFilter = s => s.Contains($".{folderName}.") && s.Contains("FolderUpAndDownScrips"); DowngradeScriptsSettings settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter, new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Folder, folderName)); var upgradeEngineBuilder = DeployChanges.To .SqlDatabase(connectionString) .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings) .LogToNowhere(); // Act var result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade(); //Assert Assert.AreEqual(true, result.Successful); Dictionary <string, string> executedScriptsAndDowngradeScripts = GetExecutedScriptsFromDatabase(connectionString); var upgradeScripts = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.ScriptsFilter).GetScripts(null); var downgradeScripts = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.DowngradeScriptsFilter).GetScripts(null); Assert.AreEqual(executedScriptsAndDowngradeScripts.Count, upgradeScripts.Count()); foreach (var storedDowngradeScript in executedScriptsAndDowngradeScripts.Values.Where(v => !string.IsNullOrEmpty(v))) { Assert.IsTrue(downgradeScripts.Any(script => script.Contents.Equals(storedDowngradeScript))); } }
static void Main(string[] args) { string instanceName = @"(local)\SqlExpress"; // Uncomment the following line to run against sql local db instance. var connectionString = $"Data Source={instanceName};Initial Catalog=SampleApplication;Integrated Security=True;Pooling=False"; //DropDatabase.For.SqlDatabase(connectionString); EnsureDatabase.For.SqlDatabase(connectionString); DowngradeScriptsSettings settings = DowngradeScriptsSettings.FromSuffix(); var upgradeEngineBuilder = DeployChanges.To .SqlDatabase(connectionString) .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings) .LogToConsole(); //var upgradeScriptProvider = new StaticScriptProvider(new List<SqlScript>() { new SqlScript("Values Table", @"CREATE TABLE [dbo].[Values]( // [Id] [int] NOT NULL, // [Value1] [int] NOT NULL, // [Value2] [int] NULL, // CONSTRAINT [PK_Values] PRIMARY KEY CLUSTERED // ( // [Id] ASC // )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] // ) ON [PRIMARY]") }); //var downgradeScriptProvider = new StaticScriptProvider(new List<SqlScript>() { new SqlScript("Values Table", "DROP TABLE [dbo].[Values]") }); //var upgradeEngineBuilder = DeployChanges.To // .SqlDatabase(connectionString) // .WithScripts(upgradeScriptProvider) // .WithDowngradeTableProvider<SqlDowngradeEnabledTableJournal>(downgradeScriptProvider) // .LogToConsole(); var upgrader = upgradeEngineBuilder.BuildWithDowngrade(true); var result = upgrader.PerformUpgrade(); // Display the result if (result.Successful) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Success!"); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.Error); Console.WriteLine("Failed!"); } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(); Console.WriteLine("Press any key to continue"); Console.ReadKey(); }
/// <summary> /// Creates EmbeddedDowngradeScriptFinder with DowngradeScriptsSettings. /// </summary> /// <param name="downgradeScriptsSettings">Pre-builded DowngradeScriptsSettings.</param> public EmbeddedDowngradeScriptFinder(DowngradeScriptsSettings downgradeScriptsSettings) { if (downgradeScriptsSettings == null) { throw new ArgumentNullException("downgradeScriptsSettings"); } _downgradeScriptsSettings = downgradeScriptsSettings; }
public void WithScriptsAndDowngradeScriptsEmbeddedInAssembly_RunsFromSuffix_SuccessfullyRevertIfOlderVersionIsDeployed() { // Setup string suffix = "_downgrade"; Func <string, bool> scriptsFilter = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts"); Func <string, bool> downgradeScriptsFilter = s => s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts"); DowngradeScriptsSettings settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter, new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Suffix, suffix)); var upgradeEngineBuilder = DeployChanges.To .SqlDatabase(connectionString) .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings) .LogToNowhere(); // Act var result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade(); //Assert Assert.AreEqual(true, result.Successful); // Perform revert of latest script scriptsFilter = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts") && !s.Contains("Script0004 - Redirects"); downgradeScriptsFilter = s => s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts"); settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter, new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Suffix, suffix)); upgradeEngineBuilder = DeployChanges.To .SqlDatabase(connectionString) .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings) .LogToNowhere(); // Act result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade(); //Assert Assert.AreEqual(true, result.Successful); Dictionary <string, string> executedScriptsAndDowngradeScripts = GetExecutedScriptsFromDatabase(connectionString); var upgradeScripts = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.ScriptsFilter).GetScripts(null); Assert.AreEqual(executedScriptsAndDowngradeScripts.Count, upgradeScripts.Count()); using (var connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand("select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Redirect'", connection); try { connection.Open(); var executeScalar = command.ExecuteScalar(); Assert.IsNull(executeScalar); // If null table no longer exists } catch { throw; } finally { connection.Close(); } } }