Para realizar este desafio, criei o seguinte script:
/* **************************************************************************************************************************************** Script Name: DB_Truncate_Automatic.sql Client's Name: Create Date: 16/10/2018 - 08:00 Created By: Bruno Bragatto - DBA Objective: Automatically truncate every table in a specific Database ---------------------------------------------------------------------------------------------------------------------------------------- Modification Log Date: 19/10/2018 Modified By: Bruno Bragatto Modification Details: User's Variables Defined. Also defined a best method to increase the performance Initial Created by: Bruno Bragatto **************************************************************************************************************************************** --References: https://www.mssqltips.com/sqlservertip/3347/drop-and-recreate-all-foreign-key-constraints-in-sql-server/ https://www.mssqltips.com/sqlservertip/1460/sql-server-script-to-create-windows-directories/ https://www.mssqltips.com/sqlservertip/2537/sql-server-row-count-for-all-tables-in-a-database/ INSTRUCTIONS! FIRST OF ALL: BE SURE OF WHAT ARE YOU DOING! 1- It's necessary to specify the Database Name. DOUBLE CHECK IT!! 2- You MUST change the @Truncate_Ready only when you're really ready to do the truncate. It's just change from 0 to 1. 2.1- If possible, execute it for the first time with the @Truncate_Ready variable set as 0 (just to be sure if everything is okay). 3- IF you want to generate some log of this process, just set the variable @Log_Ready from 0 to 1. 3.1- Check if your user has the right permission to write on the choosed Directory. (Obviously) 3.2- It's not necessary, but you can change the file_name if you want... Default Values: @Truncate_Ready = 0 @Truncate_Ready = 0 */ --YOU MUST CHANGE THE DATABASE NAME HERE!! USE [AdventureWorks2012_teste] --CHANGE IT! AND BE SURE ABOUT IT!!! GO SET NOCOUNT ON --USER VARIABLES --MANDATORY DECLARE @Truncate_Ready binary = 0 --0 is the default. Change it to 1 when you're ready --OPTIONAL DECLARE @Log_Ready binary = 0 --0 is the default. Change it to 1 if you want to generate txt log files. DECLARE @LogDir nvarchar(500) = 'C:\Truncate_Log' --Change it to the desired Directory. DECLARE @Drop_VW_Log nvarchar(500) = '3_Drop_VW_log' DECLARE @Create_VW_Log nvarchar(500) = '2_Create_VW_log' DECLARE @Drop_FK_Log nvarchar(500) = '5_Drop_FK_log' DECLARE @Create_FK_Log nvarchar(500) = '4_Create_FK_log' DECLARE @cnt_rows_ini_Log nvarchar(500) = '1_Total_Rows_before_log' DECLARE @cnt_rows_end_Log nvarchar(500) = '6_Total_Rows_after_log' ------------------------------------------------------------------------------------------------------------------------------------- --NON-USER VARIABLES -- Just don't change it! DECLARE @Recreate_VW TABLE (Id INT IDENTITY(1,1), name varchar(max), Code nvarchar(max)) DECLARE @Drop_VW TABLE (Id INT IDENTITY(1,1), Code nvarchar(max)) DECLARE @Drop_FK TABLE (Id INT IDENTITY(1,1), Code nvarchar(max)) DECLARE @Recreate_FK TABLE (Id INT IDENTITY(1,1), Code varchar(max)) DECLARE @truncate_count TABLE (count_value int) DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT) DECLARE @file_results TABLE (file_exists int, file_is_a_directory int, parent_directory_exists int) DECLARE @DBNAME sysname = (select DB_NAME()) DECLARE @crlf VARCHAR(2) = CHAR(13) + CHAR(10) DECLARE @lnCurrent int DECLARE @lnMax int DECLARE @LongName NVARCHAR(MAX) = N'' DECLARE @csql varchar(2000) DECLARE @cnt_rows_bgn NVARCHAR(MAX) = N'' DECLARE @cnt_rows_end NVARCHAR(MAX) = N'' DECLARE @cnt_global nvarchar(50) DECLARE @cnt_vw_begin nvarchar(50) DECLARE @cnt_vw_end nvarchar(50) DECLARE @cnt_fk_end nvarchar(50) DECLARE @LogPath nvarchar(500) = @LogDir + (select DB_NAME()) DECLARE @Drop_VW_FileName nvarchar(500) = @Drop_VW_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @Create_VW_FileName nvarchar(500) = @Create_VW_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @Drop_FK_FileName nvarchar(500) = @Drop_FK_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @Create_FK_FileName nvarchar(500) = @Create_FK_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @cnt_rows_ini_FileName nvarchar(500) = @cnt_rows_ini_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @cnt_rows_end_FileName nvarchar(500) = @cnt_rows_end_Log + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + LEFT(CAST(GETDATE() AS TIME),0) + '_' + REPLACE(LEFT(CAST(GETDATE() AS TIME), 5), ':', '') + '.txt' DECLARE @truncate_test VARCHAR(MAX) = (SELECT SUM(count_value) from @truncate_count) --Check if \ is missing --LOGFILE NAMES IF (RIGHT(@LogDir, 1) <> '\') BEGIN PRINT '"\" was missing on the specified directory and added automatically.' SET @LogPath = @LogDir + '\' + (select DB_NAME()) GOTO ini END -------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------- BEGINNING ----------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------- ini: ----DROP TEMPORARY TABLES IF ANY --##Scripts_FK IF OBJECT_ID('tempdb..##Scripts_FK') IS NOT NULL BEGIN DROP TABLE ##Scripts_FK END --##Scripts_VW IF OBJECT_ID('tempdb..##Scripts_VW') IS NOT NULL BEGIN DROP TABLE ##Scripts_VW END --##cnt_drop_VW IF OBJECT_ID('tempdb..##cnt_drop_VW') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_VW END --##cnt_drop_FK IF OBJECT_ID('tempdb..##cnt_drop_FK') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_FK END --##Log_Total_Rows_Begin IF OBJECT_ID('tempdb..##Log_Total_Rows_Begin') IS NOT NULL BEGIN DROP TABLE ##Log_Total_Rows_Begin END --##Log_Total_Rows_End IF OBJECT_ID('tempdb..##Log_Total_Rows_End') IS NOT NULL BEGIN DROP TABLE ##Log_Total_Rows_End END --#Total_Rows_Begin IF OBJECT_ID('tempdb..#Total_Rows_Begin') IS NOT NULL BEGIN DROP TABLE #Total_Rows_Begin END --#Total_Rows_End IF OBJECT_ID('tempdb..#Total_Rows_End') IS NOT NULL BEGIN DROP TABLE #Total_Rows_End END -----INSERT INTO CREATE AND DROP VIEWS VARIABLES --Insert data into @Recreate_VW INSERT INTO @Recreate_VW (name, Code) SELECT name, OBJECT_DEFINITION(OBJECT_ID) + @crlf FROM sys.objects WHERE type_desc in ('VIEW') -----Insert data into @Drop_VW INSERT INTO @Drop_VW (Code) SELECT 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) +';' + @crlf FROM sys.objects v WHERE type_desc in ('VIEW') --CREATE ##cnt_drop_VW IF OBJECT_ID('tempdb..##cnt_drop_VW') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_VW END CREATE TABLE ##cnt_drop_VW ( cnt_drop NVARCHAR(MAX) ); --INSERT Views Drop Scripts on ##cnt_drop_VW INSERT INTO ##cnt_drop_VW(cnt_drop) SELECT count(Code) from @Drop_VW; ----FK --GENERATE SCRIPTs TO DROP FKs -- drop is easy, just build a simple concatenated list from sys.foreign_keys: INSERT INTO @Drop_FK (Code) SELECT 'ALTER TABLE ' + QUOTENAME(cs.name) + '.' + QUOTENAME(ct.name) + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + ';' FROM sys.foreign_keys AS fk INNER JOIN sys.tables AS ct ON fk.parent_object_id = ct.[object_id] INNER JOIN sys.schemas AS cs ON ct.[schema_id] = cs.[schema_id]; --GENERATE SCRIPTs TO RECREATE FKs -- create is a little more complex. We need to generate the list of -- columns on both sides of the constraint, even though in most cases -- there is only one column. INSERT INTO @Recreate_FK (Code) SELECT 'ALTER TABLE ' + QUOTENAME(cs.name) + '.' + QUOTENAME(ct.name) + ' ADD CONSTRAINT ' + QUOTENAME(fk.name) + ' FOREIGN KEY (' + STUFF((SELECT ',' + QUOTENAME(c.name) -- get all the columns in the constraint table FROM sys.columns AS c INNER JOIN sys.foreign_key_columns AS fkc ON fkc.parent_column_id = c.column_id AND fkc.parent_object_id = c.[object_id] WHERE fkc.constraint_object_id = fk.[object_id] ORDER BY fkc.constraint_column_id FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') + ') REFERENCES ' + QUOTENAME(rs.name) + '.' + QUOTENAME(rt.name) + '(' + STUFF(( SELECT ',' + QUOTENAME(c.name) -- get all the referenced columns FROM sys.columns AS c INNER JOIN sys.foreign_key_columns AS fkc ON fkc.referenced_column_id = c.column_id AND fkc.referenced_object_id = c.[object_id] WHERE fkc.constraint_object_id = fk.[object_id] ORDER BY fkc.constraint_column_id FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') + ');' FROM sys.foreign_keys AS fk INNER JOIN sys.tables AS rt -- referenced table ON fk.referenced_object_id = rt.[object_id] INNER JOIN sys.schemas AS rs ON rt.[schema_id] = rs.[schema_id] INNER JOIN sys.tables AS ct -- constraint table ON fk.parent_object_id = ct.[object_id] INNER JOIN sys.schemas AS cs ON ct.[schema_id] = cs.[schema_id] WHERE rt.is_ms_shipped = 0 AND ct.is_ms_shipped = 0; --CREATE GLOBAL TEMPORARY to count the total of Drops in the BEGINNING IF OBJECT_ID('tempdb..##cnt_drop_FK') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_FK END CREATE TABLE ##cnt_drop_FK ( cnt_drop NVARCHAR(MAX) ); INSERT INTO ##cnt_drop_FK(cnt_drop) SELECT count(Code) from @Drop_FK; PRINT ' ----------------------------------------------------------------------------------------------------- GENERAL INFORMATIONS ----------------------------------------------------------------------------------------------------- ' PRINT 'SERVER NAME: '+ @@SERVERNAME PRINT 'DATABASE NAME: '+ @DBNAME --INSERT INTO CREATE AND DROP VIEWS GLOBAL TEMPORARY TABLE IF OBJECT_ID('tempdb..##Scripts_VM') IS NOT NULL BEGIN DROP TABLE ##Scripts_VM END CREATE TABLE ##Scripts_VW ( drop_script NVARCHAR(MAX), create_script NVARCHAR(MAX) ); INSERT into ##Scripts_VW(drop_script) SELECT code from @Drop_VW; INSERT into ##Scripts_VW(create_script) SELECT code from @Recreate_VW; --INSERT INTO CREATE AND DROP FOREIGN KEYS TEMPORARY TABLE IF OBJECT_ID('tempdb..##Scripts_FK') IS NOT NULL BEGIN DROP TABLE ##Scripts_FK END CREATE TABLE ##Scripts_FK ( drop_script NVARCHAR(MAX), create_script NVARCHAR(MAX) ); INSERT INTO ##Scripts_FK(drop_script) SELECT Code from @Drop_FK; INSERT INTO ##Scripts_FK(create_script) SELECT Code from @Recreate_FK; --INSERT TOTAL LINES WITHOUT COUNT EVERY TABLE (Ideal for Performance) SELECT QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) AS [Table_Name] , SUM(sdmvPTNS.row_count) AS [Row_Count] INTO #Total_Rows_Begin FROM sys.objects AS sOBJ INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS ON sOBJ.object_id = sdmvPTNS.object_id WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0x0 AND sdmvPTNS.index_id < 2 GROUP BY sOBJ.schema_id , sOBJ.name ORDER BY [Table_Name] ---------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------ L O G ------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------- IF @Log_Ready=0 BEGIN PRINT ' LOG NOT CREATED BY USER CHOICE Variable @Log_Ready = 0 If you want any log, the variable @Log_Ready should be 1 _______________________________________________________________ Log not created ' GOTO execution END ELSE BEGIN PRINT ' ----------------------------------------------------------------------------------------------------- CREATING FOLDERS AND LOGFILES (Scripts bellow) ----------------------------------------------------------------------------------------------------- ' -- @LogPath values INSERT INTO @DirTree(subdirectory, depth) EXEC master.sys.xp_dirtree @LogPath -- Create the @LogPath directory IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName) EXEC master.dbo.xp_create_subdir @LogPath insert into @file_results (file_exists, file_is_a_directory, parent_directory_exists) EXEC master.dbo.xp_fileexist @LogPath --VERIFICATION FOLDER PATH IF (select file_is_a_directory from @file_results) = 0 BEGIN select file_exists from @file_results PRINT ' VERIFY THAT THE ROOT DIRECTORY PATH EXISTS OR THAT YOU HAVE THE RIGHT PERMISSIONS TRUNCATE SCRIPT NOT EXECUTED' GOTO quit END PRINT ' EXECUTION LOG DIRECTORY: ' PRINT @LogPath --INSERT TOTAL LINES WITHOUT COUNT EVERY TABLE (Ideal for Performance) SELECT Table_Name + ' - ' + CAST(Row_Count as VARCHAR(MAX)) + ' Rows' as "Log" INTO ##Log_Total_Rows_Begin FROM #Total_Rows_Begin SET @cnt_rows_bgn = (select SUM(Row_Count) from #Total_Rows_Begin) --GENERATE LOG FILES PRINT ' EXECUTION LOG FILES: ' SELECT @cSQL= 'bcp "SELECT * from ##Log_Total_Rows_Begin" queryout '+ @LogPath + '\' + @cnt_rows_ini_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output PRINT + @LogPath + '\' + @cnt_rows_ini_FileName PRINT + @LogPath + '\' + @cnt_rows_end_FileName SELECT @cSQL= 'bcp "SELECT create_script from ##Scripts_VW WHERE create_script IS NOT NULL" queryout ' + @LogPath + '\' + @Create_VW_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output PRINT + @LogPath + '\' + @Create_VW_FileName SELECT @cSQL= 'bcp "SELECT drop_script from ##Scripts_VW WHERE drop_script IS NOT NULL" queryout ' + @LogPath + '\' + @Drop_VW_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output PRINT + @LogPath + '\' + @Drop_VW_FileName SELECT @cSQL= 'bcp "SELECT create_script from ##Scripts_FK WHERE create_script IS NOT NULL" queryout ' + @LogPath + '\' + @Create_FK_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output PRINT + @LogPath + '\' + @Create_FK_FileName SELECT @cSQL= 'bcp "SELECT drop_script from ##Scripts_FK WHERE drop_script IS NOT NULL" queryout ' + @LogPath + '\' + @Drop_FK_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output PRINT + @LogPath + '\' + @Drop_FK_FileName --ENDDING OF THE LOG SECTION END ---------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------ E X E C U T I O N ------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------- --EXECUTE DROP VIEW execution: PRINT ' ----------------------------------------------------------------------------------------------------- DROP ALL VIEWS ----------------------------------------------------------------------------------------------------- ' --IF TRUNCATE_READY FALSE IF @Truncate_Ready=0 BEGIN PRINT ' Views not dropped Variable @Truncate_Ready = 0 This value should be 1 _______________________________________________________________ Views not dropped yet by user choice ' END ELSE BEGIN SET @cnt_vw_begin = (select count(drop_script) from ##Scripts_VW where drop_script IS NOT NULL) SELECT @lnMax = MAX(Id) FROM @Drop_VW SET @lnCurrent = 1 SET @cnt_global =0 WHILE @lnCurrent <= @lnMax BEGIN SELECT @LongName = Code FROM @Drop_VW WHERE Id = @lnCurrent WHILE @LongName <> '' BEGIN EXEC sp_executesql @LongName --print LEFT(@LongName,8000) ----just uncomment if you want to see all the "DROP VIEW..." statements in the Results (Messages) SET @LongName = SUBSTRING(@LongName, 8001, LEN(@LongName)) END SET @lnCurrent = @lnCurrent + 1 SET @cnt_global = @cnt_global + 1 END PRINT 'TOTAL DROPED VIEWS: ' +@cnt_global END PRINT ' ----------------------------------------------------------------------------------------------------- DROP FK, Disabling triggers, NOCHECK Constraints ----------------------------------------------------------------------------------------------------- ' --IF TRUNCATE_READY FALSE IF @Truncate_Ready=0 BEGIN PRINT ' By user choice: FKs Not dropped Triggers not Disabled Constraints not changed (TRUNCATE WILL NOT BE EXECUTED YET) Variable @Truncate_Ready = 0 This value should be 1 _______________________________________________________________ Nothing executed by user choice ' END ELSE BEGIN SELECT @lnMax = MAX(Id) FROM @Drop_FK SET @lnCurrent = 1 SET @cnt_global =0 WHILE @lnCurrent <= @lnMax BEGIN SELECT @LongName = Code FROM @Drop_FK WHERE Id = @lnCurrent WHILE @LongName <> '' BEGIN EXEC sp_executesql @LongName --print LEFT(@LongName,8000) ----just uncomment if you want to see all the "ALTER TABLE... DROP CONSTRAINT..." statements in the Results (Messages) SET @LongName = SUBSTRING(@LongName, 8001, LEN(@LongName)) END SET @lnCurrent = @lnCurrent + 1 SET @cnt_global = @cnt_global + 1 END --EXEC sp_executesql @Drop_FK PRINT ' DROP FKs -------------------- OK' PRINT 'TOTAL DROPED FKs: ' +@cnt_global EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' PRINT ' NOCHECK CONSTRAINT ALL ------ OK ' EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL' PRINT ' DISABLE TRIGGER ALL --------- OK ' PRINT ' ______________________________________________________________________ Activities successfully executed ' END PRINT ' ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- T R U N C A T E T I M E ! ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- ' --DECLARE @truncate_test VARCHAR(MAX) = (SELECT SUM(count_value) from @truncate_count) --IF TRUNCATE_READY FALSE IF @Truncate_Ready=0 BEGIN PRINT ' TRUNCATE NOT EXECUTED YET Variable @Truncate_Ready = 0 This value should be 1 _______________________________________________________________ Truncate not executed by user choice ' GOTO truncate_test END --IF TRUNCATE_READY TRUE ELSE BEGIN EXEC sp_MSForEachTable 'TRUNCATE TABLE ?' PRINT ' TRUNCATE COMMAND EXECUTED FOR EACH TABLE' END --AFTER TRUNCATE TEST truncate_test: PRINT ' ----------------------------------------------------------------------------------------------------- TRUNCATE TEST ----------------------------------------------------------------------------------------------------- ' insert into @truncate_count (count_value) EXEC sp_MSForEachTable 'select count(*) from ?' SET @truncate_test = (SELECT SUM(count_value) from @truncate_count) IF @truncate_test=0 BEGIN PRINT ' TRUNCATE SUCCESSFULLY EXECUTED '+@truncate_test+' Rows Remaining in the Database OPTIONAL STEP: If you want to verify for your own the result, please execute the following script: --Script to verify the Truncate action USE ['+@DBNAME+'] GO EXEC sp_MSForEachTable ''select * from ? '' _______________________________________________________________ Truncate Succeded ' END ELSE BEGIN PRINT ' MANDATORY STEP: You SHOULD control what went wrong and solve it. --Script to verify the Truncate action USE ['+@DBNAME+'] GO EXEC sp_MSForEachTable ''select * from ? '' '+@truncate_test+' _______________________________________________________________ Truncate FAILED (or not executed yet) ' END --RECRIAR VIEWS after_truncate: PRINT ' ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- RE-CREATE ALL OBJECTS ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- ' --IF TRUNCATE_READY FALSE IF @Truncate_Ready=0 BEGIN PRINT ' By user choice: It was not necessary recreate or reactivate any object Variable @Truncate_Ready = 0 This value should be 1 _______________________________________________________________ Nothing executed yet by user choice ' END ELSE BEGIN PRINT ' ----------------------------------------------------------------------------------------------------- RE-CREATE ALL VIEWS ----------------------------------------------------------------------------------------------------- ' SELECT @lnMax = MAX(Id) FROM @Recreate_VW SET @lnCurrent = 1 SET @cnt_global = 0 WHILE @lnCurrent <= @lnMax BEGIN SELECT @LongName = Code FROM @Recreate_VW WHERE Id = @lnCurrent WHILE @LongName <> '' BEGIN EXEC sp_executesql @LongName --print LEFT(@LongName,8000) ----just uncomment if you want to see all the "CREATE VIEW..." statements in the Results (Messages) SET @LongName = SUBSTRING(@LongName, 8001, LEN(@LongName)) END SET @lnCurrent = @lnCurrent + 1 SET @cnt_global = @cnt_global + 1 END PRINT ' TOTAL RECREATED VIEWS: ' +@cnt_global PRINT '_____________________________________________________________________ Views Recriadas com sucesso ' PRINT ' ----------------------------------------------------------------------------------------------------- Reativando triggers e CHECK Constraints ----------------------------------------------------------------------------------------------------- ' EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' PRINT ' CHECK CONSTRAINT ALL --------- OK ' EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL' PRINT ' ENABLE TRIGGER ALL ----------- OK ' EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; IF NOT EXISTS ( SELECT * FROM SYS.IDENTITY_COLUMNS JOIN SYS.TABLES ON SYS.IDENTITY_COLUMNS.Object_ID = SYS.TABLES.Object_ID WHERE SYS.TABLES.Object_ID = OBJECT_ID(''?'') AND SYS.IDENTITY_COLUMNS.Last_Value IS NULL ) AND OBJECTPROPERTY( OBJECT_ID(''?''), ''TableHasIdentity'' ) = 1 DBCC CHECKIDENT (''?'', RESEED, 0) WITH NO_INFOMSGS' --RECREATE FKs PRINT ' ----------------------------------------------------------------------------------------------------- RE-CREATE FKs (Scripts Bellow) ----------------------------------------------------------------------------------------------------- ' SELECT @lnMax = MAX(Id) FROM @Recreate_FK SET @lnCurrent = 1 SET @cnt_global = 0 WHILE @lnCurrent <= @lnMax BEGIN SELECT @LongName = Code FROM @Recreate_FK WHERE Id = @lnCurrent WHILE @LongName <> '' BEGIN EXEC sp_executesql @LongName --print LEFT(@LongName,8000) ----just uncomment if you want to see all the "ALTER TABLE ... ADD CONSTRAINT" statements in the Results (Messages) SET @LongName = SUBSTRING(@LongName, 8001, LEN(@LongName)) END SET @lnCurrent = @lnCurrent + 1 SET @cnt_global = @cnt_global + 1 END PRINT ' TOTAL RECREATED FKs: ' +@cnt_global PRINT '_______________________________________________________________ FKs Recriadas com sucesso ' END --5. VERIFYING EVERYTHING IF @Log_Ready = 1 BEGIN --INSERT ENDING TOTAL ROWS WITHOUT COUNT EVERY TABLE (Ideal for Performance) --CREATE #Total_Rows_end SELECT QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) + ' - ' + CAST(SUM(sdmvPTNS.row_count) as VARCHAR(MAX)) + ' Rows' AS [Log] INTO ##Log_Total_Rows_end FROM sys.objects AS sOBJ INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS ON sOBJ.object_id = sdmvPTNS.object_id WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0x0 AND sdmvPTNS.index_id < 2 GROUP BY sOBJ.schema_id , sOBJ.name ORDER BY sOBJ.schema_id,sOBJ.name --CREATE #Total_Rows_end --SELECT Table_Name + ' - ' + CAST(Row_Count as VARCHAR(MAX)) + ' Rows' as "Log" -- INTO ##Log_Total_Rows_end -- FROM #Total_Rows_end --CREATE LOG FILE - TOTAL ROWS AT THE ENDING SELECT @cSQL= 'bcp "SELECT * from ##Log_Total_Rows_end" queryout '+ @LogPath + '\' + @cnt_rows_end_FileName + ' -e -t -T -c -S' + @@SERVERNAME EXEC xp_cmdshell @csql, no_output END --END IF SET @cnt_rows_bgn = (select SUM(Row_Count) from #Total_Rows_Begin) SET @cnt_vw_end = (SELECT count(v.name) FROM sys.objects v WHERE type_desc in ('VIEW')) SET @cnt_global = (select cnt_drop from ##cnt_drop_VW) SET @cnt_vw_end = (SELECT count(v.name) FROM sys.objects v WHERE type_desc in ('VIEW')) PRINT ' ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- FINAL REPORT (Execute the script Bellow if necessary) ----------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- ' PRINT ' ROWSs -----------' PRINT 'Total Rows in the beginning: ' +@cnt_rows_bgn PRINT 'Total Rows after the Truncate: ' +@truncate_test PRINT ' VIEWS -----------' PRINT 'Total Views in the BEGINNING = ' +@cnt_global--+@cnt_vw_begin PRINT 'Total Views in the End = ' +@cnt_vw_end PRINT ' FKs -----------' SET @cnt_rows_bgn = (select SUM(Row_Count) from #Total_Rows_Begin) SET @cnt_global = (select cnt_drop from ##cnt_drop_FK) SET @cnt_fk_end = (SELECT count(fk.name) FROM sys.foreign_keys AS fk) PRINT 'Total FKs in the BEGINNING = ' +@cnt_global PRINT 'Total FKs in the End = ' +@cnt_fk_end --DROP TEMPORARY TABLES IN THE END, IF ANY quit: IF OBJECT_ID('tempdb..##Scripts_FK') IS NOT NULL BEGIN DROP TABLE ##Scripts_FK END IF OBJECT_ID('tempdb..##Scripts_VW') IS NOT NULL BEGIN DROP TABLE ##Scripts_VW END IF OBJECT_ID('tempdb..##cnt_drop_VW') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_VW END IF OBJECT_ID('tempdb..##cnt_drop_FK') IS NOT NULL BEGIN DROP TABLE ##cnt_drop_FK END IF OBJECT_ID('tempdb..#Total_Rows_Begin') IS NOT NULL BEGIN DROP TABLE #Total_Rows_Begin END IF OBJECT_ID('tempdb..#Total_Rows_End') IS NOT NULL BEGIN DROP TABLE #Total_Rows_End END IF OBJECT_ID('tempdb..##Log_Total_Rows_Begin') IS NOT NULL BEGIN DROP TABLE ##Log_Total_Rows_Begin END IF OBJECT_ID('tempdb..##Log_Total_Rows_End') IS NOT NULL BEGIN DROP TABLE ##Log_Total_Rows_End END