From 6756c92e88226dd2153378d110f29c82d06c6215 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 21 Nov 2017 12:19:09 +1100 Subject: [PATCH 01/17] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 78b9d10..c0f4cc6 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ # SQL Server Scripts Various scripts I use for SQL Server +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © 2017 Anthony Duguid") + ## General Database Scripts * [Check Index Fragmentation](SSDB.Check_Index_Fragmentation.sql) * [Database Backup](SSDB.Restore_Database_Backup.sql) From 0b2c531076025ccb9350875e468d8f00dde5de41 Mon Sep 17 00:00:00 2001 From: Anthony Date: Fri, 24 Nov 2017 14:11:07 +1100 Subject: [PATCH 02/17] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c0f4cc6..52a76f1 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Various scripts I use for SQL Server [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © 2017 Anthony Duguid") +![current_build SQL_SERVER_2016](https://img.shields.io/badge/current_build-SQL_SERVER_2016-red.svg) ## General Database Scripts * [Check Index Fragmentation](SSDB.Check_Index_Fragmentation.sql) From 4248fa201be09cfaa66eda512e79f052fb4afa41 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 2 Jan 2018 10:22:47 +1100 Subject: [PATCH 03/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52a76f1..374effe 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # SQL Server Scripts Various scripts I use for SQL Server -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © 2017 Anthony Duguid") +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © Anthony Duguid") ![current_build SQL_SERVER_2016](https://img.shields.io/badge/current_build-SQL_SERVER_2016-red.svg) ## General Database Scripts From 47c9b655071a1289cbfe75f547513f133b9fc809 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 2 Jan 2018 10:23:11 +1100 Subject: [PATCH 04/17] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 44760dc..56d4d27 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Anthony Duguid +Copyright (c) 2018 Anthony Duguid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 62ab0c29093349a88ff539efe2077443d698ba66 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 8 Jan 2018 10:15:01 +1100 Subject: [PATCH 05/17] Update SSDB.Row_Level_Auditing_Add.sql --- SSDB.Row_Level_Auditing_Add.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SSDB.Row_Level_Auditing_Add.sql b/SSDB.Row_Level_Auditing_Add.sql index 18075ab..32ade74 100644 --- a/SSDB.Row_Level_Auditing_Add.sql +++ b/SSDB.Row_Level_Auditing_Add.sql @@ -160,7 +160,7 @@ BEGIN PRINT '====================================================================='; END - IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[TR_' + @TableName + '_LAST_UPDATED]')) + IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[' + @SchemaName + '].[TR_' + @TableName + '_LAST_UPDATED]')) BEGIN PRINT '====================================================================='; @@ -217,4 +217,4 @@ BEGIN END -GO \ No newline at end of file +GO From f6d78e65531fd5ea86d3ec26ab5cf1a166747f1f Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 27 Aug 2018 12:42:41 +1000 Subject: [PATCH 06/17] Update SSDB.Check_Index_Fragmentation.sql --- SSDB.Check_Index_Fragmentation.sql | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/SSDB.Check_Index_Fragmentation.sql b/SSDB.Check_Index_Fragmentation.sql index f6f3f86..0b376c6 100644 --- a/SSDB.Check_Index_Fragmentation.sql +++ b/SSDB.Check_Index_Fragmentation.sql @@ -4,26 +4,26 @@ +---------------------------------------------------------------------------------------*/ SELECT - 'Schema' = dbschemas.[name] - , 'Table' = dbtables.[name] - , 'Index' = dbindexes.[name] - , indexstats.avg_fragmentation_in_percent - , indexstats.page_count - , SqlScript = + [Schema] = dbschemas.[name] + , [Table] = dbtables.[name] + , [Index] = dbindexes.[name] + , indexstats.[avg_fragmentation_in_percent] + , indexstats.[page_count] + , [SqlScript] = CASE - WHEN indexstats.avg_fragmentation_in_percent > 30 THEN 'ALTER INDEX [' + dbindexes.[name] + '] ON [' + dbschemas.[name] + '].[' + dbtables.[name] + '] REBUILD WITH (ONLINE = ON)' - WHEN indexstats.avg_fragmentation_in_percent > 5 AND indexstats.avg_fragmentation_in_percent < 30 THEN 'ALTER INDEX [' + dbindexes.[name] + '] ON [' + dbschemas.[name] + '].[' + dbtables.[name] + '] REORGANIZE' + WHEN indexstats.[avg_fragmentation_in_percent] > 30 THEN 'ALTER INDEX [' + dbindexes.[name] + '] ON [' + dbschemas.[name] + '].[' + dbtables.[name] + '] REBUILD WITH (ONLINE = ON)' + WHEN indexstats.[avg_fragmentation_in_percent] > 5 AND indexstats.[avg_fragmentation_in_percent] < 30 THEN 'ALTER INDEX [' + dbindexes.[name] + '] ON [' + dbschemas.[name] + '].[' + dbtables.[name] + '] REORGANIZE' ELSE NULL END FROM - sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats - INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] - INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] - INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id + [sys].[dm_db_index_physical_stats] (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats + INNER JOIN [sys].[tables] AS dbtables ON dbtables.[object_id] = indexstats.[object_id] + INNER JOIN [sys].[schemas] AS dbschemas ON dbtables.[schema_id] = dbschemas.[schema_id] + INNER JOIN [sys].[indexes] AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE 1=1 - AND indexstats.database_id = DB_ID() + AND indexstats.[database_id] = DB_ID() AND dbindexes.[name] IS NOT NULL --AND dbindexes.[name] = 'IX_IndexName' ORDER BY - indexstats.avg_fragmentation_in_percent desc + indexstats.[avg_fragmentation_in_percent] DESC From 6af6469061893f1529ef2061adfff3d33e636783 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 27 Aug 2018 16:39:56 +1000 Subject: [PATCH 07/17] Create SSDB.RowLevelAuditAdd.sql --- SSDB.RowLevelAuditAdd.sql | 225 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 SSDB.RowLevelAuditAdd.sql diff --git a/SSDB.RowLevelAuditAdd.sql b/SSDB.RowLevelAuditAdd.sql new file mode 100644 index 0000000..202edbe --- /dev/null +++ b/SSDB.RowLevelAuditAdd.sql @@ -0,0 +1,225 @@ +CREATE PROCEDURE [dbo].[RowLevelAuditAdd] + @DatabaseName NVARCHAR(50) = NULL + , @SchemaName NVARCHAR(50) = NULL + , @TableName NVARCHAR(50) = NULL +AS +BEGIN + +/* +'-------------------------------------------------------------------------------------------------------------------- +' Purpose: Adds row level auditing columns to a table +' Example: EXEC dbo.RowLevelAuditAdd 'YourDatabase', 'dbo', 'ORGN'; +' Note: The table must have a primary key to create the update trigger +'-------------------------------------------------------------------------------------------------------------------- + + ----------------------------------------------------- + -->>>>>>>>>>>>>>>>> FOR DEBUGGING <<<<<<<<<<<<<<<<<<< + ----------------------------------------------------- + BEGIN + DECLARE @DatabaseName NVARCHAR(50) + DECLARE @SchemaName NVARCHAR(50) + DECLARE @TableName NVARCHAR(50) + SET @DatabaseName = 'YourDatabase' + SET @SchemaName = 'dbo' + SET @TableName = 'ORGN' + ----------------------------------------------------- + ----------------------------------------------------- + +*/ + + SET XACT_ABORT ON + BEGIN TRANSACTION; + SET NOCOUNT ON + + DECLARE @SqlCommand NVARCHAR(1000) + DECLARE @TableKey NVARCHAR(1000) + DECLARE @UserName NVARCHAR(50) + DECLARE @CreatedId NVARCHAR(50) + DECLARE @CreatedDate NVARCHAR(50) + DECLARE @ModifiedId NVARCHAR(50) + DECLARE @ModifiedDate NVARCHAR(50) + DECLARE @TodayDate NVARCHAR(50) + + SET @CreatedId = 'CreatedId' + SET @CreatedDate = 'CreatedDate' + SET @ModifiedId = 'ModifiedId' + SET @ModifiedDate = 'ModifiedDate' + SET @UserName = LOWER(LEFT(RIGHT(SYSTEM_USER,(LEN(SYSTEM_USER)-CHARINDEX('\',SYSTEM_USER))), 50)) + SET @TodayDate = FORMAT(GETDATE(), 'dd-MMM-yyyy HH:mm:ss', 'en-US' ) + + PRINT '====================================================================='; + PRINT 'START - ALTER [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + ']... '; + + IF COL_LENGTH(@DatabaseName + '.' + @SchemaName + '.' + @TableName, @CreatedId) IS NULL + BEGIN + + PRINT '====================================================================='; + PRINT 'START - ADD COLUMN [' + @CreatedId + ']... '; + + PRINT '1. alter table add ' + @CreatedId + ' column... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD [' + @CreatedId + '] [NVARCHAR](50) NULL' + EXEC (@SqlCommand) + + PRINT '2. update new column to a value... ' + @UserName; + SET @SqlCommand = 'UPDATE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] SET [' + @CreatedId + '] =''' + @UserName + ''' WHERE [' + @CreatedId + '] IS NULL' + EXEC (@SqlCommand) + + PRINT '3. alter table alter new column add constraints... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ALTER COLUMN [' + @CreatedId + '] [NVARCHAR](50) NOT NULL' + EXEC (@SqlCommand) + + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD CONSTRAINT [DF_' + @TableName + '_' + @CreatedId + '] DEFAULT (LOWER(LEFT(RIGHT(SYSTEM_USER,(LEN(SYSTEM_USER)-CHARINDEX(''\'',SYSTEM_USER))), 50))) FOR [' + @CreatedId + ']' + EXEC (@SqlCommand) + + PRINT '4. add column description... '; + EXEC [sys].sp_addextendedproperty @name=N'MS_Description', @value=N'Who created the record' , @level0type=N'SCHEMA',@level0name=@SchemaName, @level1type=N'TABLE',@level1name=@TableName, @level2type=N'COLUMN',@level2name=@CreatedId; + + PRINT 'END - ADD COLUMN [' + @CreatedId + ']... '; + PRINT '====================================================================='; + END + + IF COL_LENGTH(@DatabaseName + '.' + @SchemaName + '.' + @TableName, @CreatedDate) IS NULL + BEGIN + + PRINT '====================================================================='; + PRINT 'START - ADD COLUMN [' + @CreatedDate + ']... '; + + PRINT '1. alter table add ' + @CreatedDate + ' column... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD [' + @CreatedDate + '] [DATETIME] NULL' + EXEC (@SqlCommand) + + PRINT '2. update new column to a value... ' + @TodayDate; + SET @SqlCommand = 'UPDATE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] SET [' + @CreatedDate + '] = ''' + @TodayDate+ ''' WHERE [' + @CreatedDate + '] IS NULL' + EXEC (@SqlCommand) + + PRINT '3. alter table alter new column add constraints... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ALTER COLUMN [' + @CreatedDate + '] [DATETIME] NOT NULL' + EXEC (@SqlCommand) + + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD CONSTRAINT [DF_' + @TableName + '_' + @CreatedDate + '] DEFAULT (GETDATE()) FOR [' + @CreatedDate + ']' + EXEC (@SqlCommand) + + PRINT '4. add column description... '; + EXEC [sys].sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created' , @level0type=N'SCHEMA',@level0name=@SchemaName, @level1type=N'TABLE',@level1name=@TableName, @level2type=N'COLUMN',@level2name=@CreatedDate; + + PRINT 'END - ADD COLUMN [' + @CreatedDate + ']... '; + PRINT '====================================================================='; + END + + IF COL_LENGTH(@DatabaseName + '.' + @SchemaName + '.' + @TableName, @ModifiedId) IS NULL + BEGIN + + PRINT '====================================================================='; + PRINT 'START - ADD COLUMN [' + @ModifiedId + ']... '; + + PRINT '1. alter table add ' + @ModifiedId + ' column... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD [' + @ModifiedId + '] [NVARCHAR](50) NULL' + EXEC (@SqlCommand) + + PRINT '2. update new column to a value... ' + @UserName; + SET @SqlCommand = 'UPDATE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] SET [' + @ModifiedId + '] =''' + @UserName + ''' WHERE [' + @ModifiedId + '] IS NULL' + EXEC (@SqlCommand) + + PRINT '3. alter table alter new column add constraints... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ALTER COLUMN [' + @ModifiedId + '] [NVARCHAR](50) NOT NULL' + EXEC (@SqlCommand) + + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD CONSTRAINT [DF_' + @TableName + '_' + @ModifiedId + '] DEFAULT (LOWER(LEFT(RIGHT(SYSTEM_USER,(LEN(SYSTEM_USER)-CHARINDEX(''\'',SYSTEM_USER))), 50))) FOR [' + @ModifiedId + ']' + EXEC (@SqlCommand) + + PRINT '4. add column description... '; + EXEC [sys].sp_addextendedproperty @name=N'MS_Description', @value=N'Who modified the record' , @level0type=N'SCHEMA',@level0name=@SchemaName, @level1type=N'TABLE',@level1name=@TableName, @level2type=N'COLUMN',@level2name=@ModifiedId; + + PRINT 'END - ADD COLUMN [' + @ModifiedId + ']... '; + PRINT '====================================================================='; + END + + IF COL_LENGTH(@DatabaseName + '.' + @SchemaName + '.' + @TableName, @ModifiedDate) IS NULL + BEGIN + + PRINT '====================================================================='; + PRINT 'START - ADD COLUMN [' + @ModifiedDate + ']... '; + + PRINT '1. alter table add ' + @ModifiedDate + ' column... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD [' + @ModifiedDate + '] [DATETIME] NULL' + EXEC (@SqlCommand) + + PRINT '2. update new column to a value... ' + @TodayDate; + SET @SqlCommand = 'UPDATE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] SET [' + @ModifiedDate + '] = ''' + @TodayDate+ ''' WHERE [' + @ModifiedDate + '] IS NULL' + EXEC (@SqlCommand) + + PRINT '3. alter table alter new column add constraints... '; + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ALTER COLUMN [' + @ModifiedDate + '] [DATETIME] NOT NULL' + EXEC (@SqlCommand) + + SET @SqlCommand = 'ALTER TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + '] ADD CONSTRAINT [DF_' + @TableName + '_' + @ModifiedDate + '] DEFAULT (GETDATE()) FOR [' + @ModifiedDate + ']' + EXEC (@SqlCommand) + + PRINT '4. add column description... '; + EXEC [sys].sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was modified' , @level0type=N'SCHEMA',@level0name=@SchemaName, @level1type=N'TABLE',@level1name=@TableName, @level2type=N'COLUMN',@level2name=@ModifiedDate; + + PRINT 'END - ADD COLUMN [' + @ModifiedDate + ']... '; + PRINT '====================================================================='; + END + + IF NOT EXISTS (SELECT * FROM [sys].[triggers] WHERE [object_id] = OBJECT_ID(N'[' + @SchemaName + '].[TR_' + @TableName + '_LAST_UPDATED]')) + BEGIN + + PRINT '====================================================================='; + PRINT 'START - ADD TRIGGER [TR_' + @TableName + '_LAST_UPDATED]... '; + + PRINT '1. get primary key from information schema'; + SET @SqlCommand = 'USE ' + @DatabaseName + '; ' + SET @SqlCommand += ' SELECT ' + SET @SqlCommand += ' @TableKey = COALESCE(@TableKey, '''') + CASE WHEN [ORDINAL_POSITION] = 1 THEN ''ON'' ELSE ''AND'' END + '' t.'' + [COLUMN_NAME] + '' = i.'' + [COLUMN_NAME] + '' ''' + SET @SqlCommand += ' FROM' + SET @SqlCommand += ' [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]' + SET @SqlCommand += ' WHERE' + SET @SqlCommand += ' OBJECTPROPERTY(OBJECT_ID([CONSTRAINT_SCHEMA] + ''.'' + QUOTENAME([CONSTRAINT_NAME])), ''IsPrimaryKey'') = 1 ' + SET @SqlCommand += ' AND [TABLE_NAME] = ''' + @TableName + '''' + SET @SqlCommand += ' AND [TABLE_SCHEMA] = ''' + @SchemaName + '''' + SET @SqlCommand += ' ORDER BY [ORDINAL_POSITION]' + EXEC sp_executeSQl @SqlCommand, N'@TableKey NVARCHAR(1000) OUTPUT', @TableKey OUTPUT + + PRINT '2. build trigger dynamically'; + SET @SqlCommand = 'USE ' + @DatabaseName + '; ' + SET @SqlCommand += ' CREATE TRIGGER [' + @SchemaName + '].[TR_' + @TableName + '_LAST_UPDATED]' + CHAR(13); + SET @SqlCommand += ' ON [' + @SchemaName + '].[' + @TableName + ']' + CHAR(13); + SET @SqlCommand += ' AFTER UPDATE' + CHAR(13); + SET @SqlCommand += ' AS' + CHAR(13); + SET @SqlCommand += ' BEGIN' + CHAR(13); + SET @SqlCommand += CHAR(9) + ' IF NOT UPDATE(' + @ModifiedDate + ')' + CHAR(13); + SET @SqlCommand += CHAR(9) + ' BEGIN' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' UPDATE t' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' SET' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' t.' + @ModifiedDate + ' = CURRENT_TIMESTAMP' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' , t.' + @ModifiedId + ' = LOWER(LEFT(RIGHT(SYSTEM_USER,(LEN(SYSTEM_USER)-CHARINDEX(''\'',SYSTEM_USER))), 50))' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' FROM [' + @SchemaName + '].[' + @TableName + '] AS t' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + ' INNER JOIN inserted AS i' + CHAR(13); + SET @SqlCommand += CHAR(9) + CHAR(9) + @TableKey + ';' + CHAR(13); + SET @SqlCommand += CHAR(9) + ' END' + CHAR(13); + SET @SqlCommand += ' END;' + CHAR(13); + EXEC (@SqlCommand) + + PRINT '3. enable trigger'; + SET @SqlCommand = 'USE ' + @DatabaseName + '; ' + SET @SqlCommand += ' ALTER TABLE [' + @SchemaName + '].[' + @TableName + '] ENABLE TRIGGER [TR_' + @TableName + '_LAST_UPDATED]'; + EXEC (@SqlCommand) + + PRINT 'END - ADD TRIGGER [' + @ModifiedDate + ']... '; + PRINT '====================================================================='; + END + + + PRINT 'END - ALTER [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + ']... '; + PRINT '====================================================================='; + + --PRINT '******* ROLLBACK TRANSACTION ******* '; + --ROLLBACK TRANSACTION; + + PRINT '******* COMMIT TRANSACTION ******* '; + COMMIT TRANSACTION; + +END + +GO From 05d6a5db0e59a420e0476ab92e40492fbac80b60 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 27 Aug 2018 16:43:19 +1000 Subject: [PATCH 08/17] Update SSDB.RowLevelAuditAdd.sql --- SSDB.RowLevelAuditAdd.sql | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/SSDB.RowLevelAuditAdd.sql b/SSDB.RowLevelAuditAdd.sql index 202edbe..e5c7c09 100644 --- a/SSDB.RowLevelAuditAdd.sql +++ b/SSDB.RowLevelAuditAdd.sql @@ -25,6 +25,33 @@ BEGIN ----------------------------------------------------- ----------------------------------------------------- + --remove the table if exists + IF OBJECT_ID('dbo.ORGN', 'U') IS NOT NULL + DROP TABLE dbo.ORGN; + + --create the table + CREATE TABLE [dbo].[ORGN] ( + [ORGN_ID] INT IDENTITY (1, 1) NOT NULL, + [ORGN_ABBR] VARCHAR (5) NOT NULL, + [ORGN_NAME] VARCHAR (100) NULL + ); + + --Add the keys + ALTER TABLE [dbo].[ORGN] + ADD CONSTRAINT [PK_ORGN] PRIMARY KEY NONCLUSTERED ([ORGN_ID] ASC); + ALTER TABLE [dbo].[ORGN] + ADD CONSTRAINT [UK_ORGN] UNIQUE NONCLUSTERED ([ORGN_ABBR] ASC); + + --Add some test records + INSERT INTO dbo.ORGN (ORGN_ABBR, ORGN_NAME) VALUES('AABA', 'Altaba Inc'); + INSERT INTO dbo.ORGN (ORGN_ABBR, ORGN_NAME) VALUES('AAPL', 'Apple Inc'); + INSERT INTO dbo.ORGN (ORGN_ABBR, ORGN_NAME) VALUES('GOOG', 'Alphabet Inc'); + INSERT INTO dbo.ORGN (ORGN_ABBR, ORGN_NAME) VALUES('MSFT', 'Microsoft Corporation'); + INSERT INTO dbo.ORGN (ORGN_ABBR, ORGN_NAME) VALUES('TSLA', 'Tesla Inc'); + + --test procedure + EXEC dbo.RowLevelAuditAdd 'YourDatabase', 'dbo', 'ORGN'; + */ SET XACT_ABORT ON From b30916e7a1c9350fc842949a020010edc17eb864 Mon Sep 17 00:00:00 2001 From: Anthony Date: Thu, 6 Sep 2018 12:40:18 +1000 Subject: [PATCH 09/17] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 374effe..d50abe4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ # SQL Server Scripts Various scripts I use for SQL Server +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/AnthonyDuguid) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © Anthony Duguid") ![current_build SQL_SERVER_2016](https://img.shields.io/badge/current_build-SQL_SERVER_2016-red.svg) From 8220a30b3c16f7a9ddcb5acad44eeed9bca28966 Mon Sep 17 00:00:00 2001 From: Anthony Date: Fri, 7 Sep 2018 09:51:50 +1000 Subject: [PATCH 10/17] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index d50abe4..374effe 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ # SQL Server Scripts Various scripts I use for SQL Server -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/AnthonyDuguid) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE "MIT License Copyright © Anthony Duguid") ![current_build SQL_SERVER_2016](https://img.shields.io/badge/current_build-SQL_SERVER_2016-red.svg) From 43f22444712bb68d3e06ec9580a911cc7906a415 Mon Sep 17 00:00:00 2001 From: Anthony Date: Wed, 30 Jan 2019 12:39:28 +1100 Subject: [PATCH 11/17] Update SSDB.Check_Index_Fragmentation.sql --- SSDB.Check_Index_Fragmentation.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/SSDB.Check_Index_Fragmentation.sql b/SSDB.Check_Index_Fragmentation.sql index 0b376c6..b0e5f72 100644 --- a/SSDB.Check_Index_Fragmentation.sql +++ b/SSDB.Check_Index_Fragmentation.sql @@ -1,6 +1,5 @@ /*--------------------------------------------------------------------------------------+ | Purpose: How to Check Index Fragmentation on Indexes in a Database -| Note: SQLCmdMode Script +---------------------------------------------------------------------------------------*/ SELECT From 31ca1834200d72cd1ce32fd74c9f34977a88445b Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 26 Feb 2019 18:07:00 +1100 Subject: [PATCH 12/17] Add files via upload --- SSDB.non-service_accounts.sql | 165 ++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 SSDB.non-service_accounts.sql diff --git a/SSDB.non-service_accounts.sql b/SSDB.non-service_accounts.sql new file mode 100644 index 0000000..9e76376 --- /dev/null +++ b/SSDB.non-service_accounts.sql @@ -0,0 +1,165 @@ +/*+--------------------------------------------------------------------------- +| Purpose: To check for non-service accounts +| Note: SQLCmdMode Script --> on the SSMS menu bar "Query" | "SQLCMD Mode" ++----------------------------------------------------------------------------- +*/ + +:setvar _server "YourServerName" -- change the server here +:setvar _database "master" +:connect $(_server) + +USE [$(_database)]; +GO + +:setvar login_name "" -- to search for an individual account enter it here e.g. "Domain\UserName" + + +SET XACT_ABORT ON +BEGIN TRANSACTION; + +PRINT '====================================================================='; +PRINT 'define all services accounts ... '; + +SELECT tbl.* INTO #service_accounts FROM (VALUES + ('##MS_PolicyEventProcessingLogin##') + , ('##MS_PolicyTsqlExecutionLogin##') + , ('NT AUTHORITY\SYSTEM') + , ('NT Service\MSSQLSERVER') + , ('NT SERVICE\SQLSERVERAGENT') + , ('NT SERVICE\SQLTELEMETRY') + , ('NT SERVICE\SQLWriter') + , ('NT SERVICE\Winmgmt') + , ('public') + , ('sa') +) tbl ([Login_Name]) + +PRINT '====================================================================='; +PRINT 'check databases owners ... '; + + SELECT + [Server_Name] = @@SERVERNAME + , [Database_Name] = db.[name] + , [Login_Name] = sl.[Name] + , [CommandToRun] = (CASE WHEN db.[is_read_only] = 1 THEN '-- Remove ReadOnly State' WHEN db.[state_desc] = 'ONLINE' THEN 'ALTER AUTHORIZATION on DATABASE::[' + db.[name] + '] to [sa];' ELSE '-- Turn On ' END) + --, [Database_ID] = db.[database_id] + --, [Current_State] = db.[state_desc] + --, [Read_Only] = db.[is_read_only] + FROM + [master].[sys].[databases] AS db + INNER JOIN [master].[sys].[syslogins] AS sl ON db.[owner_sid] = sl.[sid] + WHERE + 1=1 + AND sl.[Name] NOT IN(SELECT [Login_Name] FROM #service_accounts) + AND (sl.[Name] = N'$(login_name)' OR N'$(login_name)' = N'') + ORDER BY + db.[Name] + +PRINT '====================================================================='; +PRINT 'check databases users ... '; + + DECLARE @dbs_users TABLE + ( + [Database_Name] SYSNAME + , [User_Name] SYSNAME + , [Login_Type] SYSNAME + , [Associated_Role] VARCHAR(MAX) + , [Create_Date] DATETIME + , [Modify_Date] DATETIME + ) + + INSERT @dbs_users + EXEC sp_MSforeachdb ' + USE [?] + SELECT + [Database_Name] = ''?'' + , [User_Name] = CASE dp.[name] WHEN ''dbo'' THEN (SELECT SUSER_SNAME([owner_sid]) FROM [master].[sys].[databases] WHERE [name] =''?'') ELSE dp.[name] END + , [Login_Type] = dp.[type_desc] + , [Associated_Role] = isnull(USER_NAME(dm.role_principal_id),'''') + , dp.[create_date] + , dp.[modify_date] + FROM + [sys].[database_principals] AS dp + LEFT JOIN [sys].[database_role_members] AS dm ON dp.[principal_id] = dm.[member_principal_id] + WHERE + 1=1 + AND dp.[sid] IS NOT NULL + AND dp.[sid] NOT IN (0x00) + AND dp.[is_fixed_role] != 1 + AND dp.[name] NOT LIKE ''##%''' + + SELECT + [Server_Name] = @@SERVERNAME + , [Database_Name] + , [User_Name] + , [Create_Date] + , [Modify_Date] + , [Permissions_User] = STUFF(( + SELECT ',' + CONVERT(VARCHAR(500), [Associated_Role]) + FROM @dbs_users AS dbu2 + WHERE dbu1.[Database_Name] = dbu2.[Database_Name] + AND dbu1.[User_Name] = dbu2.[User_Name] + FOR XML PATH('') + ), 1, 1, '') + --, [Login_Type] + FROM + @dbs_users AS dbu1 + WHERE + 1=1 + AND [User_Name] NOT IN(SELECT [Login_Name] FROM #service_accounts) + AND [Login_Type] = 'WINDOWS_USER' + AND ([User_Name] = N'$(login_name)' OR N'$(login_name)' = N'') + GROUP BY + [Database_Name] + , [User_Name] + , [Create_Date] + , [Modify_Date] + --, [Login_Type] + ORDER BY + [Database_Name] + , [User_Name] + +PRINT '====================================================================='; +PRINT 'check agent jobs ... '; + + SELECT + [Server_Name] = @@SERVERNAME + , [SQL_Agent_Job_Name] = sj.[name] + , [Job_Owner] = sl.[name] + , [CommandToRun] = 'EXEC [msdb].[dbo].[sp_update_job] @job_id=N''' + CAST(sj.[job_id] AS VARCHAR(150)) + ''', @owner_login_name=N''sa'' ' + --, sj.[description] + --, sc.[name] + FROM + [msdb].[dbo].[sysjobs] AS sj + INNER JOIN [master].[sys].[syslogins] AS sl ON sj.[owner_sid] = sl.[sid] + INNER JOIN [msdb].[dbo].[syscategories] AS sc ON sc.[category_id] = sj.[category_id] + WHERE + 1=1 + AND sl.[Name] NOT IN(SELECT [Login_Name] FROM #service_accounts) + AND (sl.[name] = N'$(login_name)' OR N'$(login_name)' = N'') + ORDER BY + sj.[name] + +PRINT '====================================================================='; +PRINT 'check report subscriptions ... '; + + IF DB_ID('ReportServer') IS NOT NULL + SELECT DISTINCT + [Server_Name] = @@SERVERNAME + , [Report_Name] = rp.[Name] + , [Subscription_Owner] = ou.[UserName] + , [Subscription_Owner_ID] = ou.[UserID] + --, sb.[Report_OID] + FROM + [ReportServer].[dbo].[Subscriptions] AS sb + INNER JOIN [ReportServer].[dbo].[Catalog] AS rp ON rp.[ItemID] = sb.[Report_OID] + INNER JOIN [ReportServer].[dbo].[Users] AS ou ON ou.[UserID] = sb.[OwnerID] + WHERE + 1=1 + AND ou.[UserName] NOT IN(SELECT [Login_Name] COLLATE Latin1_General_CI_AS FROM #service_accounts) + AND (ou.[UserName] = N'$(login_name)' OR N'$(login_name)' = N'') + +PRINT '******* ROLLBACK TRANSACTION ******* '; +ROLLBACK TRANSACTION; + +--PRINT '******* COMMIT TRANSACTION ******* '; +--COMMIT TRANSACTION; \ No newline at end of file From 2c94752be0adad353e5198c96216cb2cf114a43c Mon Sep 17 00:00:00 2001 From: Anthony Date: Wed, 27 Feb 2019 10:22:44 +1100 Subject: [PATCH 13/17] Update SSDB.non-service_accounts.sql --- SSDB.non-service_accounts.sql | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/SSDB.non-service_accounts.sql b/SSDB.non-service_accounts.sql index 9e76376..daa7a85 100644 --- a/SSDB.non-service_accounts.sql +++ b/SSDB.non-service_accounts.sql @@ -12,7 +12,7 @@ USE [$(_database)]; GO :setvar login_name "" -- to search for an individual account enter it here e.g. "Domain\UserName" - +:setvar ssrs_service_account "Domain\ssrs_service_account" SET XACT_ABORT ON BEGIN TRANSACTION; @@ -39,7 +39,7 @@ PRINT 'check databases owners ... '; SELECT [Server_Name] = @@SERVERNAME , [Database_Name] = db.[name] - , [Login_Name] = sl.[Name] + , [Database_Owner] = sl.[Name] , [CommandToRun] = (CASE WHEN db.[is_read_only] = 1 THEN '-- Remove ReadOnly State' WHEN db.[state_desc] = 'ONLINE' THEN 'ALTER AUTHORIZATION on DATABASE::[' + db.[name] + '] to [sa];' ELSE '-- Turn On ' END) --, [Database_ID] = db.[database_id] --, [Current_State] = db.[state_desc] @@ -100,6 +100,7 @@ PRINT 'check databases users ... '; AND dbu1.[User_Name] = dbu2.[User_Name] FOR XML PATH('') ), 1, 1, '') + , [CommandToRun] = 'USE [' + [Database_Name] + ']; DROP USER [' + [User_Name] + '];' --, [Login_Type] FROM @dbs_users AS dbu1 @@ -143,23 +144,32 @@ PRINT '====================================================================='; PRINT 'check report subscriptions ... '; IF DB_ID('ReportServer') IS NOT NULL + WITH + service_account + AS + ( + SELECT [service_account_id] = [UserID], [UserName] FROM [ReportServer].[dbo].[Users] WHERE [UserName] = N'$(ssrs_service_account)' + ) SELECT DISTINCT [Server_Name] = @@SERVERNAME , [Report_Name] = rp.[Name] , [Subscription_Owner] = ou.[UserName] , [Subscription_Owner_ID] = ou.[UserID] + , [CommandToRun] = 'UPDATE [ReportServer].[dbo].[Subscriptions] SET [OwnerID] = ''' + CAST(sa.[service_account_id] AS VARCHAR(MAX)) + ''' WHERE [OwnerID] = ''' + CAST(ou.[UserID] AS VARCHAR(MAX)) + '''' --, sb.[Report_OID] FROM [ReportServer].[dbo].[Subscriptions] AS sb - INNER JOIN [ReportServer].[dbo].[Catalog] AS rp ON rp.[ItemID] = sb.[Report_OID] INNER JOIN [ReportServer].[dbo].[Users] AS ou ON ou.[UserID] = sb.[OwnerID] + INNER JOIN [ReportServer].[dbo].[Catalog] AS rp ON rp.[ItemID] = sb.[Report_OID] + , service_account AS sa WHERE 1=1 AND ou.[UserName] NOT IN(SELECT [Login_Name] COLLATE Latin1_General_CI_AS FROM #service_accounts) AND (ou.[UserName] = N'$(login_name)' OR N'$(login_name)' = N'') + PRINT '******* ROLLBACK TRANSACTION ******* '; ROLLBACK TRANSACTION; --PRINT '******* COMMIT TRANSACTION ******* '; ---COMMIT TRANSACTION; \ No newline at end of file +--COMMIT TRANSACTION; From d76cf74cfd9f7c03b5bb06f8a61fab792d4da4ee Mon Sep 17 00:00:00 2001 From: Anthony Date: Wed, 27 Feb 2019 11:03:10 +1100 Subject: [PATCH 14/17] Update SSDB.non-service_accounts.sql --- SSDB.non-service_accounts.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SSDB.non-service_accounts.sql b/SSDB.non-service_accounts.sql index daa7a85..3850b5a 100644 --- a/SSDB.non-service_accounts.sql +++ b/SSDB.non-service_accounts.sql @@ -155,13 +155,12 @@ PRINT 'check report subscriptions ... '; , [Report_Name] = rp.[Name] , [Subscription_Owner] = ou.[UserName] , [Subscription_Owner_ID] = ou.[UserID] - , [CommandToRun] = 'UPDATE [ReportServer].[dbo].[Subscriptions] SET [OwnerID] = ''' + CAST(sa.[service_account_id] AS VARCHAR(MAX)) + ''' WHERE [OwnerID] = ''' + CAST(ou.[UserID] AS VARCHAR(MAX)) + '''' + , [CommandToRun] = 'UPDATE [ReportServer].[dbo].[Subscriptions] SET [OwnerID] = ''' + CAST((SELECT [service_account_id] FROM service_account) AS VARCHAR(MAX)) + ''' WHERE [OwnerID] = ''' + CAST(ou.[UserID] AS VARCHAR(MAX)) + '''' --, sb.[Report_OID] FROM [ReportServer].[dbo].[Subscriptions] AS sb INNER JOIN [ReportServer].[dbo].[Users] AS ou ON ou.[UserID] = sb.[OwnerID] INNER JOIN [ReportServer].[dbo].[Catalog] AS rp ON rp.[ItemID] = sb.[Report_OID] - , service_account AS sa WHERE 1=1 AND ou.[UserName] NOT IN(SELECT [Login_Name] COLLATE Latin1_General_CI_AS FROM #service_accounts) From 344f1015fb1a667f3f0e3f46f27d4bf3006fa111 Mon Sep 17 00:00:00 2001 From: Anthony Date: Fri, 29 Mar 2019 13:24:16 +1100 Subject: [PATCH 15/17] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 56d4d27..ae2e17f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Anthony Duguid +Copyright (c) 2019 Anthony Duguid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From a42d3bdd96ac7ab6a853e977f6fdfe8c0e0e78ec Mon Sep 17 00:00:00 2001 From: Anthony Date: Sat, 23 May 2020 09:28:19 +1000 Subject: [PATCH 16/17] Update PMDB.Remove database locks.sql --- PMDB.Remove database locks.sql | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/PMDB.Remove database locks.sql b/PMDB.Remove database locks.sql index 29d3b44..043ed10 100644 --- a/PMDB.Remove database locks.sql +++ b/PMDB.Remove database locks.sql @@ -19,8 +19,11 @@ PRINT 'show the blocked processes. ' PRINT '=====================================================================' GO -SELECT DB_NAME(dbid) as 'Database Name', * FROM master.dbo.sysprocesses WITH (NOLOCK) -WHERE BLOCKED <> 0 +SELECT + [Database Name] = DB_NAME([dbid]) + , * +FROM [master].[dbo].[sysprocesses] WITH(NOLOCK) +WHERE [BLOCKED] != 0; --DB_NAME(dbid) = 'PMDB_TEST' -- change the database name here PRINT '=====================================================================' @@ -28,7 +31,10 @@ PRINT 'show the blocked process record. ' PRINT '=====================================================================' GO -SELECT DB_NAME(dbid) AS 'Database Name', * FROM master.dbo.sysprocesses +SELECT + [Database Name] = DB_NAME([dbid]) + , * +FROM [master].[dbo].[sysprocesses]; WHERE SPID = 212 -- update the spid here PRINT '=====================================================================' @@ -36,14 +42,14 @@ PRINT 'get the sql statement of the blocked process for the ticket. ' PRINT '=====================================================================' GO -DBCC INPUTBUFFER (212) -- update the spid here +DBCC INPUTBUFFER(212); -- update the spid here PRINT '=====================================================================' PRINT 'remove the blocked process. ' PRINT '=====================================================================' GO ---KILL 212 +--KILL 212; PRINT '=====================================================================' PRINT 'Finished!' From e178cc6779e3e22a051ec7e72406314c73c3ac50 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 3 Jan 2023 01:32:01 +1100 Subject: [PATCH 17/17] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ae2e17f..15bc72f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Anthony Duguid +Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal