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