diff --git a/functions-scalar/dbo.ObsfucateIPAddress.sql b/functions-scalar/dbo.ObsfucateIPAddress.sql new file mode 100644 index 0000000..5dadd78 --- /dev/null +++ b/functions-scalar/dbo.ObsfucateIPAddress.sql @@ -0,0 +1,25 @@ +CREATE OR ALTER FUNCTION dbo.ObsfucateIPAddress(@String NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +/************************************************************************************************* +AUTHOR: Patrick Hurst +CREATED: 20220414 + Obsfucates the provided IP by returning the first digit of each octet and replacing the + rest with Xs +PARAMETERS: + @String - the IP Address to obsfucate +EXAMPLES: +* dbo.ObsfucateIPAddress('192.168.1.10') --> 1XX.1XX.1.1X +************************************************************************************************** +MODIFICATIONS: + YYYYMMDD - +************************************************************************************************** + +*************************************************************************************************/ + BEGIN + DECLARE @return NVARCHAR(MAX) + SELECT @return = STRING_AGG(LEFT(value,1) +COALESCE(REPLICATE('X',LEN(Value)-1),''), '.') + FROM string_split(@String,'.') + RETURN @return + END + GO diff --git a/functions-scalar/dbo.ObsfucateString.sql b/functions-scalar/dbo.ObsfucateString.sql new file mode 100644 index 0000000..4a347fb --- /dev/null +++ b/functions-scalar/dbo.ObsfucateString.sql @@ -0,0 +1,25 @@ + CREATE OR ALTER FUNCTION dbo.ObsfucateString(@String NVARCHAR(MAX)) + RETURNS NVARCHAR(MAX) + AS +/************************************************************************************************* +AUTHOR: Patrick Hurst +CREATED: 20220414 + Obsfucates the provided string by returning the first two characters of any word, and + replacing the rest with Xs +PARAMETERS: + @String - the string to obsfucate +EXAMPLES: +* dbo.ObsfucateString('John Smith') --> JoXX SmXXX +************************************************************************************************** +MODIFICATIONS: + YYYYMMDD - +************************************************************************************************** + +*************************************************************************************************/ + BEGIN + DECLARE @return NVARCHAR(MAX) + SELECT @return = STRING_AGG(LEFT(value,2) +COALESCE(REPLICATE('X',LEN(Value)-2),''), ' ') + FROM string_split(@String,' ') + RETURN @return + END +GO \ No newline at end of file diff --git a/functions-scalar/dbo.ObsufcateEmail.sql b/functions-scalar/dbo.ObsufcateEmail.sql new file mode 100644 index 0000000..b285f24 --- /dev/null +++ b/functions-scalar/dbo.ObsufcateEmail.sql @@ -0,0 +1,26 @@ +CREATE OR ALTER FUNCTION dbo.ObsufcateEmail(@Email NVARCHAR(100)) +RETURNS NVARCHAR(100) +AS +/************************************************************************************************* +AUTHOR: Patrick Hurst +CREATED: 20220414 + Obsfucates the provided Email address by returning the first two characters of the user name, + the first two characters of the domain and the complete TLD. If the value does not contain a + @ calls dbo.ObsfucateString instead. +PARAMETERS: + @Email - the Email Address to obsfucate +EXAMPLES: +* dbo.ObsufcateEmail('phurst@stackoverflow.com') --> phXXXX@stXXXXXXXXXXX.com +************************************************************************************************** +MODIFICATIONS: + YYYYMMDD - +************************************************************************************************** + +*************************************************************************************************/ + BEGIN + DECLARE @return NVARCHAR(100) + SELECT @return = CASE WHEN CHARINDEX('@', @Email) > 1 THEN REPLACE(LEFT(@Email,2),'@','') +COALESCE(REPLICATE('X',CHARINDEX('@',@Email)-3),'')+'@'+ + LEFT(RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email)),2)+REPLICATE('X',CHARINDEX('.',RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email)-3)))+ + RIGHT(@Email,LEN(RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email)))-CHARINDEX('.',RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email)))+1) ELSE dbo.ObsfucateString(@Email) END + RETURN @return + END \ No newline at end of file diff --git a/stored-procedures/dbo.MaintenanceModeToggle.sql b/stored-procedures/dbo.MaintenanceModeToggle.sql new file mode 100644 index 0000000..dc90776 --- /dev/null +++ b/stored-procedures/dbo.MaintenanceModeToggle.sql @@ -0,0 +1,59 @@ +CREATE OR ALTER PROC dbo.MaintenanceModeToggle ( +@Bit BIT, +@DatabaseName NVARCHAR(128) = NULL, +@AvailabilityGroup NVARCHAR(128) = NULL, +@ServerName NVARCHAR(128) = NULL +) +AS +/************************************************************************************************* +AUTHOR: Patrick hurst +CREATED: 20220414 + +PARAMETERS +* @Bit - maintenance mode on (1) or off (0) + @DatabaseName (NULL/optional) the name of the single database to toggle + @AvailabilityGroup (NULL/optional) the name of the availability group to toggle all databases + @ServerName (NULL/optional) the name of the server to toggle all databases +************************************************************************************************** +MODIFICATIONS: + YYYYMMDDD - Initials - Description of changes +************************************************************************************************** + +*************************************************************************************************/ +BEGIN + IF @bit = 1 + BEGIN + INSERT INTO dbo.MaintenanceModeDatabases + SELECT d.name, SYSTEM_USER, GETUTCDATE() + FROM master.sys.databases d + LEFT OUTER JOIN sys.dm_hadr_cached_database_replica_states rs + ON d.name = rs.ag_db_name + AND rs.is_local = 1 + LEFT OUTER JOIN MaintenanceModeDatabases mmd + ON d.name = mmd.DatabaseName + WHERE (( + (@databaseName IS NULL or @databaseName = d.name) + AND (@availabilityGroup IS NULL OR @availabilityGroup = rs.ag_name) + AND @ServerName IS NULL + ) + OR (@serverName IS NOT NULL)) + AND mmd.DatabaseName IS NULL; + END; + IF @bit = 0 + BEGIN + DELETE mmd + FROM dbo.MaintenanceModeDatabases mmd + LEFT OUTER JOIN sys.dm_hadr_cached_database_replica_states rs + ON mmd.DatabaseName = rs.ag_db_name + AND rs.is_local = 1 + WHERE ( + (@databaseName IS NULL or @databaseName = mmd.DatabaseName) + AND (@availabilityGroup IS NULL OR @availabilityGroup = rs.ag_name) + AND @ServerName IS NULL + ) + OR (@serverName IS NOT NULL); + END; +END; +GO + + diff --git a/tables/dbo.MaintenanceModeDatabases.sql b/tables/dbo.MaintenanceModeDatabases.sql new file mode 100644 index 0000000..a07e53e --- /dev/null +++ b/tables/dbo.MaintenanceModeDatabases.sql @@ -0,0 +1,11 @@ + +IF EXISTS (SELECT 1 FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name = 'MaintenanceModeDatabases' AND s.name = 'dbo') DROP TABLE dbo.MaintenanceModeDatabases; +CREATE TABLE MaintenanceModeDatabases ( + DatabaseName NVARCHAR(128), + AddedByUser NVARCHAR(100), + AddedDateTimeUTC DATETIME DEFAULT GETUTCDATE() + ); +GO + + +