From 81e60cf792d402b195ea18611eabc5f112e69eec Mon Sep 17 00:00:00 2001 From: Vladyslav Danylov Date: Mon, 13 Jun 2016 13:14:58 +0300 Subject: [PATCH 1/4] [PAA-1335] Fixed SP to handle multiple versions. --- DataFresh/Resources/PrepareDataFresh.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataFresh/Resources/PrepareDataFresh.sql b/DataFresh/Resources/PrepareDataFresh.sql index aca4761..e278fff 100644 --- a/DataFresh/Resources/PrepareDataFresh.sql +++ b/DataFresh/Resources/PrepareDataFresh.sql @@ -42,7 +42,7 @@ AS SELECT [tablename] from #ChangedTables UNION SELECT DISTINCT - OBJECT_NAME(fkeyid) AS Referenced_Table + OBJECT_SCHEMA_NAME(fkeyid) + '.' + OBJECT_NAME(fkeyid) AS Referenced_Table FROM sysreferences sr INNER JOIN #ChangedTables ct ON sr.rkeyid = OBJECT_ID(ct.tablename) From 7885916b017d0357774bd790d4d03eb971c563b0 Mon Sep 17 00:00:00 2001 From: Vladyslav Danylov Date: Mon, 13 Jun 2016 17:19:35 +0300 Subject: [PATCH 2/4] [PAA-1335] Addded support for different schemes. --- DataFresh/Resources/PrepareDataFresh.sql | 51 ++++++++++++++---------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/DataFresh/Resources/PrepareDataFresh.sql b/DataFresh/Resources/PrepareDataFresh.sql index e278fff..6703756 100644 --- a/DataFresh/Resources/PrepareDataFresh.sql +++ b/DataFresh/Resources/PrepareDataFresh.sql @@ -18,10 +18,14 @@ IF EXISTS (SELECT * FROM [DBO].SYSOBJECTS WHERE ID = Object_ID(N'[DBO].[df_Table DROP PROCEDURE [dbo].[df_TableDataImport] GO -IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[df_ChangeTracking]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) - CREATE TABLE [dbo].[df_ChangeTracking] +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[df_ChangeTracking]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [dbo].[df_ChangeTracking] +GO + +CREATE TABLE [dbo].[df_ChangeTracking] ( - [TABLENAME] sysname + [TABLENAME] sysname, + [TABLESCHEMA] sysname ) GO @@ -33,16 +37,18 @@ AS DECLARE @sql NVARCHAR(4000) DECLARE @TableName VARCHAR(255) + DECLARE @TableSchema VARCHAR(255) - SELECT DISTINCT TableName INTO #ChangedTables FROM df_ChangeTracking + SELECT DISTINCT TableName, TableSchema INTO #ChangedTables FROM df_ChangeTracking TRUNCATE TABLE df_ChangeTracking DECLARE Table_Cursor INSENSITIVE SCROLL CURSOR FOR - SELECT [tablename] from #ChangedTables + SELECT [tablename], [tableschema] from #ChangedTables UNION SELECT DISTINCT - OBJECT_SCHEMA_NAME(fkeyid) + '.' + OBJECT_NAME(fkeyid) AS Referenced_Table + OBJECT_NAME(fkeyid) AS Referenced_Table_Name, + OBJECT_SCHEMA_NAME(fkeyid) AS Referenced_Table_Schema FROM sysreferences sr INNER JOIN #ChangedTables ct ON sr.rkeyid = OBJECT_ID(ct.tablename) @@ -50,38 +56,38 @@ AS OPEN Table_Cursor -- Deactivate Constrains for tables referencing changed tables - FETCH NEXT FROM Table_Cursor INTO @TableName + FETCH NEXT FROM Table_Cursor INTO @TableName, @TableSchema WHILE (@@Fetch_Status = 0) BEGIN - SET @sql = N'Alter Table [' + @TableName + '] NOCHECK CONSTRAINT ALL' + SET @sql = N'Alter Table [' + @TableSchema + '].[' + @TableName + '] NOCHECK CONSTRAINT ALL' EXEC sp_executesql @sql - FETCH NEXT FROM Table_Cursor INTO @TableName + FETCH NEXT FROM Table_Cursor INTO @TableName, @TableSchema END -- Delete All data from Changed Tables and Refill DECLARE ChangedTable_Cursor CURSOR FOR - SELECT [tablename] FROM #ChangedTables WHERE tablename not in('dbo.df_ChangeTracking', 'dbo.dr_DeltaVersion') + SELECT [tablename], [tableschema] FROM #ChangedTables WHERE tablename not in('df_ChangeTracking', 'dr_DeltaVersion') AND tableschema <> 'dbo' OPEN ChangedTable_Cursor - FETCH NEXT FROM ChangedTable_Cursor INTO @TableName + FETCH NEXT FROM ChangedTable_Cursor INTO @TableName, @TableSchema WHILE (@@Fetch_Status = 0) BEGIN PRINT @TableName - SET @sql = N'DELETE [' + @TableName + ']; DELETE df_ChangeTracking WHERE TableName=''' + @TableName + '''' + SET @sql = N'DELETE [' + @TableSchema + '].[' + @TableName + ']; DELETE FROM df_ChangeTracking WHERE TableName=''' + @TableName + ''' and TableSchema=''' + @TableSchema + '''' EXEC sp_executesql @sql - SET @sql = N'IF(SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema + ''.'' + table_name = ''' + @TableName + ''' AND IDENT_SEED(TABLE_NAME) IS NOT NULL) > 0 + SET @sql = N'IF(SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = ''' + @TableSchema + ''' AND table_name = ''' + @TableName + ''' AND IDENT_SEED(TABLE_NAME) IS NOT NULL) > 0 BEGIN - DBCC CHECKIDENT ([' + @TableName + '], RESEED, 0) + DBCC CHECKIDENT ([' + @TableSchema + '.' + @TableName + '], RESEED, 0) END' EXEC sp_executesql @sql - SET @sql = N'BULK INSERT [' + @TableName + '] - FROM ''' + @BasePath + @TableName + '.df'' + SET @sql = N'BULK INSERT [' + @TableSchema + '].[' + @TableName + '] + FROM ''' + @BasePath + @TableSchema + '.' + @TableName + '.df'' WITH ( KEEPIDENTITY, @@ -90,19 +96,19 @@ AS )' EXEC sp_executesql @sql - FETCH NEXT FROM ChangedTable_Cursor INTO @TableName + FETCH NEXT FROM ChangedTable_Cursor INTO @TableName, @TableSchema END CLOSE ChangedTable_Cursor DEALLOCATE ChangedTable_Cursor -- ReEnable Constrants for All Tables - FETCH FIRST FROM Table_Cursor INTO @TableName + FETCH FIRST FROM Table_Cursor INTO @TableName, @TableSchema WHILE (@@Fetch_Status = 0) BEGIN - SET @sql = N'Alter Table [' + @TableName + '] CHECK CONSTRAINT ALL' + SET @sql = N'Alter Table [' + @TableSchema + '].[' + @TableName + '] CHECK CONSTRAINT ALL' EXEC sp_executesql @sql - FETCH NEXT FROM Table_Cursor INTO @TableName + FETCH NEXT FROM Table_Cursor INTO @TableName, @TableSchema END CLOSE Table_Cursor DEALLOCATE Table_Cursor @@ -115,7 +121,8 @@ AS IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[df_ChangeTracking]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) CREATE TABLE [df_ChangeTracking] ( - [TABLENAME] sysname + [TABLENAME] sysname, + [TABLESCHEMA] sysname ) DECLARE @sql NVARCHAR(4000) @@ -137,7 +144,7 @@ AS SET @sql = N'CREATE TRIGGER [' + @TableSchema + '].[trig_df_ChangeTracking_' + @TableName + '] on [' + @TableSchema + '].[' + @TableName + '] for insert, update, delete as SET NOCOUNT ON - INSERT INTO df_ChangeTracking (tablename) VALUES (''' + @TableSchema + '.' + @TableName + ''') + INSERT INTO df_ChangeTracking (tablename, tableschema) VALUES (''' + @TableName + ''', ''' + @TableSchema + ''') SET NOCOUNT OFF' EXEC sp_executesql @sql From fdc6485c2285afbe4703e12a177f025fcde66d99 Mon Sep 17 00:00:00 2001 From: Vladyslav Danylov Date: Tue, 14 Jun 2016 10:54:19 +0300 Subject: [PATCH 3/4] [PAA-1337] Added exception printing to console. --- DataFresh/DataFreshConsole.cs | 132 ++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 63 deletions(-) diff --git a/DataFresh/DataFreshConsole.cs b/DataFresh/DataFreshConsole.cs index 6bc4fbd..994bba2 100644 --- a/DataFresh/DataFreshConsole.cs +++ b/DataFresh/DataFreshConsole.cs @@ -38,81 +38,87 @@ public string Results public void Start(string[] args) { ConsoleWrite("DataFresh provided by Entropy Zero Consulting"); - - if (args == null || args.Length < 2) + try { - WriteUsage(); - return; - } + if (args == null || args.Length < 2) + { + WriteUsage(); + return; + } - for (int i = 0; i < args.Length; i = i + 2) - { - this.arguments.Add(args[i].Replace("-", ""), args[i + 1]); - //ConsoleWrite(args[i] + ": " +args[i+1]); - } + for (int i = 0; i < args.Length; i = i + 2) + { + this.arguments.Add(args[i].Replace("-", ""), args[i + 1]); + //ConsoleWrite(args[i] + ": " +args[i+1]); + } - if (!CheckForRequiredArguments(this.arguments)) - { - return; - } + if (!CheckForRequiredArguments(this.arguments)) + { + return; + } - connectionString = string.Format(@"user id={0};password={1};Initial Catalog={2};Data Source={3};", - this.arguments["u"], - this.arguments["p"], - this.arguments["d"], - this.arguments["s"]); + connectionString = string.Format(@"user id={0};password={1};Initial Catalog={2};Data Source={3};", + this.arguments["u"], + this.arguments["p"], + this.arguments["d"], + this.arguments["s"]); - SqlDataFresh dataFresh = new SqlDataFresh(connectionString, true); + SqlDataFresh dataFresh = new SqlDataFresh(connectionString, true); - string snapshotPath = this.arguments["sp"]; + string snapshotPath = this.arguments["sp"]; - if (snapshotPath != null) - { - snapshotPath = snapshotPath.Replace("\"", ""); - if (!snapshotPath.EndsWith(@"\")) + if (snapshotPath != null) { - snapshotPath += @"\"; - } + snapshotPath = snapshotPath.Replace("\"", ""); + if (!snapshotPath.EndsWith(@"\")) + { + snapshotPath += @"\"; + } - ConsoleWrite("snapshotPath = {0}", snapshotPath); - string fullPath = Path.GetFullPath(snapshotPath); - ConsoleWrite("fullPath = {0}", fullPath); - dataFresh.SnapshotPath = new DirectoryInfo(snapshotPath); - } + ConsoleWrite("snapshotPath = {0}", snapshotPath); + string fullPath = Path.GetFullPath(snapshotPath); + ConsoleWrite("fullPath = {0}", fullPath); + dataFresh.SnapshotPath = new DirectoryInfo(snapshotPath); + } - string command = this.arguments["c"].ToUpper(); - switch (command) - { - case "PREPARE": - bool ignoreSnapshot = false; - string ignoreSnapshotArgument = arguments["ignoresnapshot"]; - if(ignoreSnapshotArgument != null) - { - if(ignoreSnapshotArgument == "1") + string command = this.arguments["c"].ToUpper(); + switch (command) + { + case "PREPARE": + bool ignoreSnapshot = false; + string ignoreSnapshotArgument = arguments["ignoresnapshot"]; + if (ignoreSnapshotArgument != null) { - ignoreSnapshot = true; + if (ignoreSnapshotArgument == "1") + { + ignoreSnapshot = true; + } } - } - dataFresh.PrepareDatabaseforDataFresh(!ignoreSnapshot); - break; - case "REFRESH": - dataFresh.RefreshTheDatabase(); - break; - case "FORCEREFRESH": - dataFresh.RefreshTheEntireDatabase(); - break; - case "REMOVE": - dataFresh.RemoveDataFreshFromDatabase(); - break; - case "SNAPSHOT": - dataFresh.CreateSnapshot(); - break; - case "FOO": - //no nothing - break; - default: - ConsoleWrite("Command '{0}' was not recognized", command); - break; + dataFresh.PrepareDatabaseforDataFresh(!ignoreSnapshot); + break; + case "REFRESH": + dataFresh.RefreshTheDatabase(); + break; + case "FORCEREFRESH": + dataFresh.RefreshTheEntireDatabase(); + break; + case "REMOVE": + dataFresh.RemoveDataFreshFromDatabase(); + break; + case "SNAPSHOT": + dataFresh.CreateSnapshot(); + break; + case "FOO": + //no nothing + break; + default: + ConsoleWrite("Command '{0}' was not recognized", command); + break; + } + } + catch (Exception exception) + { + ConsoleWrite($"DataFresh failed: {exception.Message}.{Environment.NewLine}StackTrace: {exception.StackTrace}"); } } From 2facfcbe300bfeeb8210632db1a09975ea6ab2de Mon Sep 17 00:00:00 2001 From: Vladyslav Danylov Date: Tue, 14 Jun 2016 13:21:54 +0300 Subject: [PATCH 4/4] [PAA-1335] Fixed deletion of changed data. --- DataFresh/Resources/PrepareDataFresh.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataFresh/Resources/PrepareDataFresh.sql b/DataFresh/Resources/PrepareDataFresh.sql index 6703756..5491448 100644 --- a/DataFresh/Resources/PrepareDataFresh.sql +++ b/DataFresh/Resources/PrepareDataFresh.sql @@ -68,7 +68,7 @@ AS -- Delete All data from Changed Tables and Refill DECLARE ChangedTable_Cursor CURSOR FOR - SELECT [tablename], [tableschema] FROM #ChangedTables WHERE tablename not in('df_ChangeTracking', 'dr_DeltaVersion') AND tableschema <> 'dbo' + SELECT [tablename], [tableschema] FROM #ChangedTables WHERE tablename not in('df_ChangeTracking', 'dr_DeltaVersion') OPEN ChangedTable_Cursor FETCH NEXT FROM ChangedTable_Cursor INTO @TableName, @TableSchema