From f0ca82611b7b39d2c0cc9dea186fe5f35fce17e7 Mon Sep 17 00:00:00 2001 From: Mark Gould Date: Thu, 18 Oct 2018 11:15:45 -0500 Subject: [PATCH 1/2] Disable triggers when deleting data from Sql Server --- Respawn.DatabaseTests/SqlServerTests.cs | 34 ++++++++++++++++++++++--- Respawn/DbAdapter.cs | 2 ++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Respawn.DatabaseTests/SqlServerTests.cs b/Respawn.DatabaseTests/SqlServerTests.cs index dabcf53..a5a0ac9 100644 --- a/Respawn.DatabaseTests/SqlServerTests.cs +++ b/Respawn.DatabaseTests/SqlServerTests.cs @@ -237,7 +237,7 @@ public async Task ShouldHandleCircularRelationships() { await checkpoint.Reset(_connection); } - catch + catch { _output.WriteLine(checkpoint.DeleteSql); throw; @@ -468,8 +468,8 @@ public async Task ShouldReseedIdAccordingToIdentityInitialSeedValue() [Fact] public async Task ShouldReseedIdAccordingToIdentityInitialSeedValue_TableHasNeverHadAnyData() { - _database.Execute("create table Foo ([id] [int] IDENTITY(1001,1), Value int)"); - + _database.Execute("create table Foo ([id] [int] IDENTITY(1001,1), Value int)"); + var checkpoint = new Checkpoint(); checkpoint.WithReseed = true; @@ -486,5 +486,33 @@ public async Task ShouldReseedIdAccordingToIdentityInitialSeedValue_TableHasNeve _database.Insert(new Foo { Value = 0 }); _database.ExecuteScalar("SELECT MAX(id) FROM Foo").ShouldBe(1001); } + + [Fact] + public async Task ShouldDisableTriggers() + { + _database.Execute("create table a (id int primary key)"); + _database.Execute("create table b (a_id int)"); + _database.Execute("CREATE TRIGGER a_Insert ON a FOR DELETE AS INSERT INTO b (a_id) SELECT Id FROM Deleted"); + _database.Execute("insert into a (id) values (1)"); + + _database.ExecuteScalar("SELECT COUNT(1) FROM a").ShouldBe(1); + + var checkpoint = new Checkpoint + { + TablesToIgnore = new[] {"b"} + }; + try + { + await checkpoint.Reset(_connection); + } + catch + { + _output.WriteLine(checkpoint.DeleteSql ?? string.Empty); + throw; + } + + _database.ExecuteScalar("SELECT COUNT(1) FROM a").ShouldBe(0); + _database.ExecuteScalar("SELECT COUNT(1) FROM b").ShouldBe(0); + } } } diff --git a/Respawn/DbAdapter.cs b/Respawn/DbAdapter.cs index 2537064..9fc8aea 100644 --- a/Respawn/DbAdapter.cs +++ b/Respawn/DbAdapter.cs @@ -209,7 +209,9 @@ public string BuildDeleteCommandText(GraphBuilder graph) } foreach (var table in graph.ToDelete) { + builder.AppendLine($"ALTER TABLE {table.GetFullName(QuoteCharacter)} DISABLE TRIGGER ALL;"); builder.AppendLine($"DELETE {table.GetFullName(QuoteCharacter)};"); + builder.AppendLine($"ALTER TABLE {table.GetFullName(QuoteCharacter)} ENABLE TRIGGER ALL;"); } foreach (var table in graph.CyclicalTableRelationships.Select(rel => rel.ParentTable)) { From e30ad25289b56f63f7ed8266a57999981fafa16a Mon Sep 17 00:00:00 2001 From: Mark Gould Date: Thu, 18 Oct 2018 11:23:09 -0500 Subject: [PATCH 2/2] Fix spacing issue --- Respawn.DatabaseTests/SqlServerTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Respawn.DatabaseTests/SqlServerTests.cs b/Respawn.DatabaseTests/SqlServerTests.cs index dabcf53..f4ff699 100644 --- a/Respawn.DatabaseTests/SqlServerTests.cs +++ b/Respawn.DatabaseTests/SqlServerTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -237,7 +237,7 @@ public async Task ShouldHandleCircularRelationships() { await checkpoint.Reset(_connection); } - catch + catch { _output.WriteLine(checkpoint.DeleteSql); throw; @@ -468,8 +468,8 @@ public async Task ShouldReseedIdAccordingToIdentityInitialSeedValue() [Fact] public async Task ShouldReseedIdAccordingToIdentityInitialSeedValue_TableHasNeverHadAnyData() { - _database.Execute("create table Foo ([id] [int] IDENTITY(1001,1), Value int)"); - + _database.Execute("create table Foo ([id] [int] IDENTITY(1001,1), Value int)"); + var checkpoint = new Checkpoint(); checkpoint.WithReseed = true;