sql_cmd 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/optional_dependencies.rb +30 -0
  4. data/lib/sql_cmd/agent.rb +32 -0
  5. data/lib/sql_cmd/always_on.rb +267 -0
  6. data/lib/sql_cmd/azure.rb +80 -0
  7. data/lib/sql_cmd/backups.rb +276 -0
  8. data/lib/sql_cmd/config.rb +62 -0
  9. data/lib/sql_cmd/database.rb +618 -0
  10. data/lib/sql_cmd/format.rb +124 -0
  11. data/lib/sql_cmd/query.rb +350 -0
  12. data/lib/sql_cmd/security.rb +21 -0
  13. data/lib/sql_cmd/sql_helper.ps1 +89 -0
  14. data/lib/sql_cmd.rb +44 -0
  15. data/sql_scripts/Agent/CreateSQLJob.sql +81 -0
  16. data/sql_scripts/Agent/JobLastRunInfo.sql +70 -0
  17. data/sql_scripts/Agent/JobRunStatus.sql +21 -0
  18. data/sql_scripts/Agent/SQLAgentStatus.sql +8 -0
  19. data/sql_scripts/AlwaysOn/AddDatabaseToAvailabilityGroupOnSecondary.sql +72 -0
  20. data/sql_scripts/AlwaysOn/AddDatabaseToPrimaryAvailabilityGroup.sql +16 -0
  21. data/sql_scripts/AlwaysOn/AutomaticSeedingProgress.sql +34 -0
  22. data/sql_scripts/AlwaysOn/ConfigurePrimaryForAutomaticSeeding.sql +2 -0
  23. data/sql_scripts/AlwaysOn/ConfigurePrimaryForManualSeeding.sql +2 -0
  24. data/sql_scripts/AlwaysOn/ConfigureSecondaryForAutomaticSeeding.sql +1 -0
  25. data/sql_scripts/AlwaysOn/DropSecondary.sql +58 -0
  26. data/sql_scripts/AlwaysOn/RemoveDatabaseFromGroup.sql +2 -0
  27. data/sql_scripts/AlwaysOn/SynchronizationState.sql +14 -0
  28. data/sql_scripts/Database/BackupDatabase.sql +95 -0
  29. data/sql_scripts/Database/CompressAllTables.sql +100 -0
  30. data/sql_scripts/Database/CreateLogin.sql +16 -0
  31. data/sql_scripts/Database/DropDatabase.sql +51 -0
  32. data/sql_scripts/Database/GetBackupFiles.sql +31 -0
  33. data/sql_scripts/Database/GetBackupHeaders.sql +94 -0
  34. data/sql_scripts/Database/GetFileInfoFromBackup.sql +9 -0
  35. data/sql_scripts/Database/RestoreDatabase.sql +185 -0
  36. data/sql_scripts/Database/SetFullRecovery.sql +19 -0
  37. data/sql_scripts/Database/SetSQLCompatibility.sql +33 -0
  38. data/sql_scripts/Security/AssignDatabaseRoles.sql +44 -0
  39. data/sql_scripts/Security/CreateOrUpdateCredential.sql +11 -0
  40. data/sql_scripts/Security/CreateSqlLogin.sql +20 -0
  41. data/sql_scripts/Security/ExportDatabasePermissions.sql +757 -0
  42. data/sql_scripts/Security/GenerateCreateLoginsScript.sql +144 -0
  43. data/sql_scripts/Security/GenerateValidateLoginsScript.sql +83 -0
  44. data/sql_scripts/Security/GetUserSID.sql +3 -0
  45. data/sql_scripts/Security/UpdateSqlPassword.sql +24 -0
  46. data/sql_scripts/Security/ValidateDatabaseRoles.sql +12 -0
  47. data/sql_scripts/Status/ANSINullsOffTableCount.sql +13 -0
  48. data/sql_scripts/Status/ANSINullsOffTables.sql +9 -0
  49. data/sql_scripts/Status/BackupProgress.sql +17 -0
  50. data/sql_scripts/Status/DatabaseInfo.sql +199 -0
  51. data/sql_scripts/Status/DatabaseSize.sql +26 -0
  52. data/sql_scripts/Status/DiskSpace.sql +14 -0
  53. data/sql_scripts/Status/RestoreProgress.sql +17 -0
  54. data/sql_scripts/Status/SQLSettings.sql +182 -0
  55. data/sql_scripts/Status/UncompressedTableCount.sql +27 -0
  56. metadata +224 -0
@@ -0,0 +1,81 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @delete_result int
4
+ DECLARE @jobId binary(16)
5
+
6
+ SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'$(jobname)')
7
+ IF (@jobId IS NOT NULL)
8
+ BEGIN
9
+ EXEC @delete_result = msdb.dbo.sp_delete_job @jobId
10
+
11
+ IF @delete_result = 1
12
+ BEGIN
13
+ PRINT ('Failed to delete job. Aborting operation.')
14
+ SET NOEXEC ON
15
+ END
16
+ END
17
+ GO
18
+
19
+ EXEC msdb.dbo.sp_add_job @job_name=N'$(jobname)',
20
+ @enabled=1,
21
+ @notify_level_eventlog=0,
22
+ @notify_level_email=2,
23
+ @notify_level_netsend=2,
24
+ @notify_level_page=2,
25
+ @delete_level=1,
26
+ @category_name=N'[Uncategorized (Local)]',
27
+ @owner_login_name=N'$(jobowner)'
28
+
29
+ GO
30
+ EXEC msdb.dbo.sp_add_jobserver @job_name=N'$(jobname)'
31
+ GO
32
+ USE [msdb]
33
+ GO
34
+
35
+ DECLARE @jobstep_cmd NVARCHAR(max)
36
+ DECLARE @current_stepname NVARCHAR(max)
37
+
38
+ SET @jobstep_cmd = '
39
+ $(sqlquery)
40
+ '
41
+
42
+ SET @current_stepname = 'Run TSQL'
43
+
44
+ DECLARE @onsuccessaction int = 1
45
+
46
+ EXEC msdb.dbo.sp_add_jobstep @job_name=N'$(jobname)', @step_name=@current_stepname,
47
+ @cmdexec_success_code=0,
48
+ @on_success_action=@onsuccessaction,
49
+ @on_fail_action=2,
50
+ @retry_attempts=0,
51
+ @retry_interval=0,
52
+ @os_run_priority=0, @subsystem=N'TSQL',
53
+ @command=@jobstep_cmd,
54
+ @database_name=N'master',
55
+ @flags=12
56
+
57
+ --EXEC msdb.dbo.sp_add_jobschedule @job_name=N'$(jobname)', @name=N'$(schedulename)',
58
+ -- @enabled=1,
59
+ -- @freq_type=4,
60
+ -- @freq_interval=1,
61
+ -- @freq_subday_type=8,
62
+ -- @freq_subday_interval=1,
63
+ -- @freq_relative_interval=0,
64
+ -- @freq_recurrence_factor=1,
65
+ -- @active_start_date=20160127,
66
+ -- @active_end_date=99991231,
67
+ -- @active_start_time=1000,
68
+ -- @active_end_time=235959
69
+
70
+ IF EXISTS (SELECT * FROM msdb.dbo.sysjobs WHERE name LIKE '$(jobname)')
71
+ BEGIN
72
+ PRINT ('Job ''$(jobname)'' created on ' + CONVERT(nvarchar, @@SERVERNAME) + '.')
73
+ END
74
+ ELSE
75
+ BEGIN
76
+ PRINT ('Job ''$(jobname)'' could not be created on ' + CONVERT(nvarchar, @@SERVERNAME) + '.')
77
+ END
78
+ GO
79
+
80
+ EXEC msdb.dbo.sp_start_job @job_name=N'$(jobname)'
81
+ GO
@@ -0,0 +1,70 @@
1
+ DECLARE @jobName NVARCHAR(255)
2
+ SET @jobName = '$(jobname)'
3
+
4
+ SELECT
5
+ [sJOB].[job_id] AS [JobID]
6
+ , [sJOB].[name] AS [JobName]
7
+ , CASE
8
+ WHEN [sJOBH].[run_date] IS NULL OR [sJOBH].[run_time] IS NULL THEN NULL
9
+ ELSE CAST(
10
+ CAST([sJOBH].[run_date] AS CHAR(8))
11
+ + ' '
12
+ + STUFF(
13
+ STUFF(RIGHT('000000' + CAST([sJOBH].[run_time] AS VARCHAR(6)), 6)
14
+ , 3, 0, ':')
15
+ , 6, 0, ':')
16
+ AS DATETIME)
17
+ END AS [LastRunDateTime]
18
+ , CASE [sJOBH].[run_status]
19
+ WHEN 0 THEN 'Failed'
20
+ WHEN 1 THEN 'Succeeded'
21
+ WHEN 2 THEN 'Retry'
22
+ WHEN 3 THEN 'Canceled'
23
+ WHEN 4 THEN 'Running' -- In Progress
24
+ END AS [LastRunStatus]
25
+ , STUFF(
26
+ STUFF(RIGHT('000000' + CAST([sJOBH].[run_duration] AS VARCHAR(6)), 6)
27
+ , 3, 0, ':')
28
+ , 6, 0, ':')
29
+ AS [LastRunDuration (HH:MM:SS)]
30
+ , [sJOBH].[message] AS [LastRunStatusMessage]
31
+ , CASE [sJOBSCH].[NextRunDate]
32
+ WHEN 0 THEN NULL
33
+ ELSE CAST(
34
+ CAST([sJOBSCH].[NextRunDate] AS CHAR(8))
35
+ + ' '
36
+ + STUFF(
37
+ STUFF(RIGHT('000000' + CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)), 6)
38
+ , 3, 0, ':')
39
+ , 6, 0, ':')
40
+ AS DATETIME)
41
+ END AS [NextRunDateTime]
42
+ FROM
43
+ [msdb].[dbo].[sysjobs] AS [sJOB]
44
+ LEFT JOIN (
45
+ SELECT
46
+ [job_id]
47
+ , MIN([next_run_date]) AS [NextRunDate]
48
+ , MIN([next_run_time]) AS [NextRunTime]
49
+ FROM [msdb].[dbo].[sysjobschedules]
50
+ GROUP BY [job_id]
51
+ ) AS [sJOBSCH]
52
+ ON [sJOB].[job_id] = [sJOBSCH].[job_id]
53
+ LEFT JOIN (
54
+ SELECT
55
+ [job_id]
56
+ , [run_date]
57
+ , [run_time]
58
+ , [run_status]
59
+ , [run_duration]
60
+ , [message]
61
+ , ROW_NUMBER() OVER (
62
+ PARTITION BY [job_id]
63
+ ORDER BY [run_date] DESC, [run_time] DESC
64
+ ) AS RowNumber
65
+ FROM [msdb].[dbo].[sysjobhistory]
66
+ WHERE [step_id] = 0
67
+ ) AS [sJOBH]
68
+ ON [sJOB].[job_id] = [sJOBH].[job_id]
69
+ AND [sJOBH].[RowNumber] = 1
70
+ WHERE [sJOB].[name] LIKE @jobName
@@ -0,0 +1,21 @@
1
+ DECLARE @jobName NVARCHAR(255)
2
+ SET @jobName = '$(jobname)'
3
+
4
+ SELECT
5
+ ja.job_id,
6
+ j.name AS job_name,
7
+ ja.start_execution_date,
8
+ ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
9
+ Js.step_name
10
+ FROM msdb.dbo.sysjobactivity ja
11
+ LEFT JOIN msdb.dbo.sysjobhistory jh
12
+ ON ja.job_history_id = jh.instance_id
13
+ JOIN msdb.dbo.sysjobs j
14
+ ON ja.job_id = j.job_id
15
+ JOIN msdb.dbo.sysjobsteps js
16
+ ON ja.job_id = js.job_id
17
+ AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
18
+ WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
19
+ AND start_execution_date is not null
20
+ AND stop_execution_date is null
21
+ AND j.name like @jobName
@@ -0,0 +1,8 @@
1
+ IF EXISTS (SELECT 1 FROM master.dbo.sysprocesses WHERE program_name = N'SQLAgent - Generic Refresher')
2
+ BEGIN
3
+ SELECT 1 AS 'SQLServerAgentRunning'
4
+ END
5
+ ELSE
6
+ BEGIN
7
+ SELECT 0 AS 'SQLServerAgentRunning'
8
+ END
@@ -0,0 +1,72 @@
1
+ USE [master]
2
+
3
+ SET NOCOUNT ON
4
+
5
+ DECLARE @timeout int
6
+ DECLARE @start_time datetime
7
+
8
+ RAISERROR ('Waiting for the replica to start communicating...', 10, 1) WITH NOWAIT
9
+ -- Wait for the replica to start communicating
10
+ BEGIN TRY
11
+ DECLARE @conn bit
12
+ DECLARE @replica_id uniqueidentifier
13
+ DECLARE @group_id uniqueidentifier
14
+ SET @conn = 0
15
+ SET @timeout = 300 -- wait for 5 minutes
16
+
17
+ IF (serverproperty('IsHadrEnabled') = 1)
18
+ AND (isnull((SELECT member_state FROM master.sys.dm_hadr_cluster_members WHERE upper(member_name COLLATE Latin1_General_CI_AS) = upper(CAST(serverproperty('ComputerNamePhysicalNetBIOS') AS nvarchar(256)) COLLATE Latin1_General_CI_AS)), 0) <> 0)
19
+ AND (isnull((SELECT state FROM master.sys.database_mirroring_ENDpoints), 1) = 0)
20
+ BEGIN
21
+ SELECT @group_id = ags.group_id FROM master.sys.availability_groups AS ags WHERE name = N'$(availabilitygroupname)'
22
+ SELECT @replica_id = replicas.replica_id FROM master.sys.availability_replicas AS replicas WHERE upper(replicas.replica_server_name COLLATE Latin1_General_CI_AS) = upper(@@SERVERNAME COLLATE Latin1_General_CI_AS) AND group_id = @group_id
23
+ WHILE @conn <> 1 AND @timeout > 0
24
+ BEGIN
25
+ SET @conn = isnull((SELECT connected_state FROM master.sys.dm_hadr_availability_replica_states AS states WHERE states.replica_id = @replica_id), 1)
26
+ IF @conn = 1
27
+ BEGIN
28
+ -- exit loop when the replica is connected, or IF the query cannot find the replica status
29
+ BREAK
30
+ END
31
+ WAITFOR DELAY '00:00:10'
32
+ SET @timeout = @timeout - 10
33
+ RAISERROR ('Retrying communication in 10 seconds...', 10, 1) WITH NOWAIT
34
+ END
35
+ PRINT ('Communication established.')
36
+ END
37
+ END TRY
38
+ BEGIN CATCH
39
+ PRINT ('WARNING. Communication was NOT established. Check to ensure AlwaysOn Availability was configured correctly!')
40
+ -- IF the wait loop fails, do not stop execution of the alter database statement
41
+ END CATCH
42
+
43
+ SET @timeout = 60 -- wait for up to 60 seconds
44
+ SET @start_time = GETDATE()
45
+ WHILE GETDATE() < DATEADD(second, @timeout, @start_time)
46
+ BEGIN
47
+ BEGIN TRY
48
+ IF EXISTS(SELECT * FROM master.sys.availability_groups AS AG
49
+ INNER JOIN master.sys.dm_hadr_database_replica_states dbrs
50
+ ON AG.group_id = dbrs.group_id
51
+ WHERE DB_NAME(database_id) = '$(databasename)' AND name = '$(availabilitygroupname)' AND dbrs.is_local = 1 AND dbrs.synchronization_state = 2 AND ISNULL(dbrs.is_suspended, 0) = 0)
52
+ BEGIN
53
+ PRINT ('Database is in availability group and synchronized.')
54
+ BREAK
55
+ END
56
+ ALTER DATABASE [$(databasename)] SET HADR AVAILABILITY GROUP = [$(availabilitygroupname)];
57
+ BREAK
58
+ END TRY
59
+ BEGIN CATCH
60
+ RAISERROR ('WARNING. Unable to add database to availability group. Retrying in 5 seconds...', 10, 1) WITH NOWAIT
61
+ END CATCH
62
+
63
+ WAITFOR DELAY '00:00:05'
64
+ END
65
+
66
+ IF NOT EXISTS(SELECT * FROM master.sys.availability_groups AS AG
67
+ INNER JOIN master.sys.dm_hadr_database_replica_states dbrs
68
+ ON AG.group_id = dbrs.group_id
69
+ WHERE DB_NAME(database_id) = '$(databasename)' AND name = '$(availabilitygroupname)' AND dbrs.is_local = 1 AND dbrs.synchronization_state = 2 AND ISNULL(dbrs.is_suspended, 0) = 0)
70
+ BEGIN
71
+ ALTER DATABASE [$(databasename)] SET HADR AVAILABILITY GROUP = [$(availabilitygroupname)]; -- Run it one more time if it timed out and don't catch any error
72
+ END
@@ -0,0 +1,16 @@
1
+ SET NOCOUNT ON
2
+
3
+ IF NOT EXISTS (SELECT AG.name AS [AvailabilityGroup]
4
+ FROM master.sys.availability_groups AS AG
5
+ LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
6
+ ON AG.group_id = agstates.group_id
7
+ INNER JOIN master.sys.availability_replicas AS AR
8
+ ON AG.group_id = AR.group_id
9
+ INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
10
+ ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1 AND arstates.role = 1
11
+ INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
12
+ ON arstates.replica_id = dbcs.replica_id AND dbcs.database_name LIKE '$(databasename)' AND dbcs.is_database_joined = 1)
13
+ BEGIN
14
+ ALTER AVAILABILITY GROUP [$(availabilitygroupname)]
15
+ ADD DATABASE [$(databasename)];
16
+ END
@@ -0,0 +1,34 @@
1
+ DECLARE @database_name NVARCHAR(512)
2
+ SET @database_name = '$(databasename)'
3
+
4
+ SELECT TOP 1
5
+ database_name,
6
+ ag.name as ag_name,
7
+ adc.database_name,
8
+ r.replica_server_name,
9
+ start_time,
10
+ completion_time,
11
+ current_state,
12
+ failure_state_desc,
13
+ number_of_attempts,
14
+ failure_condition_level,
15
+ transfer_rate_bytes_per_second,
16
+ transferred_size_bytes,
17
+ database_size_bytes,
18
+ start_time_utc,
19
+ end_time_utc,
20
+ estimate_time_complete_utc,
21
+ CASE WHEN current_state = 'COMPLETED' THEN 100 ELSE ROUND((CONVERT(float, estimate_time_complete_utc - start_time_utc) - CONVERT(float, estimate_time_complete_utc - GETUTCDATE()))/CONVERT(float, estimate_time_complete_utc - start_time_utc) * 100, 1) END AS [time_elapsed_percent_complete],
22
+ CASE WHEN current_state = 'COMPLETED' THEN 100 ELSE ROUND(CONVERT(float, transferred_size_bytes) / CONVERT(float, database_size_bytes) * 100, 1) END AS [transferred_size_percent_complete],
23
+ total_disk_io_wait_time_ms,
24
+ total_network_wait_time_ms,
25
+ is_compression_enabled
26
+ FROM sys.availability_groups ag
27
+ JOIN sys.availability_replicas r ON ag.group_id = r.group_id
28
+ JOIN sys.availability_databases_cluster adc on ag.group_id=adc.group_id
29
+ JOIN sys.dm_hadr_automatic_seeding AS dhas
30
+ ON dhas.ag_id = ag.group_id
31
+ LEFT JOIN sys.dm_hadr_physical_seeding_stats AS dhpss
32
+ ON adc.database_name = dhpss.local_database_name
33
+ WHERE database_name = @database_name
34
+ ORDER BY start_time DESC
@@ -0,0 +1,2 @@
1
+ ALTER AVAILABILITY GROUP [$(availabilitygroupname)]
2
+ MODIFY REPLICA ON N'$(secondaryreplica)' WITH (SEEDING_MODE = $(seedingmode))
@@ -0,0 +1,2 @@
1
+ ALTER AVAILABILITY GROUP [$(availabilitygroupname)]
2
+ MODIFY REPLICA ON N'$(primarysqlserver)' WITH (SEEDING_MODE = MANUAL)
@@ -0,0 +1 @@
1
+ ALTER AVAILABILITY GROUP [$(availabilitygroupname)] GRANT CREATE ANY DATABASE;
@@ -0,0 +1,58 @@
1
+ DECLARE @dbname nvarchar(100)
2
+
3
+ SET @dbname = '$(databasename)'
4
+
5
+ IF EXISTS (
6
+ SELECT dbcs.database_name
7
+ FROM master.sys.availability_groups AS AG
8
+ LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
9
+ ON AG.group_id = agstates.group_id
10
+ INNER JOIN master.sys.availability_replicas AS AR
11
+ ON AG.group_id = AR.group_id
12
+ INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
13
+ ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1 AND arstates.role = 1 -- arstates.role: 1=Primary, 2=Secondary
14
+ INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
15
+ ON arstates.replica_id = dbcs.replica_id AND dbcs.database_name LIKE @dbname AND dbcs.is_database_joined = 1
16
+ LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
17
+ ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id AND dbrs.synchronization_state = 2 AND ISNULL(dbrs.is_suspended, 0) = 0)
18
+ BEGIN
19
+ PRINT ('FATAL ERROR: The specified database to be dropped is in the primary availability group. Secondary database NOT dropped!')
20
+ SELECT 0 AS Success
21
+ RETURN
22
+ END
23
+ ELSE
24
+ BEGIN
25
+ -- If the database does not exist, return success
26
+ IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @dbname OR name = @dbname))
27
+ BEGIN
28
+ PRINT ('Database does not exist on ' + CONVERT(NVARCHAR,@@SERVERNAME) + '.')
29
+ SELECT CAST(1 AS bit) AS Success
30
+ RETURN
31
+ END
32
+
33
+ -- Try dropping database repeatedly until successful or timeout occurs
34
+ DECLARE @dropcmd nvarchar(max) = 'DROP DATABASE [' + @dbname + ']'
35
+ DECLARE @timeout int = 60 -- wait for up to 1 minute
36
+
37
+ WHILE EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @dbname OR name = @dbname)) AND @timeout > 0
38
+ BEGIN
39
+ BEGIN TRY
40
+ EXEC sp_executesql @dropcmd
41
+ END TRY
42
+ BEGIN CATCH
43
+ IF @timeout <= 0
44
+ BEGIN
45
+ PRINT ('Failed to drop secondary database from ' + CONVERT(NVARCHAR,@@SERVERNAME) + '!')
46
+ SELECT CAST(0 AS bit) AS Success
47
+ RETURN
48
+ END
49
+
50
+ WAITFOR DELAY '00:00:05'
51
+ SET @timeout = @timeout - 5
52
+ RAISERROR ('WARNING. Database could not be dropped. Trying again in 5 seconds...', 10, 1) WITH NOWAIT
53
+ END CATCH
54
+ END
55
+
56
+ PRINT ('Secondary database dropped from ' + CONVERT(NVARCHAR,@@SERVERNAME) + '.')
57
+ SELECT CAST(1 AS bit) AS Success
58
+ END
@@ -0,0 +1,2 @@
1
+ ALTER AVAILABILITY GROUP [$(availabilitygroupname)]
2
+ REMOVE DATABASE [$(databasename)];
@@ -0,0 +1,14 @@
1
+ SET NOCOUNT ON
2
+
3
+ SELECT dbrs.synchronization_state_desc, dbrs.synchronization_health_desc
4
+ FROM master.sys.availability_groups AS AG
5
+ LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
6
+ ON AG.group_id = agstates.group_id
7
+ INNER JOIN master.sys.availability_replicas AS AR
8
+ ON AG.group_id = AR.group_id
9
+ INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
10
+ ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1 AND arstates.role = 2 -- arstates.role: 1=Primary, 2=Secondary
11
+ INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
12
+ ON arstates.replica_id = dbcs.replica_id AND dbcs.database_name LIKE '$(databasename)' AND dbcs.is_database_joined = 1
13
+ LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
14
+ ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id AND dbrs.synchronization_state = 2 AND ISNULL(dbrs.is_suspended, 0) = 0
@@ -0,0 +1,95 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @database_name nvarchar(max)
4
+ DECLARE @backup_name nvarchar(max)
5
+ DECLARE @credential nvarchar(max)
6
+ DECLARE @database_size int
7
+ DECLARE @disk_files nvarchar(max)
8
+ DECLARE @backup_location nvarchar(max)
9
+ DECLARE @backup_type nvarchar(5)
10
+ DECLARE @file_counter int
11
+ DECLARE @size_increment int
12
+ DECLARE @i int
13
+ DECLARE @sql nvarchar(max)
14
+ DECLARE @log_only bit
15
+ DECLARE @split_files bit
16
+ DECLARE @compression nvarchar(5)
17
+ DECLARE @format bit
18
+ DECLARE @copy_only bit
19
+ DECLARE @init bit
20
+ DECLARE @skip bit
21
+ DECLARE @rewind bit
22
+ DECLARE @unload bit
23
+ DECLARE @stats nvarchar(3)
24
+ DECLARE @backup_file_extension nvarchar(4)
25
+
26
+ SET @database_name = '$(bkupdbname)'
27
+ SET @backup_name = '$(bkupname)'
28
+ SET @credential = '$(credential)'
29
+ SET @log_only = '$(logonly)'
30
+ SET @compression = '$(compressbackup)'
31
+ SET @backup_location = '$(bkupdest)'
32
+ SET @backup_type = '$(bkuptype)'
33
+ SET @split_files = '$(splitfiles)'
34
+ SET @format = '$(formatbackup)'
35
+ SET @copy_only = '$(copyonly)'
36
+ SET @init = '$(init)'
37
+ SET @skip = '$(skip)'
38
+ SET @rewind = '$(rewind)'
39
+ SET @unload = '$(unload)'
40
+ SET @stats = '$(stats)'
41
+ SET @size_increment = '$(bkuppartmaxsize)'
42
+ SET @file_counter = 1
43
+
44
+ IF (RIGHT(@backup_location, 1) != '\' AND @backup_type LIKE 'DISK') SET @backup_location += '\';
45
+ SET @backup_file_extension = CASE WHEN @log_only = 1 THEN '.trn' ELSE '.bak' END
46
+
47
+ IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = @database_name)
48
+ BEGIN
49
+ PRINT ('Error: [' + @database_name + '] does not exist on [' + CONVERT(nvarchar,SERVERPROPERTY('ServerName')) + ']!')
50
+ RETURN
51
+ END
52
+
53
+ IF @split_files = 1 AND @backup_type != 'URL'
54
+ BEGIN
55
+ SELECT @database_size = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2))
56
+ FROM sys.master_files WITH(NOWAIT)
57
+ WHERE database_id = DB_ID(@database_name) -- for current db
58
+ GROUP BY database_id
59
+
60
+ SET @i = @size_increment
61
+
62
+ WHILE (@i < @database_size)
63
+ BEGIN
64
+ IF @disk_files is null SET @disk_files = @backup_type + ' = N''' + @backup_location + @backup_name + '.part1' + @backup_file_extension + ''''
65
+ SET @file_counter = @file_counter + 1
66
+ SET @disk_files = @disk_files + ', ' + @backup_type + ' = N''' + @backup_location + @backup_name + '.part' + CONVERT(nvarchar(2),@file_counter) + @backup_file_extension + ''''
67
+ SET @i = @i + @size_increment
68
+ END
69
+ END
70
+ ELSE
71
+ BEGIN
72
+ SET @file_counter = 1
73
+ END
74
+
75
+ IF (@file_counter = 1)
76
+ BEGIN
77
+ SET @disk_files = @backup_type + ' = N''' + @backup_location + @backup_name + @backup_file_extension + ''''
78
+ END
79
+
80
+ SET @sql = 'BACKUP ' + CASE WHEN @log_only = 1 THEN 'LOG' ELSE 'DATABASE' END + ' [' + @database_name + '] TO ' + @disk_files + ' WITH ' +
81
+ CASE @compression WHEN 'true' THEN 'COMPRESSION, ' WHEN 'false' THEN 'NO_COMPRESSION, ' ELSE '' END +
82
+ CASE WHEN @format = 1 THEN 'FORMAT' ELSE 'NOFORMAT' END + ', ' +
83
+ CASE WHEN @copy_only = 1 THEN 'COPY_ONLY, ' ELSE '' END +
84
+ CASE WHEN @init = 1 THEN 'INIT' ELSE 'NOINIT' END +
85
+ ', NAME = N''' + @database_name + '-Full Database Backup'', ' +
86
+ CASE WHEN @skip = 1 THEN 'SKIP' ELSE 'NOSKIP' END + ', ' +
87
+ CASE WHEN @rewind = 1 THEN 'REWIND' ELSE 'NOREWIND' END + ', ' +
88
+ CASE WHEN @unload = 1 THEN 'UNLOAD' ELSE 'NOUNLOAD' END + ', ' +
89
+ CASE WHEN @credential NOT LIKE '' THEN 'CREDENTIAL = ''' + @credential + ''', ' ELSE '' END + 'STATS = ' + @stats
90
+
91
+ PRINT ('')
92
+ PRINT ('Starting backup of [' + @database_name + ']...')
93
+ PRINT ('')
94
+
95
+ EXEC (@sql)
@@ -0,0 +1,100 @@
1
+
2
+ /*
3
+
4
+ Uses:
5
+ How To Use:
6
+ Set the compression description @compressionDesc to the type of compression you would like to use.
7
+ Note - the script will change the compression type regardless of previous compression setting
8
+
9
+ How it Works
10
+ Builds up a table of all tables\index based on the table filter results.
11
+ Uses a cursor to build dynamic ddl sql statements to change the compression based on @compressionDesc
12
+ Note:
13
+ */
14
+
15
+ Declare @compressionDesc as NvarChar(10)
16
+ Set @compressionDesc = 'PAGE' --PAGE, ROW or NONE
17
+
18
+ BEGIN
19
+ SET NOCOUNT ON
20
+ SET QUOTED_IDENTIFIER ON
21
+
22
+ CREATE TABLE #dbObjects(PK INT IDENTITY
23
+ NOT NULL
24
+ PRIMARY KEY,
25
+ schema_name VARCHAR(250),
26
+ object_name VARCHAR(250),
27
+ index_id INT,
28
+ ixName VARCHAR(255),
29
+ ixType VARCHAR(50),
30
+ partition_number INT,
31
+ data_compression_desc VARCHAR(50))
32
+ INSERT INTO dbo.#dbObjects(schema_name,
33
+ object_name,
34
+ index_id,
35
+ ixName,
36
+ ixType,
37
+ partition_number,
38
+ data_compression_desc)
39
+ SELECT S.name,
40
+ O.name,
41
+ I.index_id,
42
+ I.name,
43
+ I.type_desc,
44
+ P.partition_number,
45
+ P.data_compression_desc
46
+ FROM sys.schemas AS S
47
+ JOIN sys.objects AS O ON S.schema_id = O.schema_id
48
+ JOIN sys.indexes AS I ON O.object_id = I.object_id
49
+ JOIN sys.partitions AS P ON I.object_id = P.object_id
50
+ AND I.index_id = P.index_id
51
+ WHERE O.TYPE = 'U' and P.data_compression_desc in ('NONE','ROW')
52
+
53
+ -- Determine Compression Estimates
54
+ DECLARE @PK INT,
55
+ @Schema VARCHAR(150),
56
+ @object VARCHAR(150),
57
+ @DAD VARCHAR(25),
58
+ @partNO INT,
59
+ @indexID INT,
60
+ @ixName VARCHAR(250),
61
+ @SQL NVARCHAR(MAX),
62
+ @ixType VARCHAR(50)
63
+
64
+ -- set the compression
65
+ DECLARE cCompress CURSOR FAST_FORWARD
66
+ FOR SELECT #dbObjects.schema_name,
67
+ #dbObjects.object_name,
68
+ #dbObjects.partition_number,
69
+ #dbObjects.ixName,
70
+ #dbObjects.ixType
71
+ FROM dbo.#dbObjects
72
+
73
+ OPEN cCompress
74
+
75
+ FETCH cCompress INTO @Schema, @object, @partNO, @ixName, @ixType-- prime the cursor
76
+
77
+ WHILE @@Fetch_Status = 0
78
+ BEGIN
79
+
80
+ IF @ixType = 'CLUSTERED'
81
+ OR @ixType = 'HEAP'
82
+ BEGIN
83
+ SET @SQL = 'ALTER TABLE ' + @Schema + '.' + @object + ' Rebuild with (data_compression = '+@compressionDesc+' )'
84
+ END
85
+ ELSE
86
+ BEGIN
87
+ SET @SQL = 'ALTER INDEX ' + @ixName + ' on ' + @Schema + '.' + @object + ' Rebuild with (data_compression = '+@compressionDesc+' )'
88
+ END
89
+
90
+ PRINT @SQL
91
+ EXEC sp_executesql @SQL
92
+
93
+ FETCH cCompress INTO @Schema, @object, @partNO, @ixName, @ixType
94
+ END
95
+
96
+ CLOSE cCompress
97
+ DEALLOCATE cCompress
98
+ END
99
+
100
+ DROP TABLE #dbObjects
@@ -0,0 +1,16 @@
1
+ DECLARE @sql_login nvarchar(max)
2
+ DECLARE @password nvarchar(max)
3
+ DECLARE @user_cmd nvarchar(max)
4
+
5
+ SET @sql_login = '$(templogin)'
6
+ SET @password = '$(password)'
7
+
8
+ -- Add user
9
+ SET @user_cmd =
10
+ 'USE [master]
11
+ CREATE LOGIN [' + @sql_login + '] WITH PASSWORD=N''' + @password + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'
12
+
13
+ PRINT ('Creating new SQL Login: ' + @sql_login + '...')
14
+ EXEC (@user_cmd)
15
+
16
+ --PRINT (@user_cmd)
@@ -0,0 +1,51 @@
1
+ DECLARE @db_name nvarchar(max)
2
+ DECLARE @database_cmd nvarchar(max)
3
+ DECLARE @singleuser_cmd nvarchar(max)
4
+ DECLARE @replcheck_cmd nvarchar(max)
5
+ DECLARE @rowcount int
6
+
7
+ SET @db_name = '$(databasename)'
8
+
9
+ IF EXISTS (SELECT * FROM sys.sysdatabases WHERE Name = @db_name)
10
+ BEGIN
11
+ SET @singleuser_cmd =
12
+ 'ALTER DATABASE [' + @db_name + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
13
+
14
+ SET @database_cmd =
15
+ 'DROP DATABASE [' + @db_name + ']
16
+ EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N''' + @db_name + '''
17
+ RAISERROR (''Database [' + @db_name + '] dropped.'', 10, 1) WITH NOWAIT'
18
+
19
+ SET @replcheck_cmd =
20
+ N'IF EXISTS (SELECT * FROM [' + @db_name + '].[INFORMATION_SCHEMA].[TABLES]
21
+ WHERE TABLE_NAME = ''syspublications'')
22
+ BEGIN
23
+ SELECT @rowcount=count(*) FROM [' + @db_name + '].[dbo].syspublications
24
+ END
25
+ ELSE
26
+ BEGIN
27
+ SET @rowcount = 0
28
+ END
29
+ '
30
+
31
+ RAISERROR ('Checking database for publications...', 10, 1) WITH NOWAIT
32
+ EXEC sp_executesql @replcheck_cmd, N'@rowcount int output', @rowcount output;
33
+ IF (@rowcount > 0)
34
+ BEGIN
35
+ RAISERROR ('Failed to drop database! Database is being used for replication.', 20, 1) WITH LOG
36
+ RETURN
37
+ END
38
+ ELSE
39
+ BEGIN
40
+ RAISERROR ('No replication publications detected. Proceeding...', 10, 1) WITH NOWAIT
41
+ END
42
+
43
+ EXEC (@singleuser_cmd)
44
+ EXEC (@database_cmd)
45
+
46
+ PRINT ('Command Complete')
47
+ END
48
+ ELSE
49
+ BEGIN
50
+ PRINT ('Database ' + @db_name + ' not found!')
51
+ END