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.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/lib/optional_dependencies.rb +30 -0
- data/lib/sql_cmd/agent.rb +32 -0
- data/lib/sql_cmd/always_on.rb +267 -0
- data/lib/sql_cmd/azure.rb +80 -0
- data/lib/sql_cmd/backups.rb +276 -0
- data/lib/sql_cmd/config.rb +62 -0
- data/lib/sql_cmd/database.rb +618 -0
- data/lib/sql_cmd/format.rb +124 -0
- data/lib/sql_cmd/query.rb +350 -0
- data/lib/sql_cmd/security.rb +21 -0
- data/lib/sql_cmd/sql_helper.ps1 +89 -0
- data/lib/sql_cmd.rb +44 -0
- data/sql_scripts/Agent/CreateSQLJob.sql +81 -0
- data/sql_scripts/Agent/JobLastRunInfo.sql +70 -0
- data/sql_scripts/Agent/JobRunStatus.sql +21 -0
- data/sql_scripts/Agent/SQLAgentStatus.sql +8 -0
- data/sql_scripts/AlwaysOn/AddDatabaseToAvailabilityGroupOnSecondary.sql +72 -0
- data/sql_scripts/AlwaysOn/AddDatabaseToPrimaryAvailabilityGroup.sql +16 -0
- data/sql_scripts/AlwaysOn/AutomaticSeedingProgress.sql +34 -0
- data/sql_scripts/AlwaysOn/ConfigurePrimaryForAutomaticSeeding.sql +2 -0
- data/sql_scripts/AlwaysOn/ConfigurePrimaryForManualSeeding.sql +2 -0
- data/sql_scripts/AlwaysOn/ConfigureSecondaryForAutomaticSeeding.sql +1 -0
- data/sql_scripts/AlwaysOn/DropSecondary.sql +58 -0
- data/sql_scripts/AlwaysOn/RemoveDatabaseFromGroup.sql +2 -0
- data/sql_scripts/AlwaysOn/SynchronizationState.sql +14 -0
- data/sql_scripts/Database/BackupDatabase.sql +95 -0
- data/sql_scripts/Database/CompressAllTables.sql +100 -0
- data/sql_scripts/Database/CreateLogin.sql +16 -0
- data/sql_scripts/Database/DropDatabase.sql +51 -0
- data/sql_scripts/Database/GetBackupFiles.sql +31 -0
- data/sql_scripts/Database/GetBackupHeaders.sql +94 -0
- data/sql_scripts/Database/GetFileInfoFromBackup.sql +9 -0
- data/sql_scripts/Database/RestoreDatabase.sql +185 -0
- data/sql_scripts/Database/SetFullRecovery.sql +19 -0
- data/sql_scripts/Database/SetSQLCompatibility.sql +33 -0
- data/sql_scripts/Security/AssignDatabaseRoles.sql +44 -0
- data/sql_scripts/Security/CreateOrUpdateCredential.sql +11 -0
- data/sql_scripts/Security/CreateSqlLogin.sql +20 -0
- data/sql_scripts/Security/ExportDatabasePermissions.sql +757 -0
- data/sql_scripts/Security/GenerateCreateLoginsScript.sql +144 -0
- data/sql_scripts/Security/GenerateValidateLoginsScript.sql +83 -0
- data/sql_scripts/Security/GetUserSID.sql +3 -0
- data/sql_scripts/Security/UpdateSqlPassword.sql +24 -0
- data/sql_scripts/Security/ValidateDatabaseRoles.sql +12 -0
- data/sql_scripts/Status/ANSINullsOffTableCount.sql +13 -0
- data/sql_scripts/Status/ANSINullsOffTables.sql +9 -0
- data/sql_scripts/Status/BackupProgress.sql +17 -0
- data/sql_scripts/Status/DatabaseInfo.sql +199 -0
- data/sql_scripts/Status/DatabaseSize.sql +26 -0
- data/sql_scripts/Status/DiskSpace.sql +14 -0
- data/sql_scripts/Status/RestoreProgress.sql +17 -0
- data/sql_scripts/Status/SQLSettings.sql +182 -0
- data/sql_scripts/Status/UncompressedTableCount.sql +27 -0
- 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,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 @@
|
|
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,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
|