diff --git a/EXPLOIT - list databases sizes.sql b/EXPLOIT - list databases sizes.sql index 0de783c..742efea 100644 --- a/EXPLOIT - list databases sizes.sql +++ b/EXPLOIT - list databases sizes.sql @@ -85,21 +85,37 @@ WHERE f.type_desc IN ( ORDER BY [d2].[row_size_mb] DESC, d.name DESC, f.name ASC ; --free disk space -SELECT DISTINCT - CONVERT(VARCHAR(512), [b].[volume_mount_point]) AS [volume_mount_point], - CONVERT(VARCHAR(512), [b].[logical_volume_name]) AS [logical_volume_name], - CONVERT( - DECIMAL(18, 1), - ROUND(((CONVERT(FLOAT, [b].[available_bytes]) / CONVERT(FLOAT, [b].[total_bytes])) * 100), 1)) AS [percent_free], - CONVERT(BIGINT, ROUND((([b].[available_bytes] / 1024.0) / 1024.0 / 1024.0), 0)) AS [free_gb], - CONVERT(BIGINT, ROUND((([b].[available_bytes] / 1024.0) / 1024.0 ), 0)) AS [free_mb], - CONVERT(BIGINT, ROUND((([b].[total_bytes] / 1024.0) / 1024.0 / 1024.0), 0)) AS [total_gb], - CONVERT(BIGINT, ROUND(((([b].[total_bytes] - [b].[available_bytes]) / 1024.0) / 1024.0 / 1024.0), 0)) AS [used_gb], - CONVERT(BIGINT, ROUND((([b].[total_bytes] / 1024.0) / 1024.0), 0)) / 100 * 5 / 1024.0 AS [5% space in Go is], - CONVERT(BIGINT, ROUND((([b].[total_bytes] / 1024.0) / 1024.0), 0)) / 100 * 10 / 1024.0 AS [10% space in Go is], - CONVERT(BIGINT, ROUND((([b].[total_bytes] / 1024.0) / 1024.0), 0)) / 100 * 15 / 1024.0 AS [15% space in Go is], - CURRENT_TIMESTAMP AS now, - REPLACE(@@SERVERNAME, '\apssql', '') AS srvName +SELECT + CONVERT(VARCHAR(512), [b].[volume_mount_point]) AS [volume_mount_point], + CONVERT(VARCHAR(512), [b].[logical_volume_name]) AS [logical_volume_name], + CONVERT(DECIMAL(18, 1), ROUND(((SUM(CONVERT(FLOAT, [b].[available_bytes])) / SUM(CONVERT(FLOAT, [b].[total_bytes]))) * 100), 1)) AS [percent_free], + CONVERT(BIGINT, ROUND(((SUM([b].[available_bytes]) / 1024.0) / 1024.0 / 1024.0), 0)) AS [free_gb], + CONVERT(BIGINT, ROUND(((SUM([b].[available_bytes]) / 1024.0) / 1024.0), 0)) AS [free_mb], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0 / 1024.0), 0)) AS [total_gb], + CONVERT(BIGINT, ROUND((((SUM([b].[total_bytes] - [b].[available_bytes])) / 1024.0) / 1024.0 / 1024.0), 0)) AS [used_gb], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 5 / 1024.0 AS [5% space in Go is], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 10 / 1024.0 AS [10% space in Go is], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 15 / 1024.0 AS [15% space in Go is], + CURRENT_TIMESTAMP AS now, + REPLACE(@@SERVERNAME, '\apssql', '') AS srvName FROM sys.master_files AS [a] - CROSS APPLY sys.dm_os_volume_stats(a.database_id, a.[file_id]) AS [b] - ORDER BY [percent_free] ASC; + CROSS APPLY ( + SELECT [x].[database_id], + [x].[file_id], + [x].[volume_mount_point], + [x].[volume_id], + [x].[logical_volume_name], + [x].[file_system_type], + [x].[total_bytes], + [x].[available_bytes], + [x].[supports_compression], + [x].[supports_alternate_streams], + [x].[supports_sparse_files], + [x].[is_read_only], + [x].[is_compressed], + ROW_NUMBER() OVER (PARTITION BY [x].[volume_mount_point] + ORDER BY [x].[volume_mount_point] DESC) AS rnk + FROM sys.dm_os_volume_stats(a.database_id, a.[file_id]) x ) b + WHERE [b].[rnk] = 1 + GROUP BY [b].[logical_volume_name], [b].[volume_mount_point] + ORDER BY [b].[volume_mount_point] ASC; \ No newline at end of file diff --git a/paul_snippets/Admin/Backup_Database.sql b/paul_snippets/Admin/Backup_Database.sql new file mode 100644 index 0000000..f4a9862 --- /dev/null +++ b/paul_snippets/Admin/Backup_Database.sql @@ -0,0 +1,8 @@ +USE MASTER +GO + +DECLARE @db NVARCHAR(100) = '' + +EXECUTE [master].dbo.p_DbTool__BackUp_Database @debugMode = 0, @databaseName = @db + +-- EXECUTE [master].dbo.p_DbTool__Restore_DB_from_Backup 0, '' \ No newline at end of file diff --git a/paul_snippets/Admin/Database_Create.sql b/paul_snippets/Admin/Database_Create.sql new file mode 100644 index 0000000..7e359d9 --- /dev/null +++ b/paul_snippets/Admin/Database_Create.sql @@ -0,0 +1,273 @@ +USE [master] +GO + +BEGIN TRY +-- must set database name, number of data files and data file size + -- database name + DECLARE @databaseName NVARCHAR(100) = 'some data base' + + -- number of data files + DECLARE @numberDataFiles TINYINT = 2 + -- normally should not have LESS then 2 data files + + -- size of data files + DECLARE @ndfSize DECIMAL(6, 3) = 2 + -- allowed sizes: 0.125, 0.25, 0.5, 1.0, 2.0, 3.0, 4.0 + + + -- set to one to enable filestream + DECLARE @withFileStream BIT = 0 + -- allowed values 0 or 1 - default=0 (no filestream) + +-- if using database switching then set hasSwitch=1 + -- uses database-switching and snapshot - default=FALSE - on TRUE will generate script for two databases (__00 & __01) plus snapshot + DECLARE @hasSwitch BIT = 0 + + + -- ensure ndf file size is allowed + IF NOT (@ndfSize IN (0.125, 0.25, 0.5, 1.0, 2.0, 3.0, 4.0)) + BEGIN + DECLARE @x VARCHAR(10) = CAST(@ndfSize AS VARCHAR(10)) + RAISERROR ('.ndf File Size of %s is NOT an allowed value for ndfSize - cannot continue! [allowed: 0.125, 0.25, 0.5, 1.0, 2.2, 3.0, 4.0]', 14, 2, @x); + END + + -- trim and remove square brackets [] from databaseName + SET @databaseName = LTRIM(RTRIM(REPLACE(REPLACE(@databaseName, '[', ''), ']', ''))) + + + -- script vars + DECLARE @s CHAR(4) = ' ' -- spacer for indents + DECLARE @dataDir NVARCHAR(200) = ( SELECT PropertyValue FROM [master].dbo.fn_List_ServerProperties() WHERE PropertyName = 'Data_Directory' ) + DECLARE @LogDir NVARCHAR(200) = ( SELECT PropertyValue FROM [master].dbo.fn_List_ServerProperties() WHERE PropertyName = 'Log_Directory' ) + DECLARE @fsDir NVARCHAR(200) = ( SELECT PropertyValue FROM [master].dbo.fn_List_ServerProperties() WHERE PropertyName = 'Filestream_Directory' ) + DECLARE @snapshotDir NVARCHAR(200) = ( SELECT PropertyValue FROM [master].dbo.fn_List_ServerProperties() WHERE PropertyName = 'Snapshot_Directory' ) + DECLARE @gb INT = 1024 + -- file size as string + DECLARE @nSize NVARCHAR(10) = CAST(CAST((@gb * @ndfSize) AS INT) AS NVARCHAR(10)) + 'MB' + -- file growth based on file size: if greater than 256MB (0.25) then 512MB else 128MB + DECLARE @fileGrowth NVARCHAR(10) = CASE WHEN (@ndfSize > 0.25) THEN '512MB' ELSE '128MB' END + + + -- table to hold all sql statements + DECLARE @tbl TABLE (Tbl_PK INT IDENTITY (1, 1) NOT NULL, SqlString NVARCHAR(MAX) NOT NULL, ForSwitch BIT DEFAULT (1)) + + + -- add USE MASTER to sqlTable + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '/* create database ' + @databaseName + ' */' + INSERT INTO @tbl (SqlString) SELECT 'USE [master]' + INSERT INTO @tbl (SqlString) SELECT 'GO' + INSERT INTO @tbl (SqlString) SELECT '' + + + -- script test for existing DB + INSERT INTO @tbl (SqlString) SELECT 'IF EXISTS ( SELECT * FROM sys.databases WHERE name = ''' + @databaseName + ''' )' + INSERT INTO @tbl (SqlString) SELECT ' BEGIN' + INSERT INTO @tbl (SqlString) SELECT @s + 'RAISERROR (''ERROR: Database [%s] already exists on this server - cannot continue!'', 10, 1, ''' + @databaseName + ''')' + INSERT INTO @tbl (SqlString) SELECT ' END' + + + -- script else create database + INSERT INTO @tbl (SqlString) SELECT 'ELSE' + INSERT INTO @tbl (SqlString) SELECT ' BEGIN' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + 'CREATE DATABASE [' + @databaseName + ']' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'ON PRIMARY' + INSERT INTO @tbl (SqlString) SELECT @s + @s + @s + '(NAME = ' + @databaseName + '__primary, FILENAME = ''' + @dataDir + '\' + @databaseName + '__primary.mdf'', SIZE = 16MB, MAXSIZE = UNLIMITED, FILEGROWTH = 16MB),' + INSERT INTO @tbl (SqlString) SELECT '' + + -- ndf files + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'FILEGROUP DATA DEFAULT' + + @s + ' -- sizes -- 128MB -- 256MB -- 512MB' + ' -- ' + CAST(@gb AS NVARCHAR(10)) + 'MB' + ' -- ' + CAST(@gb * 2 AS NVARCHAR(10)) + 'MB' + + ' -- ' + CAST(@gb * 3 AS NVARCHAR(10)) + 'MB' + ' -- ' + CAST(@gb * 4 AS NVARCHAR(10)) + 'MB' + + ' -- ' + CAST(@gb * 5 AS NVARCHAR(10)) + 'MB' + ' -- ' + CAST(@gb * 6 AS NVARCHAR(10)) + 'MB' + + ' -- ' + CAST(@gb * 7 AS NVARCHAR(10)) + 'MB' + ' -- ' + CAST(@gb * 8 AS NVARCHAR(10)) + 'MB' + + -- add data files for default filegroup "DATA" + DECLARE @i INT = 1 + WHILE @i <= @numberDataFiles + BEGIN + -- data file + INSERT INTO @tbl (SqlString) + SELECT @s + @s + @s + '(NAME = ' + @databaseName + '__data_' + CAST(@i AS NVARCHAR(10)) + + ', FILENAME = ''' + @dataDir + '\' + @databaseName + '__data_' + CAST(@i AS NVARCHAR(10)) + '.ndf'',' + + ' SIZE = ' + @nSize + ', MAXSIZE = UNLIMITED, FILEGROWTH = ' + @fileGrowth + ')' + + CASE WHEN (@i < @numberDataFiles) THEN ',' ELSE '' END + -- incremetn counter i + SET @i += 1 + END + INSERT INTO @tbl (SqlString) SELECT '' + + + -- filestream if needed + IF @withFileStream = 0 + BEGIN + INSERT INTO @tbl (SqlString) SELECT @s + @s + '-- Un-Comment if FILESTREAM is needed' + END + INSERT INTO @tbl (SqlString) SELECT @s + @s + CASE WHEN @withFileStream = 0 THEN '--' ELSE '' END + ',' + INSERT INTO @tbl (SqlString) SELECT @s + @s + CASE WHEN @withFileStream = 0 THEN '--' ELSE '' END + 'FILEGROUP [FILESTREAM] CONTAINS FILESTREAM DEFAULT' + INSERT INTO @tbl (SqlString) SELECT @s + @s + CASE WHEN @withFileStream = 0 THEN '--' ELSE '' END + @s + '(NAME = ' + @databaseName + '__fs, FILENAME = ''' + @fsDir + '\' + @databaseName + '__fs'')' + INSERT INTO @tbl (SqlString) SELECT '' + + -- log file + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'LOG ON' + INSERT INTO @tbl (SqlString) SELECT @s + @s + @s + '(NAME = ' + @databaseName + '__log,' + + ' FILENAME = ''' + @logDir + '\' + @databaseName + '__log.ldf'',' + + ' SIZE = ' + @nSize + ',' + ' MAXSIZE = UNLIMITED,' + + ' FILEGROWTH = ' + @fileGrowth + ')' + INSERT INTO @tbl (SqlString) SELECT '' + + -- set collation to CI/AS + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'COLLATE Latin1_General_CI_AS' + INSERT INTO @tbl (SqlString) SELECT ' END' + + -- print results + INSERT INTO @tbl (SqlString) SELECT 'PRINT ''DB [' + @databaseName + '] created''' + INSERT INTO @tbl (SqlString) SELECT 'GO' + INSERT INTO @tbl (SqlString) SELECT '' + + -- set dbOwner to sa + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '-- set dbOwner on created databases', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + ']', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'EXECUTE sp_changedbowner @loginame = ''sa'', @map = false', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + IF (@hasSwitch = 1) + BEGIN + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + '__01]', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'EXECUTE sp_changedbowner @loginame = ''sa'', @map = false', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + END + + + -- set RecoveryModel to SIMPLE +--'ALTER DATABASE [' + Name + '] SET RECOVERY SIMPLE WITH NO_WAIT' + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '-- set RecoveryModel to SIMPLE on created databases', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + ']', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'ALTER DATABASE [' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + '] SET RECOVERY SIMPLE WITH NO_WAIT', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + IF (@hasSwitch = 1) + BEGIN + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + '__01]', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'ALTER DATABASE [' + @databaseName + '__01] SET RECOVERY SIMPLE WITH NO_WAIT', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + END + +-- set compatibility to SQL2017 (140) +--'ALTER DATABASE [' + Name + '] SET COMPATIBILITY_LEVEL = 140' + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '-- set compatibility to SQL2017 (140) on created databases', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + ']', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'ALTER DATABASE [' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + '] SET COMPATIBILITY_LEVEL = 140', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + IF (@hasSwitch = 1) + BEGIN + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [' + @databaseName + '__01]', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'ALTER DATABASE [' + @databaseName + '__01] SET COMPATIBILITY_LEVEL = 140', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + END + + + + -- snapshot if needed + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '/* script for ' + @databaseName + ' snapshot' + CASE WHEN (@hasSwitch = 1) THEN ' */' ELSE '' END, 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [master]', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'IF EXISTS (SELECT name FROM sys.databases WHERE name = ''' + @databaseName + ''')', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT ' BEGIN', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT @s + 'DROP DATABASE ' + @databaseName, 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT ' END', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'CREATE DATABASE ' + @databaseName, 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT @s + 'ON', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT @s + @s + '(NAME = ' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + '__primary, FILENAME = ''' + @snapshotDir + '\' + @databaseName + '.ss''),', 0 + + -- add snapshot data file for each datafile + SET @i = 1 + WHILE @i <= @numberDataFiles + BEGIN + -- data file + INSERT INTO @tbl (SqlString, ForSwitch) + SELECT @s + @s + '(NAME = ' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END + '__data_' + CAST(@i AS NVARCHAR(10)) + ',' + + ' FILENAME = ''' + @snapshotDir + '\' + @databaseName + '_' + CAST(@i AS NVARCHAR(10)) + '.ss'')' + + CASE WHEN (@i < @numberDataFiles) THEN ',' ELSE '' END, 0 + -- incremetn counter i + SET @i += 1 + END + + -- finish snapshot + INSERT INTO @tbl (SqlString, ForSwitch) SELECT @s + 'AS SNAPSHOT OF ' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN '__00' ELSE '' END, 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + -- print switch/snapshot results + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'PRINT ''SNAPSHOT [' + @databaseName + '] created''', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + -- end comment if not switching + IF (@hasSwitch = 0) + BEGIN + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '*/', 0 + END + + -- print results + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'USE [master]', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'GO', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '/* generated script for:', 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT 'CREATE DATABASE ' + @databaseName + CASE WHEN (@hasSwitch = 1) THEN ' __00 __01 & snapshot' ELSE '' END, 0 + INSERT INTO @tbl (SqlString, ForSwitch) SELECT '*/', 0 + + + -- return all SQL strings - if hasSwitch=TRUE then select forSwitch records twice (with each name) else only select once + IF (@hasSwitch = 0) + BEGIN + SELECT SqlString FROM @tbl ORDER BY Tbl_PK + END + ELSE + BEGIN + SELECT SqlString + FROM + ( + -- for db __00 + SELECT REPLACE(SqlString, @databaseName, @databaseName + '__00') AS SqlString, 1 AS SortOrder, Tbl_PK + FROM @tbl WHERE ForSwitch = 1 + -- for db __00 + UNION ALL + -- for db __01 + SELECT REPLACE(SqlString, @databaseName, @databaseName + '__01') AS SqlString, 2 AS SortOrder, Tbl_PK + FROM @tbl WHERE ForSwitch = 1 + -- for db __01 + UNION ALL + -- for snapshot + SELECT SqlString, 3 AS SortOrder, Tbl_PK FROM @tbl WHERE ForSwitch = 0 + -- for snapshot + ) s + ORDER BY SortOrder, Tbl_PK + END + + + ------ return file directories for proofing + ----SELECT @dataDir AS Data_Directory, @LogDir AS Log_Directory, @fsDir AS Filestream_Directory, @snapshotDir AS Snapshot_Directory + +END TRY + +BEGIN CATCH + EXECUTE [master].dbo.sp_RethrowError +END CATCH diff --git a/paul_snippets/Admin/Script_DataCopy.sql b/paul_snippets/Admin/Script_DataCopy.sql new file mode 100644 index 0000000..985b56b --- /dev/null +++ b/paul_snippets/Admin/Script_DataCopy.sql @@ -0,0 +1,641 @@ +/* +To use this script-builder: + 1. connect to target server - location of target database + + 2. write target database name in "USE DATABASE" statement + script-builder expects source and target database names to be identical - modify created script if this is not correct + + 3. set required variables: sourceServer and targetServer + + 4. set optional variables as desired: + a. tablePatternExclude: will not remove and not copy data for tables where name starts with this pattern, default='' no tables are excluded + b. tablePatternDoNotCopy: will remove target data but not copy source for tables where name starts with this pattern, default='' all tables copied + c. writeToLapampa: writes job start/end/fail to laPampa, default=0 no laPampa functions scripted + d. serverTest: test to ensure running on sourceServer, default=1 test for sourceServer + e. scriptBigCopy: generates customizable script for copying large tables in small blocks, default=0 + + 5. execute script-builder + + 6. copy all resulting lines to new query window + + 7. review script before executing: modify as needed... + +can execute generated script, save for later use, modify to become stored procedure, use as sqlJob step, more... + +*/ + +-- REQUIRED "USE DATABASE statement: set databaseName - basis for generated script: +USE SL2007 +GO + +/* if database is ProductCompendium + then have to delete from COM_AppUser and COM_DbUser twice: 2nd time immediately before filling */ + +SET NOCOUNT ON + + + -- REQUIRED variables - MUST SET THESE VARIABLSE + DECLARE @sourceServer NVARCHAR(100) = 'PRODDB', -- set sourceServer from \ServerObjects\LinkedServers - data source + @targetServer NVARCHAR(100) = 'SWMDATASQLINT01' -- target server - where the copy MUST run + + + + -- optional variables - use carefully + DECLARE @tablePatternExclude NVARCHAR(100) = NULL, -- set tableName-Pattern NOT to delete and NOT to copy data - use VERY CAREFULLY! + @tablePatternDoNotCopy NVARCHAR(100) = NULL, -- set tableName-Pattern to delete but NOT copy data - use VERY CAREFULLY! + @writeToLapampa BIT = 1, -- if true will include logging in LaPampa + @serverTest BIT = 1, -- if true validates server + @scriptBigCopy BIT = 0, -- if true writes sql to copy big tables in small blocks + @jobDbLocal BIT = 1 -- if false adds 'PRODUCTION_DATA' as linked server for executing job procs + + + + + -- scripting variables - DO NOT CHANGE + DECLARE @databaseName NVARCHAR(100) = DB_NAME(), -- gets database name from "USE DATABASE" statement + @s CHAR(4) = ' ', -- spacer for indents (formatting) + @jobSrvr NVARCHAR(100) -- location of job db + = CASE WHEN (@jobDbLocal = 1) THEN N'' ELSE N'' END + + -- enclose dbName in [] + SET @databaseName = '[' + LTRIM(RTRIM(REPLACE(REPLACE(@databaseName, '[', ''), ']', ''))) + ']' + + -- table to hold all sql statements + DECLARE @tbl TABLE (Tbl_PK INT IDENTITY (1, 1) NOT NULL, SqlString NVARCHAR(MAX) NOT NULL, NoTab BIT NULL) + + -- add USE DATABASE to sqlTable + INSERT INTO @tbl (SqlString, NoTab) SELECT 'USE ' + @databaseName, 1 + INSERT INTO @tbl (SqlString, NoTab) SELECT 'GO', 1 + + +/* +------------------------------------------------------------------------------------------------------------------------------------- +building stop/start temporal tables here +*/ + -- table for all temporal table details + DECLARE @histTbl TABLE (DataTable NVARCHAR(256) NOT NULL, HistoryTable NVARCHAR(256) NOT NULL, + SysVerCMD NVARCHAR(256) NOT NULL, CMD VARCHAR(10), SortNr INT NOT NULL, + CmdNr INT, PRIMARY KEY (DataTable, SortNr, CmdNr)) + INSERT INTO @histTbl (DataTable, SortNr, HistoryTable, SysVerCMD, CMD, CmdNr) + SELECT + schema_name(t.schema_id) + '.' + t.name AS DataTable, sv.SortNr, + schema_name(h.schema_id) + '.' + h.name AS HistoryTable, + 'ALTER TABLE ' + schema_name(t.schema_id) + '.' + t.name + + CASE WHEN (CmdNr = 1) THEN ' SET ( SYSTEM_VERSIONING = ' + sv.SysVer + + CASE WHEN (sv.SysVer = 'OFF') THEN '' ELSE ' ( HISTORY_TABLE = ' + schema_name(h.schema_id) + '.' + h.name + ' )' END + ' )' + ELSE CASE WHEN (sv.SysVer = 'OFF') THEN ' DROP PERIOD FOR SYSTEM_TIME' ELSE ' ADD PERIOD FOR SYSTEM_TIME (ValidFromDt, ValidToDt)' END END + ';' AS SysVerCMD, + sv.SysVer AS CMD, CmdNr + FROM sys.tables t + LEFT OUTER JOIN sys.tables h ON t.history_table_id = h.object_id + CROSS JOIN ( SELECT 'OFF' AS SysVer, 1 AS SortNr UNION SELECT 'ON' AS SysVer, 2 AS SortNr ) sv + CROSS JOIN ( SELECT 1 AS CmdNr UNION SELECT 2 AS CmdNr ) sn + WHERE t.temporal_type = 2 + + -- temporal tables + IF EXISTS ( SELECT * FROM @histTbl ) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + -- start separate section for temporal tables + INSERT INTO @tbl (SqlString) SELECT '/* special section for TEMPORAL TABLES' + -- stop temporal tables: SET SYSTEM_VERSIONING = OFF + INSERT INTO @tbl (SqlString) SELECT '-- stop temporal tables: SET SYSTEM_VERSIONING = OFF' + INSERT INTO @tbl (SqlString) + SELECT SysVerCMD FROM @histTbl WHERE CMD = 'OFF' + ORDER BY DataTable, CmdNr + -- close special section for temporal tables + INSERT INTO @tbl (SqlString) SELECT 'GO' + INSERT INTO @tbl (SqlString) SELECT '*/' + INSERT INTO @tbl (SqlString) SELECT '' + END + +/* +building stop/start temporal tables here +------------------------------------------------------------------------------------------------------------------------------------- +*/ + + + -- BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString, NoTab) SELECT ' BEGIN', 1 + + -- set nocount ON + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT 'SET NOCOUNT ON' + INSERT INTO @tbl (SqlString) SELECT 'SET QUOTED_IDENTIFIER ON' + + -- job vars + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '-- script vars' + INSERT INTO @tbl (SqlString) SELECT 'DECLARE @min INT, @max INT, @step INT' + + + IF (@scriptBigCopy = 1) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '-- copy very large table in small blocks...' + INSERT INTO @tbl (SqlString) SELECT '/*' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET IDENTITY_INSERT [] ON' + INSERT INTO @tbl (SqlString) SELECT @s + '-- get min/max/step values' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET @min = ( SELECT MIN([PK]) FROM )' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET @max = ( SELECT MAX([PK]) FROM )' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET @step = 2500' + INSERT INTO @tbl (SqlString) SELECT @s + '-- for each min: insert records' + INSERT INTO @tbl (SqlString) SELECT @s + 'WHILE @min <= @max' + INSERT INTO @tbl (SqlString) SELECT @s + ' BEGIN' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'INSERT INTO ' + INSERT INTO @tbl (SqlString) SELECT @s + @s + '()' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'SELECT ' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'FROM ' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'WHERE [PK] BETWEEN @min AND @min + @step - 1' + INSERT INTO @tbl (SqlString) SELECT @s + @s + '-- set next min' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'SET @min = @min + @step' + INSERT INTO @tbl (SqlString) SELECT @s + ' END' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET IDENTITY_INSERT [] OFF' + INSERT INTO @tbl (SqlString) SELECT '*/' + END + + -- log job start + IF (@writeToLapampa = 1) + BEGIN + DECLARE @srcSrvr NVARCHAR(100) = @sourceServer--CASE WHEN (LEFT(@sourceServer, + DECLARE @trgtSrvr NVARCHAR(100) = @targetServer + DECLARE @jobName NVARCHAR(100) = REPLACE(REPLACE(@databaseName, '[', ''), ']', '') + '__copy' + '_from__' + @srcSrvr + '__to__IntDB'-- + @trgtSrvr + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '-- laPampa JobName' + INSERT INTO @tbl (SqlString) SELECT 'DECLARE @jobName NVARCHAR(100) = ''' + @jobName + '''' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '-- log job start' + INSERT INTO @tbl (SqlString) SELECT 'EXECUTE ' + @jobSrvr + 'JOB.dbo.sp_job_start @jobName, null, null, ''Started''' + END + + -- BEGIN TRY + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT 'BEGIN TRY' + -- ensure running on specified server + IF (@serverTest = 1) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- ensure run from ' + @targetServer + INSERT INTO @tbl (SqlString) SELECT @s + 'IF NOT (@@SERVERNAME = ''' + @targetServer + ''')' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'RAISERROR (''DATABASE SERVER NOT VALID! CANNOT RUN ON %s !!'', 16, 1, @@SERVERNAME)' + END + + -- ensure running on specified database + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- ensure run on database ' + @databaseName + INSERT INTO @tbl (SqlString) SELECT @s + 'IF NOT (DB_NAME() = ''' + REPLACE(REPLACE(@databaseName, '[', ''), ']', '') + ''')' + INSERT INTO @tbl (SqlString) SELECT @s + ' BEGIN' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'DECLARE @db NVARCHAR(128) = DB_NAME()' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'RAISERROR (''DATABASE NOT VALID! CANNOT RUN ON %s !!'', 16, 1, @db)' + INSERT INTO @tbl (SqlString) SELECT @s + ' END' + + + -- prep for data copy: disable triggers and constraints, stop temporal tables + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- prep for data copy: disable triggers and/or constraints here...' + + + -- table to hold all PK-FK relations EXCEPT self-refernecing relations + DECLARE @tableList TABLE (tl_PK INT IDENTITY(1, 1) NOT NULL, PkTable NVARCHAR(100), PkTableId INT, FkTable NVARCHAR(100), FkTableId INT) + INSERT INTO @tableList + (PkTable, PkTableId, FkTable, FkTableId) + SELECT + ISNULL(p.name, '') AS PkTable, + ISNULL(p.object_id, 0) AS PkTableId, + r.name AS FkTable, + r.object_id AS FkTableId + FROM sys.tables r + LEFT OUTER JOIN sys.foreign_keys f + ON r.object_id = f.parent_object_id + LEFT OUTER JOIN sys.tables p + ON f.referenced_object_id = p.object_id + AND (NOT ISNULL(p.object_id, 0) = r.object_id) + + -- table to hold all table names with relations hierarchy + DECLARE @tableMap TABLE (tm_PK INT IDENTITY(1, 1) NOT NULL, TblSchema NVARCHAR(100), TableName NVARCHAR(200), TableId INT, RelationLevel INT, IsPK BIT, HasCLR BIT) + INSERT INTO @tableMap + (TblSchema, TableName, TableId, RelationLevel, IsPK, HasCLR) + SELECT + '['+ SCHEMA_NAME(t.schema_id) + ']' AS TblSchema, + t.name AS TableName, + object_id AS TableId, + 0 AS RelationLevel, + CASE WHEN name IN ( SELECT PkTable FROM @tableList ) THEN 1 ELSE 0 END + AS IsPK, + CASE + WHEN EXISTS ( SELECT system_type_id FROM sys.columns c WHERE c.object_id = t.object_id AND system_type_id IN (240, 241) ) -- 240=CLR DataType, 241=XML + THEN 1 + ELSE 0 + END AS HasCLR + FROM sys.tables t + WHERE NOT (name IN ('sysdiagrams')) + AND NOT (name LIKE ISNULL(@tablePatternExclude, '#!#') + '%') + + -- varibles for processing + DECLARE @relLevel INT = 0, @hasRels BIT = 1 + + -- loop through all tables until no more relations are found OR reach max loop (to avoid endless looping) + WHILE @hasRels = 1 AND @relLevel < 100 + BEGIN + -- update table map with all relations that exist at current level + UPDATE @tableMap + SET RelationLevel = RelationLevel + 1 + -- where table with FK is on or below current level + WHERE TableId IN ( SELECT FkTableId FROM @tableMap tm + INNER JOIN @tableList tl ON tm.TableId = tl.FkTableId + WHERE RelationLevel <= @relLevel) + -- table with PK is on current level + AND TableId IN ( SELECT PkTableId FROM @tableMap tm + INNER JOIN @tableList tl ON tm.TableId = tl.FkTableId + WHERE RelationLevel = @relLevel) + -- if no records found for current level then set exit variable + IF @@ROWCOUNT = 0 + BEGIN + -- relations found at current level = FALSE + SET @hasRels = 0 + END + + -- move to next level + SET @relLevel = @relLevel + 1 + END + + -- table to hold all where clauses for referential integrety + DECLARE @tableFKs TABLE (TableName NVARCHAR(100), FkNr INT, SqlText NVARCHAR(1000)) + INSERT INTO @tableFKs (TableName, FkNr, SqlText) + SELECT FkTbl AS TableName, FkNr, Whr AS SqlText + FROM + ( SELECT + ROW_NUMBER() OVER(PARTITION BY ft.name ORDER BY fk.parent_column_id) AS FkNr, + f.name AS FkConstraint, + CASE WHEN ((ROW_NUMBER() OVER(PARTITION BY ft.name ORDER BY fk.parent_column_id)) = 1) THEN 'WHERE ' ELSE ' AND ' END + + '[' + fc.name + '] IN ( SELECT [' + pc.name + '] FROM [' + ps.name + '].[' + pt.name + '] )' + AS Whr, + ft.name AS FkTbl, + fc.name AS FkCol, + fc.column_id AS FkColId, + pt.name AS PkTbl, + pc.name AS PkCol, + pc.column_id AS PkColId + FROM sys.tables ft + INNER JOIN sys.foreign_key_columns fk + ON ft.object_id = fk.parent_object_id + INNER JOIN sys.foreign_keys f + ON fk.constraint_object_id = f.object_id + INNER JOIN sys.columns fc + ON fk.parent_object_id = fc.object_id + AND fk.parent_column_id = fc.column_id + AND fc.is_nullable = 0 + INNER JOIN sys.tables pt + ON fk.referenced_object_id = pt.object_id + AND NOT (ft.name = pt.name) -- remove self-referencing foreign-keys + INNER JOIN sys.schemas ps + ON pt.schema_id = ps.schema_id + INNER JOIN sys.columns pc + ON fk.referenced_object_id = pc.object_id + AND fk.referenced_column_id = pc.column_id + ) fk + + -- start delete section + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- remove data from all tables' + + -- script all truncates + INSERT INTO @tbl (SqlString) + SELECT @s + SqlStr + FROM + ( + -- truncates... + SELECT + 'TRUNCATE TABLE ' + tm.TblSchema + '.[' + TableName + ']' + AS SqlStr, + TableName AS TableName, + RelationLevel AS RelationLevel, + 1 AS SqlOrder + FROM @tableMap tm + LEFT OUTER JOIN + ( + SELECT + object_id AS TableId, + MAX(CAST(is_identity AS INT)) + AS HasIdent + FROM sys.columns + GROUP BY object_id + ) ci + ON tm.TableId = ci.TableId + WHERE ISNULL(IsPK, 0) = 0 + -- truncates... + ) delSql + ORDER BY RelationLevel ASC, TableName, SqlOrder + + -- script all deletes - with dbcc checkident when needed + INSERT INTO @tbl (SqlString) + SELECT @s + SqlStr + FROM + ( + -- delete from... + SELECT + 'DELETE FROM ' + tm.TblSchema + '.[' + TableName + ']' + AS SqlStr, + '[' + TableName + ']' AS TableName, + RelationLevel AS RelationLevel, + 2 AS SqlOrder + FROM @tableMap tm + LEFT OUTER JOIN + ( + SELECT + object_id AS TableId, + MAX(CAST(is_identity AS INT)) + AS HasIdent + FROM sys.columns + GROUP BY object_id + ) ci + ON tm.TableId = ci.TableId + WHERE ISNULL(IsPK, 0) = 1 + -- delete from... + UNION ALL + -- dbcc checkident... + SELECT + CASE + WHEN (ISNULL(HasIdent, 0) = 1 AND ISNULL(IsPK, 0) = 1) + THEN 'DBCC CHECKIDENT (''' + TblSchema + '.' + TableName + ''', RESEED, 0) WITH NO_INFOMSGS' + ELSE '-- Delete this line before executing script! --' + END AS SqlStr, + '[' + TableName + ']' AS TableName, + RelationLevel AS RelationLevel, + 3 AS SqlOrder + FROM @tableMap tm + LEFT OUTER JOIN + ( + SELECT + object_id AS TableId, + MAX(CAST(is_identity AS INT)) + AS HasIdent + FROM sys.columns + GROUP BY object_id + ) ci + ON tm.TableId = ci.TableId + WHERE ISNULL(IsPK, 0) = 1 + -- dbcc checkident... + UNION ALL + -- blank line... + SELECT + '' AS SqlStr, + '[' + TableName + ']' AS TableName, + RelationLevel AS RelationLevel, + 1 AS SqlOrder + FROM @tableMap tm + WHERE ISNULL(IsPK, 0) = 1 + -- blank line... + ) delSql + ORDER BY RelationLevel ASC, TableName, SqlOrder + + -- end delete section + INSERT INTO @tbl (SqlString) SELECT @s + '-- remove data from all tables' + + + -- start insert section + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- fill all tables from ' + @sourceServer + + + -- vars for insert into table... + DECLARE @tblSchema NVARCHAR(100), @tblName NVARCHAR(100), @colList NVARCHAR(MAX), @hasIdent BIT, @hasCLR BIT + DECLARE @cur CURSOR + + + -- insert into tables... + DECLARE @curCount INT = 0 + SET @cur = CURSOR FAST_FORWARD FOR + SELECT + TblSchema, TblName, LEFT(ColumnList, LEN(ColumnList) -1) AS ColumnList, HasIdent, HasCLR + FROM + ( SELECT TblSchema, '[' + t.name + ']' AS TblName, tm.RelationLevel AS TableOrder, + ( SELECT '[' + name + '],' 'data()' FROM sys.columns c + WHERE t.object_id = c.object_id AND NOT (c.is_computed = 1) AND NOT (c.system_type_id = 189) /*not timestamp*/ + ORDER BY column_id FOR XML PATH('') ) AS ColumnList, + ISNULL(( SELECT MAX(CAST(is_identity AS INT)) FROM sys.columns ci WHERE t.object_id = ci.object_id ), 0) AS HasIdent, + ISNULL(HasCLR, 0) AS HasCLR + FROM @tableMap tm + INNER JOIN sys.tables t ON tm.TableId = t.object_id ) tc + WHERE NOT (REPLACE(TblName, '[', '') LIKE (ISNULL(@tablePatternDoNotCopy, '#!#') + '%')) + ORDER BY TableOrder DESC, TblName + OPEN @cur + FETCH NEXT FROM @cur INTO @tblSchema, @tblName, @colList, @hasIdent, @hasCLR + WHILE @@FETCH_STATUS = 0 + BEGIN + -- increment cursor loop counter + SET @curCount = @curCount + 1 + + -- two blank lines between tables - except for first time + IF (NOT (@curCount = 1)) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + END + + -- set table name + INSERT INTO @tbl (SqlString) SELECT @s + '-- ' + @tblName + -- set insIdent on + IF @hasIdent = 1 + BEGIN + INSERT INTO @tbl (SqlString) + SELECT @s + 'SET IDENTITY_INSERT ' + @tblSchema + '.' + @tblName + ' ON' + END + + -- set insert into table + INSERT INTO @tbl (SqlString) + SELECT @s + 'INSERT INTO ' + @tblSchema + '.' + @tblName + + -- set columns to insert + INSERT INTO @tbl (SqlString) + SELECT @s + @s + '(' + @colList + ')' + + -- set columns for select + INSERT INTO @tbl (SqlString) + SELECT @s + @s + 'SELECT ' + @colList + + -- if not HasCLR then use normal FROM statement else use pass-through query + IF @hasCLR = 0 + BEGIN + -- does NOT use CLR type + -- set From statement + INSERT INTO @tbl (SqlString) + SELECT @s + @s + 'FROM ' + @sourceServer + '.' + @databaseName + '.' + @tblSchema + '.' + @tblName + END + ELSE + BEGIN + -- uses CLR type + -- set pass-through From statement + INSERT INTO @tbl (SqlString) + SELECT @s + @s + 'FROM OPENQUERY(' + @sourceServer + ', ''SELECT ' + @colList + ' FROM ' + @databaseName + '.' + @tblSchema + '.' + @tblName + ''')' + END + + -- has foreign-key + IF EXISTS ( SELECT * FROM @tableFKs WHERE LTRIM(RTRIM(REPLACE(REPLACE(TableName, '[', ''), ']', ''))) =LTRIM(RTRIM(REPLACE(REPLACE( @tblName, '[', ''), ']', ''))) ) + BEGIN + INSERT INTO @tbl (SqlString) + SELECT @s + @s + SqlText FROM @tableFKs + WHERE LTRIM(RTRIM(REPLACE(REPLACE(TableName, '[', ''), ']', ''))) = LTRIM(RTRIM(REPLACE(REPLACE(@tblName, '[', ''), ']', ''))) + ORDER BY FkNr ASC + END + + -- set insIdent off + IF @hasIdent = 1 + BEGIN + INSERT INTO @tbl (SqlString) + SELECT @s + 'SET IDENTITY_INSERT ' + @tblSchema + '.' + @tblName + ' OFF' + END + + FETCH NEXT FROM @cur INTO @tblSchema, @tblName, @colList, @hasIdent, @hasCLR + END + CLOSE @cur + DEALLOCATE @cur + + + -- end insert section + INSERT INTO @tbl (SqlString) SELECT @s + '-- fill all tables from ' + @sourceServer + + + -- cleanup for data copy: enable triggers and constraints, stop temporal tables + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- cleanup after data copy: enable triggers, constraints and/or temporal tables here...' + + -- temporal tables + IF EXISTS ( SELECT * FROM @histTbl ) + BEGIN + -- spacing + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + -- start temporal tables: SET SYSTEM_VERSIONING = ON + INSERT INTO @tbl (SqlString) SELECT '-- start temporal tables: SET SYSTEM_VERSIONING = ON, ADD PERIOD FOR SYSTEM_TIME' + INSERT INTO @tbl (SqlString) + SELECT SysVerCMD FROM @histTbl WHERE CMD = 'ON' + ORDER BY DataTable, CmdNr DESC + -- set GO + INSERT INTO @tbl (SqlString) SELECT 'GO' + END + + + -- log job end - successful + IF (@writeToLapampa = 1) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT ' -- log job end - successful' + INSERT INTO @tbl (SqlString) SELECT ' EXECUTE ' + @jobSrvr + 'JOB.dbo.sp_job_end @jobName, ''Finished successfully''' + END + + -- add END TRY, BEGIN/END CATCH & RetrhowError statements + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT 'END TRY' + -- END TRY + + + -- BEGIN CATCH + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT 'BEGIN CATCH' + + -- rethrow error + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- rethrow error' + INSERT INTO @tbl (SqlString) SELECT @s + 'EXECUTE [master].dbo.sp_RethrowError' + + + -- log error in laPampa + IF (@writeToLapampa = 1) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- -- get error message' + INSERT INTO @tbl (SqlString) SELECT @s + 'DECLARE @err VARCHAR(2000) = CAST(ERROR_MESSAGE() AS VARCHAR(2000))' + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- -- log job failed' + INSERT INTO @tbl (SqlString) SELECT @s + 'EXECUTE ' + @jobSrvr + 'JOB.dbo.sp_job_fail @jobName, @err' + END + + + -- ensure identity insert is OFF for all tables + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- ensure that IdentityInsert is OFF for all tables' + INSERT INTO @tbl (SqlString) SELECT @s + 'DECLARE @cur CURSOR, @sql NVARCHAR(100)' + INSERT INTO @tbl (SqlString) SELECT @s + 'SET @cur = CURSOR FAST_FORWARD FOR' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'SELECT ''SET IDENTITY_INSERT ['' + name + ''] OFF''' + INSERT INTO @tbl (SqlString) SELECT @s + 'FROM sys.tables' + INSERT INTO @tbl (SqlString) SELECT @s + 'WHERE OBJECTPROPERTY (OBJECT_ID(name),''TableHasIdentity'') = 1' + INSERT INTO @tbl (SqlString) SELECT @s + 'OPEN @cur' + INSERT INTO @tbl (SqlString) SELECT @s + 'FETCH NEXT FROM @cur INTO @sql' + INSERT INTO @tbl (SqlString) SELECT @s + 'WHILE @@FETCH_STATUS = 0' + INSERT INTO @tbl (SqlString) SELECT @s + ' BEGIN' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'EXECUTE (@sql)' + INSERT INTO @tbl (SqlString) SELECT @s + @s + 'FETCH NEXT FROM @cur INTO @sql' + INSERT INTO @tbl (SqlString) SELECT @s + ' END' + INSERT INTO @tbl (SqlString) SELECT @s + 'CLOSE @cur' + INSERT INTO @tbl (SqlString) SELECT @s + 'DEALLOCATE @cur' + + + -- cleanup for data copy: enable triggers and constraints, start temporal tables + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT @s + '-- cleanup after error: enable triggers, constraints and/or temporal tables here...' + + -- temporal tables + IF EXISTS ( SELECT * FROM @histTbl ) + BEGIN + -- start temporal tables: SET SYSTEM_VERSIONING = ON + INSERT INTO @tbl (SqlString) SELECT '-- start temporal tables: SET SYSTEM_VERSIONING = ON, ADD PERIOD FOR SYSTEM_TIME' + INSERT INTO @tbl (SqlString) + SELECT SysVerCMD FROM @histTbl WHERE CMD = 'ON' + ORDER BY DataTable, CmdNr DESC + END + + + -- end catch + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString) SELECT 'END CATCH' + -- END CATCH + + -- END / GO + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString, NoTab) SELECT ' END', 1 + INSERT INTO @tbl (SqlString, NoTab) SELECT 'GO', 1 + + + -- temporal tables + IF EXISTS ( SELECT * FROM @histTbl ) + BEGIN + INSERT INTO @tbl (SqlString) SELECT '' + -- start separate section for temporal tables + INSERT INTO @tbl (SqlString) SELECT '/* special section for TEMPORAL TABLES' + -- start temporal tables: SET SYSTEM_VERSIONING = ON, ADD PERIOD FOR SYSTEM_TIME + INSERT INTO @tbl (SqlString) SELECT '-- start temporal tables: SET SYSTEM_VERSIONING = ON, ADD PERIOD FOR SYSTEM_TIME' + INSERT INTO @tbl (SqlString) + SELECT SysVerCMD FROM @histTbl WHERE CMD = 'ON' + ORDER BY DataTable, CmdNr DESC + -- close special section for temporal tables + INSERT INTO @tbl (SqlString) SELECT 'GO' + INSERT INTO @tbl (SqlString) SELECT '*/' + INSERT INTO @tbl (SqlString) SELECT '' + END + + + -- lines for file save + INSERT INTO @tbl (SqlString) SELECT '' + INSERT INTO @tbl (SqlString, NoTab) SELECT '/*', 1 + INSERT INTO @tbl (SqlString, NoTab) SELECT 'DataCopy__' + REPLACE(REPLACE(@databaseName, '[', ''), ']', '') + '__from__' + @sourceServer, 1 + INSERT INTO @tbl (SqlString, NoTab) SELECT '*/', 1 + INSERT INTO @tbl (SqlString) SELECT '' + + + -- remove lines to be deleted + DELETE FROM @tbl WHERE SqlString = 'Delete this line before executing script!' + + -- return all SQL strings + SELECT RTRIM(CASE WHEN (ISNULL(NoTab, 0) = 0) THEN ' ' ELSE '' END + SqlString) FROM @tbl + WHERE NOT (SqlString LIKE '%-- Delete this line%') + ORDER BY Tbl_PK + diff --git a/paul_snippets/Admin/Snapshot_DropCreate.sql b/paul_snippets/Admin/Snapshot_DropCreate.sql new file mode 100644 index 0000000..c43e683 --- /dev/null +++ b/paul_snippets/Admin/Snapshot_DropCreate.sql @@ -0,0 +1,27 @@ +USE [master] +GO + + +BEGIN TRY + +DECLARE @debug INT = 0 + +SELECT @@SERVERNAME AS 'DbServer' + + +/* select 'dropCreateScript' for desired snapshot, copy into new window, change 1 to 0, run */ + +SELECT @@SERVERNAME AS 'DbServer', s.name AS 'SnapShot', s.database_id AS SN_Id, d.name AS 'Source_Database', d.database_id AS DB_Id, s.create_date, +'EXECUTE [master].dbo.p_DbTool__ReCreate_Snapshot ' + CAST(@debug AS VARCHAR(1)) + ', '''+ d.name + ''', ''' + s.name + ''';' AS ReCreateScript, +'EXECUTE [master].dbo.p_DbTool__Drop_Snapshot ' + CAST(@debug AS VARCHAR(1)) + ', ''' + s.name + ''';' AS DropScript +FROM sys.databases s +INNER JOIN sys.databases d ON d.database_id = s.source_database_id WHERE NOT (s.source_database_id IS NULL) --ORDER BY s.name +ORDER BY @@SERVERNAME, REPLACE(REPLACE(d.name, '__00', ''), '__01', ''), s.name + +END TRY + + +BEGIN CATCH + EXECUTE [master].dbo.sp_RethrowError +END CATCH + diff --git a/paul_snippets/CreateStuff/Create Table Code with Descr.sql b/paul_snippets/CreateStuff/Create Table Code with Descr.sql new file mode 100644 index 0000000..6f76c26 --- /dev/null +++ b/paul_snippets/CreateStuff/Create Table Code with Descr.sql @@ -0,0 +1,133 @@ +USE +GO + +-- drop both CodeDes and Code tables +IF OBJECT_ID('_Des', 'U') IS NOT NULL + BEGIN + DROP TABLE _Des + END +GO + +IF OBJECT_ID('_', 'U') IS NOT NULL + BEGIN + DROP TABLE _ + END +GO + +-- ** CODE TABLE ** -- +-- create Code table +CREATE TABLE _ + ( + _PK int IDENTITY(1,1) NOT NULL, + Code nvarchar(x) NOT NULL, + Sort int NOT NULL, + IsActive bit NOT NULL, + + Db_Status nvarchar(1) NOT NULL, + Db_InsDt smalldatetime NOT NULL, + Db_InsUser nvarchar(50) NOT NULL, + Db_UpdDt smalldatetime NULL, + Db_UpdUser nvarchar(50) NULL, + Db_Timestamp timestamp NOT NULL, + + CONSTRAINT PK__ PRIMARY KEY CLUSTERED(_PK ASC) + ) +GO + +-- define update trigger +CREATE TRIGGER ut__ ON _ AFTER UPDATE +AS + BEGIN + UPDATE _ + SET Db_UpdDt = getdate(), + Db_UpdUser = right(suser_sname(), 50), + Db_Status = CASE WHEN isnull(i.Db_Status, '') = 'D' THEN 'D' ELSE 'U' END + FROM inserted i + WHERE _._PK = i._PK + END +GO + +-- set unique index on Code +CREATE UNIQUE NONCLUSTERED INDEX IX____Unique_Code ON _ (Code ASC) +GO + +-- set default-value constraints +ALTER TABLE _ ADD + CONSTRAINT DF___IsActive + DEFAULT ((1)) FOR IsActive + +ALTER TABLE _ ADD + CONSTRAINT DF___DbStatus + DEFAULT ('I') FOR Db_Status + +ALTER TABLE _ ADD + CONSTRAINT DF___DbInsDt + DEFAULT (getdate()) FOR Db_InsDt + +ALTER TABLE _ ADD + CONSTRAINT DF___DbInsUser + DEFAULT (right(suser_sname(),(50))) FOR Db_InsUser +GO +-- ** CODE TABLE ** -- + + + +-- ** DESCRIPTION TABLE ** -- +-- create CodeDes table +CREATE TABLE _Des + ( + Des_PK int IDENTITY(1,1) NOT NULL, + _FK int NOT NULL, + Lang nvarchar(2) NOT NULL, + Descr nvarchar(max) NULL, + + Db_Status nvarchar(1) NOT NULL, + Db_InsDt smalldatetime NOT NULL, + Db_InsUser nvarchar(50) NOT NULL, + Db_UpdDt smalldatetime NULL, + Db_UpdUser nvarchar(50) NULL, + Db_Timestamp timestamp NOT NULL, + + CONSTRAINT PK__Des PRIMARY KEY CLUSTERED(Des_PK ASC) + ) +GO + +-- define update trigger +CREATE TRIGGER ut__Des ON _Des AFTER UPDATE +AS + BEGIN + UPDATE _Des + SET Db_UpdDt = getdate(), + Db_UpdUser = right(suser_sname(), 50), + Db_Status = CASE WHEN isnull(i.Db_Status, '') = 'D' THEN 'D' ELSE 'U' END + FROM inserted i + WHERE _Des.Des_PK = i.Des_PK + END +GO + +-- set default-value constraints +ALTER TABLE _Des ADD + CONSTRAINT DF__Des_DbStatus + DEFAULT ('I') FOR Db_Status + +ALTER TABLE _Des ADD + CONSTRAINT DF__Des_DbInsDt + DEFAULT (getdate()) FOR Db_InsDt + +ALTER TABLE _Des ADD + CONSTRAINT DF__Des_DbInsUser + DEFAULT (right(suser_sname(),(50))) FOR Db_InsUser +GO + +-- set foreign-key constraints +ALTER TABLE _Des WITH CHECK ADD + CONSTRAINT FK__Des___ + FOREIGN KEY(_FK) +REFERENCES _ (_PK) + +ALTER TABLE _Des + CHECK CONSTRAINT FK__Des___ +GO + +-- ** DESCRIPTION TABLE ** -- + diff --git a/paul_snippets/CreateStuff/generic ut_trigger.sql b/paul_snippets/CreateStuff/generic ut_trigger.sql new file mode 100644 index 0000000..310143a --- /dev/null +++ b/paul_snippets/CreateStuff/generic ut_trigger.sql @@ -0,0 +1,24 @@ +USE Product__Work +GO +-- SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS TblNr FROM sys.tables WHERE name LIKE 'DocumedisCache%' ORDER BY Name + +-- create PK +ALTER TABLE dbo. + ADD CONSTRAINT PK_ PRIMARY KEY CLUSTERED + ( ASC) ON [DATA] +GO + +-- define update trigger +CREATE TRIGGER ut_ ON dbo. AFTER UPDATE +AS + BEGIN + UPDATE dbo. + SET Db_UpdDt = GETDATE(), + Db_UpdUser = RIGHT(SUSER_SNAME(), 50) + FROM inserted i + WHERE .IdPk = i.IdPk + AND + END +GO + + diff --git a/paul_snippets/DataLists/IndexViewer_List.sql b/paul_snippets/DataLists/IndexViewer_List.sql new file mode 100644 index 0000000..9b29ea4 --- /dev/null +++ b/paul_snippets/DataLists/IndexViewer_List.sql @@ -0,0 +1,10 @@ +USE Index_Viewer +GO + +DECLARE @x VARCHAR(20) = 'insureINDEX' +DECLARE @bt NVARCHAR(50) = 'Daily' + +SELECT * +FROM dbo.v_ARTICLE___ART +WHERE XmlIndex = @x AND BatchType = @bt + diff --git a/paul_snippets/DataLists/List from Excel.sql b/paul_snippets/DataLists/List from Excel.sql new file mode 100644 index 0000000..494300e --- /dev/null +++ b/paul_snippets/DataLists/List from Excel.sql @@ -0,0 +1,16 @@ +USE Product_Superset +GO + +DECLARE @dir NVARCHAR(256) = N'D:\DATA\IMPORT_DATA\RedApp2_Imports' +DECLARE @file NVARCHAR(100) = N'Abena Import.xlsx' +DECLARE @tab NVARCHAR(100) = N'Tabelle1' + +DECLARE @dir_file NVARCHAR(256) = N'''Data Source="' + @dir + N'\' + @file+ N'"; Extended properties=Excel 12.0'')...[' + @tab + N'$]' +SELECT N'SELECT TOP 3 * /* column list goes here*/ FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.12.0'', ' + @dir_file AS Select_From_Excel + +--SELECT TOP 3 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', @dir_file)...[Tabelle1$] +--'Data Source="D:\DATA\IMPORT_DATA\RedApp2_Imports\Abena Import.xlsx"; Extended properties=Excel 12.0' +--'Data Source="D:\DATA\IMPORT_DATA\RedApp2_Imports\Abena Import.xlsx"; Extended properties=Excel 12.0')...[$] +--FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source="D:\DATA\IMPORT_DATA\RedApp2_Imports\Abena Import.xlsx"; Extended properties=Excel 12.0')...[$] + +--SELECT TOP 3 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source="D:\DATA\IMPORT_DATA\RedApp2_Imports\Abena Import.xlsx"; Extended properties=Excel 12.0')...[Tabelle1$] \ No newline at end of file diff --git a/paul_snippets/DataLists/varTbl List.sql b/paul_snippets/DataLists/varTbl List.sql new file mode 100644 index 0000000..9256610 --- /dev/null +++ b/paul_snippets/DataLists/varTbl List.sql @@ -0,0 +1,11 @@ +USE Product_Superset +GO + +DECLARE @tbl TABLE (Pharmacode INT PRIMARY KEY) +INSERT INTO @tbl (Pharmacode) +VALUES +(0 -- Pharmacode - int + ) + +-- = "('" & A2 & "'), " +-- = "(" & A2 & "), " diff --git a/paul_snippets/ProductionChecks/QuarantineItems_Times.sql b/paul_snippets/ProductionChecks/QuarantineItems_Times.sql new file mode 100644 index 0000000..ab5b4ef --- /dev/null +++ b/paul_snippets/ProductionChecks/QuarantineItems_Times.sql @@ -0,0 +1,21 @@ +USE SwissIndex_Products_Work +GO + +DECLARE @t TABLE (ItemType VARCHAR(100), IndexCode INT, Dt DATETIME, INDEX IxDt (Dt)) +INSERT INTO @t (ItemType, IndexCode, Dt) +SELECT ItemType, IndexCode, Dt +FROM ( +SELECT ItemType, 128 AS IndexCode, MIN(Db_InsDT) AS Dt +FROM dbo.QuarantineItems +WHERE NOT ItemType = 'ARTICLE' +GROUP BY ItemType +UNION ALL +SELECT ItemType, IndexCode, MIN(Db_InsDT) AS Dt +FROM dbo.QuarantineItems +WHERE ItemType = 'ARTICLE' +GROUP BY ItemType, IndexCode +) g + +SELECT * FROM @t +ORDER BY Dt + diff --git a/paul_snippets/RedApp/Fix Price Problems.sql b/paul_snippets/RedApp/Fix Price Problems.sql new file mode 100644 index 0000000..efdd8fc --- /dev/null +++ b/paul_snippets/RedApp/Fix Price Problems.sql @@ -0,0 +1,23 @@ +USE ProductCompendium +GO + +DECLARE @phar INT = 2759829 +DECLARE @coNr INT = 13368 +DECLARE @priTyp NVARCHAR(6) = N'PGRO' + +SELECT * FROM dbo.ART_Art WHERE Pharmacode = @phar +SELECT * FROM dbo.PA_Pa WHERE CompanyNr = @coNr +SELECT * FROM dbo.ART_CoPri WHERE Code = @priTyp + +DECLARE @artPK INT = ( SELECT Art_PK FROM ART_Art WHERE Pharmacode = @phar ) +DECLARE @coPK INT = ( SELECT Pa_PK FROM dbo.PA_Pa WHERE CompanyNr = @coNr ) +DECLARE @ptPK TINYINT = ( SELECT CoPri_PK FROM dbo.ART_CoPri WHERE Code = @priTyp ) + +SELECT ArtPri_PK, Art_FK, Pa_FK, CoPri_FK, FromDate, ToDate, Price, WithdrawnDate, Db_Status, Db_InsDt, Db_UpdDt, DATEADD(MINUTE, -1, FromDate) AS CouldBeToDate +FROM dbo.ART_ArtPri +WHERE Art_FK = @artPK AND Pa_FK = @coPK AND CoPri_FK = @ptPK + +DECLARE @apPK INT = 0 +DECLARE @td VARCHAR(100) = '' + +SELECT ' UPDATE ART_ArtPri SET ToDate = ''' + @td + ''' WHERE ArtPri_PK = ' + CAST(@apPK AS VARCHAR(10)) \ No newline at end of file diff --git a/paul_snippets/RedApp/Link_RP_with_LIE.sql b/paul_snippets/RedApp/Link_RP_with_LIE.sql new file mode 100644 index 0000000..29ad5df --- /dev/null +++ b/paul_snippets/RedApp/Link_RP_with_LIE.sql @@ -0,0 +1,87 @@ +USE RedApp +GO + +BEGIN TRY + +/* set RP, LinkType and LIE values here */ +-- RP company number +DECLARE @rp INT = __RP_Nr__ +DECLARE @rpKey INT = ( SELECT rp.Pa_PK FROM PA_Pa rp WHERE rp.CompanyNr = @rp ) + +-- LinkType code +DECLARE @typ NVARCHAR(20) = 'RP_to_LIE' +DECLARE @typKey INT = ( SELECT CoLink_PK FROM PA_CoLink WHERE Code = @typ ) + +-- LIE company number +DECLARE @lie INT = __LIE_Nr__ +DECLARE @lieKey INT = ( SELECT lie.Pa_PK FROM PA_Pa lie WHERE lie.CompanyNr = @lie ) + +--DECLARE @parent INT = 0 + +-- error vars +DECLARE @err NVARCHAR(MAX) = '' +DECLARE @errFound BIT = 0 + +/* validation on values provided */ +-- RP exists +IF (@rpKey IS NULL) + BEGIN + SET @err = 'RechnungsPartner with CompanyNr ' + CAST(@rp AS varchar(10)) + ' does NOT exist - cannot continue' + SET @errFound = 1 + END + +-- LinkType exists +IF (@typKey IS NULL) + BEGIN + SET @err = ISNULL(' | ' + @err, '') + 'Partner LinkType ' + @typ + ' does NOT exist - cannot continue' + SET @errFound = 1 + END + +-- LIE exists +IF (@lieKey IS NULL) + BEGIN + SET @err = ISNULL(' | ' + @err, '') + 'Lieferant with CompanyNr ' + CAST(@rp AS varchar(10)) + ' does NOT exist - cannot continue' + SET @errFound = 1 + END + +-- if error found then throw error +IF (@errFound = 1) + BEGIN + RAISERROR (@err, 16, 1) + END + +-- show possible values +SELECT @rp AS RP, @rpKey AS RP_Key, rp.ShortName AS RP_Name, @typ AS LinkType, + @lie AS LIE, lie.Pa_PK AS LIE_Key, lie.ShortName AS LIE_Name +FROM PA_Pa rp +CROSS JOIN PA_Pa lie +WHERE rp.Pa_PK = @rpKey AND lie.Pa_PK = @lieKey + +BEGIN TRANSACTION + +-- show current data +SELECT 'BEFORE' AS Stat, PaLink_PK, Pa_FK, @rp AS RP_CompanyNr, CoLink_FK, @typ AS LinkType, Linked_Pa_FK, @lie AS LIE_CompanyNr, Db_Status, Db_InsDt, Db_InsUser, Db_UpdDt, Db_UpdUser +FROM PA_PaLink +WHERE Pa_FK = @rpKey OR Linked_Pa_FK = @lieKey + +-- insert into PA_PaLink +INSERT INTO PA_PaLink (Pa_FK, CoLink_FK, Linked_Pa_FK) +SELECT @rpKey AS Pa_FK, @typKey AS CoLink_FK, @lieKey AS Linked_Pa_FK + +-- show results after insert +SELECT 'AFTER' as Stat, PaLink_PK, Pa_FK, @rp AS RP_CompanyNr, CoLink_FK, @typ AS LinkType, Linked_Pa_FK, @lie AS LIE_CompanyNr, Db_Status, Db_InsDt, Db_InsUser, Db_UpdDt, Db_UpdUser +FROM PA_PaLink +WHERE Pa_FK = @rpKey OR Linked_Pa_FK = @lieKey + + +-- +ROLLBACK TRANSACTION +-- COMMIT TRANSACTION + +--SELECT * FROM PA_Pa WHERE Parent_Pa_FK = ( SELECT Pa_PK FROM PA_Pa WHERE CompanyNr = @parent ) ORDER BY CompanyNr + +END TRY + +BEGIN CATCH +EXECUTE [master].dbo.sp_RethrowError +END CATCH diff --git a/paul_snippets/superset/processing/Superset table.sql b/paul_snippets/superset/processing/Superset table.sql new file mode 100644 index 0000000..5f97e72 --- /dev/null +++ b/paul_snippets/superset/processing/Superset table.sql @@ -0,0 +1,45 @@ +USE +GO + +/* +*/ + +-- drop table +IF OBJECT_ID('', 'U') IS NOT NULL + BEGIN + DROP TABLE + END +GO + +-- create table +CREATE TABLE + ( + int NOT NULL, + + Nvar nvarchar(x) NOT NULL, + Inte int NOT NULL, + + Db_InsDt smalldatetime NOT NULL CONSTRAINT DF__DbInsDt DEFAULT (getdate()), + Db_InsUser nvarchar(50) NOT NULL CONSTRAINT DF__DbInsUser DEFAULT (right(suser_sname(),(50))), + Db_UpdDt smalldatetime NULL, + Db_UpdUser nvarchar(50) NULL, + + CONSTRAINT PK_ PRIMARY KEY CLUSTERED( ASC) + ) +GO + +-- define update trigger +CREATE TRIGGER ut_ ON AFTER UPDATE +AS + BEGIN + UPDATE + SET Db_UpdDt = getdate(), + Db_UpdUser = right(suser_sname(), 50) + FROM inserted i + WHERE . = i. + END +GO + +-- set unique index on Code +CREATE UNIQUE NONCLUSTERED INDEX IX___Unique_Code ON () +GO diff --git a/paul_snippets/superset/processing/generic table.sql b/paul_snippets/superset/processing/generic table.sql new file mode 100644 index 0000000..4141951 --- /dev/null +++ b/paul_snippets/superset/processing/generic table.sql @@ -0,0 +1,58 @@ +USE +GO + +/* +*/ + +-- drop table +IF OBJECT_ID('_', 'U') IS NOT NULL + BEGIN + DROP TABLE dbo._ + END +GO + +-- create table +CREATE TABLE dbo._ + ( + ID int IDENTITY(1,1) NOT NULL, + -- ID INT NOT NULL, + Nvar nvarchar(x) NOT NULL, + Inte int NOT NULL, + + Db_InsDt smalldatetime NOT NULL CONSTRAINT DF___DbInsDt DEFAULT (getdate()), + Db_InsUser nvarchar(50) NOT NULL CONSTRAINT DF___DbInsUser DEFAULT (right(suser_sname(),(50))), + Db_UpdDt smalldatetime NULL, + Db_UpdUser nvarchar(50) NULL, + + CONSTRAINT PK__ PRIMARY KEY CLUSTERED(ID ASC) + ) +GO + +-- define update trigger +CREATE TRIGGER ut__ ON _ AFTER UPDATE +AS + BEGIN + UPDATE _ + SET Db_UpdDt = getdate(), + Db_UpdUser = right(suser_sname(), 50) + FROM inserted i + WHERE _.ID = i.ID + END +GO + +-- set unique index on Code +CREATE UNIQUE NONCLUSTERED INDEX IX____Unique_Code ON _ (ID) +GO + +/* +-- set foreign-key constraints +ALTER TABLE _ WITH CHECK ADD + CONSTRAINT FK_____ + FOREIGN KEY(ID) +REFERENCES _ (ID) + +ALTER TABLE _ + CHECK CONSTRAINT FK_____ +GO + +*/ diff --git a/paul_snippets/test.sql b/paul_snippets/test.sql new file mode 100644 index 0000000..5e8f0f2 --- /dev/null +++ b/paul_snippets/test.sql @@ -0,0 +1,46 @@ +-- drop both CodeDes and Code tables +IF OBJECT_ID('_Des', 'U') IS NOT NULL + BEGIN + DROP TABLE _Des + END +GO + +IF OBJECT_ID('_', 'U') IS NOT NULL + BEGIN + DROP TABLE _ + END +GO + +-- ** CODE TABLE ** -- +-- create Code table +CREATE TABLE _ + ( + _PK int IDENTITY(1,1) NOT NULL, + Code nvarchar(x) NOT NULL, + Sort int NOT NULL, + IsActive bit NOT NULL, + + Db_Status nvarchar(1) NOT NULL, + Db_InsDt smalldatetime NOT NULL, + Db_InsUser nvarchar(50) NOT NULL, + Db_UpdDt smalldatetime NULL, + Db_UpdUser nvarchar(50) NULL, + Db_Timestamp timestamp NOT NULL, + + CONSTRAINT PK__ PRIMARY KEY CLUSTERED(_PK ASC) + ) +GO + +-- define update trigger +CREATE TRIGGER ut__ ON _ AFTER UPDATE +AS + BEGIN + UPDATE _ + SET Db_UpdDt = getdate(), + Db_UpdUser = right(suser_sname(), 50), + Db_Status = CASE WHEN isnull(i.Db_Status, '') = 'D' THEN 'D' ELSE 'U' END + FROM inserted i + WHERE _._PK = i._PK + END +GO +