sql_cmd 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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