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,144 @@
1
+ SET NOCOUNT ON
2
+
3
+ USE [master]
4
+
5
+ DECLARE @newline nvarchar(2)
6
+ SET @newline = nchar(13)+nchar(10)
7
+ DECLARE @remove_existing_logins bit
8
+ DECLARE @sql_hexadecimal nvarchar(max)
9
+ SET @remove_existing_logins = '$(removeexistinglogins)'
10
+
11
+ SET @sql_hexadecimal = '
12
+ DECLARE @binvalue varbinary(256)
13
+
14
+ SET @binvalue = CONVERT(varbinary(256), ''#(binvalue)'', 1)
15
+ DECLARE @charvalue varchar (514)
16
+ DECLARE @i int
17
+ DECLARE @length int
18
+ DECLARE @hexstring char(16)
19
+ SELECT @charvalue = ''0x''
20
+ SELECT @i = 1
21
+ SELECT @length = DATALENGTH (@binvalue)
22
+ SELECT @hexstring = ''0123456789ABCDEF''
23
+ WHILE (@i <= @length)
24
+ BEGIN
25
+ DECLARE @tempint int
26
+ DECLARE @firstint int
27
+ DECLARE @secondint int
28
+ SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
29
+ SELECT @firstint = FLOOR(@tempint/16)
30
+ SELECT @secondint = @tempint - (@firstint*16)
31
+ SELECT @charvalue = @charvalue +
32
+ SUBSTRING(@hexstring, @firstint+1, 1) +
33
+ SUBSTRING(@hexstring, @secondint+1, 1)
34
+ SELECT @i = @i + 1
35
+ END
36
+
37
+ SELECT @hexvalue = @charvalue
38
+ '
39
+
40
+ DECLARE @sql_password nvarchar(max)
41
+ DECLARE @sql_sid nvarchar(max)
42
+
43
+ DECLARE @name sysname
44
+ DECLARE @type varchar (1)
45
+ DECLARE @hasaccess int
46
+ DECLARE @denylogin int
47
+ DECLARE @is_disabled int
48
+ DECLARE @PWD_varbinary varbinary (256)
49
+ DECLARE @PWD_string varchar (514)
50
+ DECLARE @SID_varbinary varbinary (85)
51
+ DECLARE @SID_string varchar (514)
52
+ DECLARE @createlogins_sql varchar (max)
53
+ DECLARE @validatelogins_sql varchar (max)
54
+ DECLARE @is_policy_checked varchar (3)
55
+ DECLARE @is_expiration_checked varchar (3)
56
+
57
+ DECLARE @defaultdb sysname
58
+
59
+ DECLARE login_curs CURSOR FOR
60
+ SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin
61
+ FROM sys.server_principals p
62
+ LEFT JOIN sys.syslogins l
63
+ ON ( l.name = p.name )
64
+ INNER JOIN [$(databasename)].sys.database_principals d
65
+ ON d.sid = p.sid
66
+ WHERE p.type IN ( 'S', 'G', 'U' ) and d.type_desc = 'SQL_USER' AND d.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys')
67
+
68
+ OPEN login_curs
69
+
70
+ FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
71
+ IF (@@fetch_status = -1)
72
+ BEGIN
73
+ SELECT ''
74
+ PRINT 'No logins found.'
75
+ CLOSE login_curs
76
+ DEALLOCATE login_curs
77
+ RETURN
78
+ END
79
+ SET @validatelogins_sql = ''
80
+ SET @createlogins_sql = '/* migrate login script ' + @newline
81
+ SET @createlogins_sql += '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */' + @newline
82
+ WHILE (@@fetch_status <> -1)
83
+ BEGIN
84
+ IF (@@fetch_status <> -2)
85
+ BEGIN
86
+ SET @createlogins_sql += '-- Login: ' + @name + @newline
87
+ SET @createlogins_sql += 'IF ' + CASE WHEN @remove_existing_logins = 0 THEN 'NOT ' ELSE '' END + 'EXISTS (SELECT name FROM master.sys.syslogins WHERE name LIKE ''' + @name + ''')' + @newline + 'BEGIN' + @newline
88
+ IF (@remove_existing_logins = 1)
89
+ BEGIN
90
+ SET @createlogins_sql += 'DROP LOGIN [' + @name + ']' + @newline + 'END' + @newline
91
+ END
92
+ IF (@type IN ( 'G', 'U'))
93
+ BEGIN -- NT authenticated account/group
94
+ SET @createlogins_sql += 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']' + @newline
95
+ END
96
+ ELSE BEGIN -- SQL Server authentication
97
+ -- obtain password and sid
98
+ SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
99
+ SET @sql_password = REPLACE(@sql_hexadecimal, '#(binvalue)', CONVERT(varchar(max), @PWD_varbinary, 1))
100
+ SET @sql_sid = REPLACE(@sql_hexadecimal, '#(binvalue)', CONVERT(varchar(max), @SID_varbinary, 1))
101
+ EXEC sp_executesql @sql_password, N'@hexvalue varchar(514) output', @hexvalue = @PWD_string output;
102
+ EXEC sp_executesql @sql_sid, N'@hexvalue varchar(514) output', @hexvalue = @SID_string output;
103
+
104
+ -- obtain password policy state
105
+ SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
106
+ SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
107
+
108
+ SET @createlogins_sql += 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']' + @newline
109
+
110
+ IF ( @is_policy_checked IS NOT NULL )
111
+ BEGIN
112
+ SET @createlogins_sql += ', CHECK_POLICY = ' + @is_policy_checked + @newline
113
+ END
114
+ IF ( @is_expiration_checked IS NOT NULL )
115
+ BEGIN
116
+ SET @createlogins_sql += ', CHECK_EXPIRATION = ' + @is_expiration_checked + @newline
117
+ END
118
+ END
119
+ IF (@denylogin = 1)
120
+ BEGIN -- login is denied access
121
+ SET @createlogins_sql += '; DENY CONNECT SQL TO ' + QUOTENAME( @name ) + @newline
122
+ END
123
+ ELSE IF (@hasaccess = 0)
124
+ BEGIN -- login exists but does not have access
125
+ SET @createlogins_sql += '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name ) + @newline
126
+ END
127
+ IF (@is_disabled = 1)
128
+ BEGIN -- login is disabled
129
+ SET @createlogins_sql += '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE' + @newline
130
+ END
131
+ IF (@remove_existing_logins = 0) -- If existing logins were not removed, the script is wrapped in a conditional and needs to be closed with 'END'
132
+ BEGIN
133
+ SET @createlogins_sql += 'END;' + @newline
134
+ END
135
+ SET @validatelogins_sql += 'IF NOT EXISTS (SELECT name FROM master.sys.syslogins WHERE name LIKE ''' + @name + ''')' + @newline + 'BEGIN' + @newline
136
+ SET @validatelogins_sql += 'RAISERROR (''Login [' + @name + '] failed to import!'', 20, 1) WITH LOG' + @newline + 'END' + @newline
137
+ END
138
+
139
+ FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
140
+ END
141
+ CLOSE login_curs
142
+ DEALLOCATE login_curs
143
+
144
+ SELECT @createlogins_sql + @newline + @validatelogins_sql
@@ -0,0 +1,83 @@
1
+ SET NOCOUNT ON
2
+
3
+ USE [master]
4
+
5
+ DECLARE @newline nvarchar(2)
6
+ SET @newline = CHAR(13)+CHAR(10)
7
+ DECLARE @sql_hexadecimal nvarchar(max)
8
+
9
+ SET @sql_hexadecimal = '
10
+ DECLARE @binvalue varbinary(256)
11
+
12
+ SET @binvalue = CONVERT(varbinary(256), ''#(binvalue)'', 1)
13
+ DECLARE @charvalue varchar (514)
14
+ DECLARE @i int
15
+ DECLARE @length int
16
+ DECLARE @hexstring char(16)
17
+ SELECT @charvalue = ''0x''
18
+ SELECT @i = 1
19
+ SELECT @length = DATALENGTH (@binvalue)
20
+ SELECT @hexstring = ''0123456789ABCDEF''
21
+ WHILE (@i <= @length)
22
+ BEGIN
23
+ DECLARE @tempint int
24
+ DECLARE @firstint int
25
+ DECLARE @secondint int
26
+ SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
27
+ SELECT @firstint = FLOOR(@tempint/16)
28
+ SELECT @secondint = @tempint - (@firstint*16)
29
+ SELECT @charvalue = @charvalue +
30
+ SUBSTRING(@hexstring, @firstint+1, 1) +
31
+ SUBSTRING(@hexstring, @secondint+1, 1)
32
+ SELECT @i = @i + 1
33
+ END
34
+
35
+ SELECT @hexvalue = @charvalue
36
+ '
37
+
38
+ DECLARE @sql_sid nvarchar(max)
39
+ DECLARE @name sysname
40
+ DECLARE @type varchar (1)
41
+ DECLARE @SID_varbinary varbinary (85)
42
+ DECLARE @SID_string varchar (514)
43
+ DECLARE @validatelogins_sql varchar (max)
44
+
45
+ DECLARE login_curs CURSOR FOR
46
+ SELECT p.sid, p.name
47
+ FROM sys.server_principals p
48
+ LEFT JOIN sys.syslogins l
49
+ ON ( l.name = p.name )
50
+ INNER JOIN [$(databasename)].sys.database_principals d
51
+ ON d.sid = p.sid
52
+ WHERE p.type IN ( 'S', 'G', 'U' ) and d.type_desc = 'SQL_USER' AND d.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys')
53
+
54
+ OPEN login_curs
55
+
56
+ FETCH NEXT FROM login_curs INTO @SID_varbinary, @name
57
+ IF (@@fetch_status = -1)
58
+ BEGIN
59
+ PRINT 'No logins found.'
60
+ CLOSE login_curs
61
+ DEALLOCATE login_curs
62
+ SELECT 'SELECT CAST(1 AS bit)'
63
+ RETURN
64
+ END
65
+ SET @validatelogins_sql = ''
66
+ WHILE (@@fetch_status <> -1)
67
+ BEGIN
68
+ IF (@@fetch_status <> -2)
69
+ BEGIN
70
+ -- obtain sid
71
+ SET @sql_sid = REPLACE(@sql_hexadecimal, '#(binvalue)', CONVERT(varchar(max), @SID_varbinary, 1))
72
+ EXEC sp_executesql @sql_sid, N'@hexvalue varchar(514) output', @hexvalue = @SID_string output;
73
+
74
+ SET @validatelogins_sql += 'IF NOT EXISTS (SELECT name FROM master.sys.syslogins WHERE name LIKE ''' + @name + ''' AND sid = ' + @SID_string + ')' + @newline + 'BEGIN' + @newline
75
+ SET @validatelogins_sql += 'SELECT CAST(0 AS bit);RETURN' + @newline + 'END' + @newline
76
+ END
77
+
78
+ FETCH NEXT FROM login_curs INTO @SID_varbinary, @name
79
+ END
80
+ CLOSE login_curs
81
+ DEALLOCATE login_curs
82
+
83
+ SELECT @validatelogins_sql + 'SELECT CAST(1 AS bit)'
@@ -0,0 +1,3 @@
1
+ SET NOCOUNT ON
2
+
3
+ SELECT CONVERT(NVARCHAR(max), sid, 1) FROM sys.server_principals WHERE name='$(user)'
@@ -0,0 +1,24 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @login_name nvarchar(max)
4
+ DECLARE @password nvarchar(max)
5
+ DECLARE @user_cmd nvarchar(max)
6
+
7
+ SET @login_name = '$(user)'
8
+ SET @password = '$(password)'
9
+
10
+ -- Create login
11
+ SET @user_cmd =
12
+ 'USE [master]
13
+ IF NOT EXISTS (SELECT name FROM master.dbo.syslogins WHERE name=''' + @login_name + ''')
14
+ BEGIN
15
+ CREATE LOGIN [' + @login_name + '] WITH PASSWORD=N''' + @password + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
16
+ END;
17
+
18
+ ALTER LOGIN [' + @login_name + '] WITH PASSWORD=N''' + @password + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
19
+ ALTER LOGIN [' + @login_name + '] ENABLE;
20
+ '
21
+
22
+ EXEC (@user_cmd)
23
+
24
+ SELECT name, CONVERT(NVARCHAR(max), sid, 1) FROM master.dbo.syslogins WHERE name=@login_name
@@ -0,0 +1,12 @@
1
+ SET NOCOUNT ON
2
+
3
+ USE [$(databasename)]
4
+
5
+ DECLARE @user_principal_id int
6
+ SELECT @user_principal_id = principal_id FROM sys.database_principals
7
+ WHERE name like '$(user)' AND [sid] = $(sid)
8
+
9
+ SELECT * FROM sys.database_role_members drm
10
+ INNER JOIN sys.database_principals dp
11
+ ON drm.role_principal_id = dp.principal_id
12
+ WHERE member_principal_id = @user_principal_id
@@ -0,0 +1,13 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @TableCount int
4
+
5
+ SELECT @TableCount = COUNT(t.[name])
6
+ FROM sys.tables t
7
+ INNER JOIN sys.indexes i ON t.[object_id] = i.object_id
8
+ INNER JOIN sys.partitions p ON i.object_id = p.[object_id] AND i.index_id = p.index_id
9
+ LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
10
+ WHERE t.uses_ansi_nulls = 0 AND t.name NOT LIKE 'sys%' AND t.name NOT LIKE 'MS%'
11
+ GROUP BY t.[name]
12
+
13
+ SELECT COALESCE(@TableCount, 0) AS TableCount
@@ -0,0 +1,9 @@
1
+ SET NOCOUNT ON
2
+
3
+ SELECT t.[name]
4
+ FROM sys.tables t
5
+ INNER JOIN sys.indexes i ON t.[object_id] = i.object_id
6
+ INNER JOIN sys.partitions p ON i.object_id = p.[object_id] AND i.index_id = p.index_id
7
+ LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
8
+ WHERE t.uses_ansi_nulls = 0 AND t.name NOT LIKE 'sys%' AND t.name NOT LIKE 'MS%'
9
+ GROUP BY t.[name]
@@ -0,0 +1,17 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @databaseName nvarchar(128)
4
+
5
+ SET @databaseName = '$(databasename)'
6
+
7
+ SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
8
+ AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
9
+ CONVERT(NUMERIC(10,1),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
10
+ CONVERT(NUMERIC(10,1),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
11
+ CONVERT(NUMERIC(10,1),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
12
+ CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
13
+ CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
14
+ FROM sys.dm_exec_sql_text(sql_handle))) AS [Command text]
15
+ FROM sys.dm_exec_requests r WHERE command IN ('BACKUP DATABASE') AND
16
+ CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2, CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
17
+ FROM sys.dm_exec_sql_text(sql_handle))) LIKE '%BACKUP%[' + @databaseName + ']%'
@@ -0,0 +1,199 @@
1
+ SET NOCOUNT ON;
2
+
3
+ DECLARE @databaseName nvarchar(255)
4
+ DECLARE @replicationStatusTable TABLE(
5
+ ReplicationActive bit,
6
+ DatabaseName nvarchar(128)
7
+ )
8
+ DECLARE @availabilityGroupTable TABLE(
9
+ AvailabilityGroup sysname,
10
+ DatabaseName nvarchar(128),
11
+ AvailabilityGroupRole nvarchar(60),
12
+ ReadableSecondary bit,
13
+ LastRedoneLSN numeric(25,0)
14
+ )
15
+
16
+ SET @databaseName = '$(databasename)'
17
+
18
+ IF NOT EXISTS (SELECT * FROM sys.databases WHERE name LIKE @databaseName)
19
+ BEGIN
20
+ SELECT CAST(1 AS BIT) AS DatabaseNotFound
21
+ RETURN
22
+ END;
23
+
24
+ IF (SELECT state FROM sys.databases WHERE [name] = @databaseName) = 0 -- If the database is not restoring, get this info
25
+ BEGIN
26
+ DECLARE @timeout int
27
+ DECLARE @start_time datetime
28
+ DECLARE @message nvarchar(max)
29
+ SET @timeout = 20 -- wait for up to 20 seconds
30
+ SET @start_time = GETDATE()
31
+ WHILE GETDATE() < DATEADD(second, @timeout, @start_time)
32
+ BEGIN TRY
33
+ IF (SELECT secondary_role_allow_connections_desc
34
+ FROM master.sys.availability_groups AS AG
35
+ INNER JOIN master.sys.availability_replicas AS AR
36
+ ON AG.group_id = AR.group_id
37
+ INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
38
+ ON AR.replica_id = arstates.replica_id AND arstates.role = 2 AND arstates.is_local = 1) = 'NO' OR -- Role 2 = Secondary
39
+ (SELECT state FROM sys.databases WHERE [name] = @databaseName) = 1
40
+ BEGIN
41
+ BREAK
42
+ END
43
+ IF EXISTS (SELECT * FROM [$(databasename)].[INFORMATION_SCHEMA].[TABLES] WHERE TABLE_NAME = 'syspublications')
44
+ BEGIN
45
+ INSERT INTO @replicationStatusTable
46
+ SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END, @databaseName FROM [$(databasename)].[dbo].syspublications
47
+ END
48
+ ELSE
49
+ BEGIN
50
+ INSERT INTO @replicationStatusTable
51
+ SELECT 0, @databaseName
52
+ END
53
+ BREAK
54
+ END TRY
55
+ BEGIN CATCH
56
+ SELECT @message = 'WARNING. Unable to read replication info from database. Database state is ' + CONVERT(nvarchar(5), state) + ' (' + state_desc + '). ' + ERROR_MESSAGE() + ' Retrying in 5 seconds...' FROM sys.databases WHERE [name] = @databaseName
57
+ IF GETDATE() > DATEADD(second, 10, @start_time)
58
+ BEGIN
59
+ RAISERROR (@message, 10, 1) WITH NOWAIT
60
+ END
61
+ WAITFOR DELAY '00:00:05'
62
+ END CATCH
63
+ END
64
+
65
+ IF (SERVERPROPERTY('IsHadrEnabled') IS NOT NULL AND SERVERPROPERTY('IsHadrEnabled') = 1)
66
+ BEGIN
67
+ INSERT INTO @availabilityGroupTable
68
+ SELECT AG.name AS [AvailabilityGroup], dbcs.database_name AS [DatabaseName], arstates.role_desc AS [AvailabilityGroupRole],
69
+ CASE WHEN secondary_role_allow_connections_desc = 'NO' THEN 0 ELSE 1 END AS [ReadableSecondary],
70
+ last_redone_lsn
71
+ FROM master.sys.availability_groups AS AG
72
+ LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
73
+ ON AG.group_id = agstates.group_id
74
+ INNER JOIN master.sys.availability_replicas AS AR
75
+ ON AG.group_id = AR.group_id
76
+ INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
77
+ ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
78
+ INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
79
+ ON arstates.replica_id = dbcs.replica_id AND dbcs.database_name LIKE @databaseName AND dbcs.is_database_joined = 1
80
+ LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
81
+ 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
82
+ END;
83
+
84
+ WITH fs AS
85
+ (
86
+ SELECT database_id, type, size * 8.0 / 1024 size
87
+ FROM sys.master_files
88
+ ),
89
+ DatabaseSizeTable AS
90
+ (
91
+ SELECT
92
+ (SELECT sum(size) FROM fs WHERE type = 0 AND fs.database_id = db.database_id) AS DatabaseSize,
93
+ (SELECT sum(size) FROM fs WHERE type = 1 AND fs.database_id = db.database_id) AS LogSize,
94
+ name AS DatabaseName
95
+ FROM sys.databases db
96
+ WHERE name = @databaseName
97
+ ),
98
+ LastBackUp AS
99
+ (
100
+ SELECT bs.database_name,
101
+ bs.backup_size,
102
+ bs.backup_start_date,
103
+ bs.is_copy_only,
104
+ bmf.physical_device_name,
105
+ Position = ROW_NUMBER() OVER( PARTITION BY bs.database_name ORDER BY bs.backup_start_date DESC )
106
+ FROM msdb.dbo.backupmediafamily bmf
107
+ JOIN msdb.dbo.backupmediaset bms ON bmf.media_set_id = bms.media_set_id
108
+ JOIN msdb.dbo.backupset bs ON bms.media_set_id = bs.media_set_id
109
+ WHERE bs.[type] = 'D'
110
+ ),
111
+ LastCopyOnlyBackup AS
112
+ (
113
+ SELECT TOP 1 database_name, last_lsn AS LastCopyOnlyLSN, backup_set_id AS LastCopyOnlyBackupSetId, backup_start_date AS backup_start_date_copy_only FROM msdb.dbo.backupset
114
+ WHERE [type] = 'D' AND database_name LIKE @databaseName AND is_copy_only = 1
115
+ ORDER BY backup_start_date DESC
116
+ ),
117
+ LastNonCopyOnlyBackup AS
118
+ (
119
+ SELECT TOP 1 database_name, last_lsn AS LastNonCopyOnlyLSN, backup_set_id AS LastNonCopyOnlyBackupSetId, backup_start_date AS backup_start_date_non_copy_only FROM msdb.dbo.backupset
120
+ WHERE [type] = 'D' AND database_name LIKE @databaseName AND is_copy_only = 0
121
+ ORDER BY backup_start_date DESC
122
+ ),
123
+ LastLogBackup AS
124
+ (
125
+ SELECT database_name, MAX(backup_start_date) AS log_only_backup_start_date
126
+ FROM msdb..backupset
127
+ WHERE [type] = 'L' AND database_name = @databaseName
128
+ GROUP BY database_name
129
+ ),
130
+ LastRestore AS
131
+ (
132
+ SELECT TOP 1 [destination_database_name] AS database_name, restore_date AS LastRestoreDate, r.backup_set_id AS LastRestoreBackupSetID, last_lsn AS LastRestoreLSN, database_backup_lsn AS LastRestoreDatabaseBackupLSN
133
+ FROM msdb.dbo.[restorehistory] r
134
+ INNER JOIN msdb.dbo.backupset b
135
+ ON r.backup_set_id = b.backup_set_id
136
+ WHERE [destination_database_name] = @databaseName AND restore_type = 'D'
137
+ ORDER BY restore_date DESC
138
+ ),
139
+ LastLogRestore AS
140
+ (
141
+ SELECT TOP 1 [destination_database_name] AS database_name, restore_date AS LastLogRestoreDate, r.backup_set_id AS LastLogRestoreBackupSetID, last_lsn AS LastLogRestoreLSN, database_backup_lsn AS LastLogRestoreDatabaseBackupLSN
142
+ FROM msdb.dbo.[restorehistory] r
143
+ INNER JOIN msdb.dbo.backupset b
144
+ ON r.backup_set_id = b.backup_set_id
145
+ WHERE [destination_database_name] = @databaseName AND restore_type = 'L'
146
+ ORDER BY restore_date DESC
147
+ )
148
+ SELECT sd.name,
149
+ CAST(backup_size / 1048576 AS DECIMAL(10, 2) ) AS [BackupSizeMB],
150
+ backup_start_date AS [LastFullBackupDate],
151
+ backup_start_date_copy_only AS [LastCopyOnlyFullBackupDate],
152
+ backup_start_date_non_copy_only AS [LastNonCopyOnlyFullBackupDate],
153
+ log_only_backup_start_date AS [LastLogOnlyBackupDate],
154
+ physical_device_name AS [BackupFileLocation],
155
+ LastRestoreDate,
156
+ LastLogRestoreDate,
157
+ is_copy_only AS [CopyOnly],
158
+ [sd].[create_date],
159
+ [sd].[compatibility_level],
160
+ [sd].[collation_name],
161
+ [sd].[state_desc],
162
+ ao.AvailabilityGroup,
163
+ AvailabilityGroupRole,
164
+ ReadableSecondary,
165
+ DatabaseSize,
166
+ LogSize,
167
+ ReplicationActive,
168
+ LastCopyOnlyBackupSetId,
169
+ LastCopyOnlyLSN,
170
+ LastNonCopyOnlyBackupSetId,
171
+ LastNonCopyOnlyLSN,
172
+ LastRestoreBackupSetID,
173
+ LastRestoreLSN,
174
+ LastRestoreDatabaseBackupLSN,
175
+ LastLogRestoreBackupSetID,
176
+ LastLogRestoreLSN,
177
+ LastLogRestoreDatabaseBackupLSN,
178
+ LastRedoneLSN
179
+ FROM sys.databases AS sd
180
+ LEFT JOIN LastBackUp AS lb
181
+ ON sd.name = lb.database_name
182
+ AND Position = 1
183
+ LEFT JOIN LastRestore AS lr
184
+ ON sd.name = lr.database_name
185
+ LEFT JOIN LastCopyOnlyBackup AS lc
186
+ ON sd.name = lc.database_name
187
+ LEFT JOIN LastNonCopyOnlyBackup AS lnc
188
+ ON sd.name = lnc.database_name
189
+ LEFT JOIN LastLogBackup AS llb
190
+ ON sd.name = llb.database_name
191
+ LEFT JOIN LastLogRestore AS llr
192
+ ON sd.name = llr.database_name
193
+ LEFT JOIN @availabilityGroupTable AS ao
194
+ ON sd.name = ao.DatabaseName
195
+ LEFT JOIN @replicationStatusTable rs
196
+ ON sd.name = rs.DatabaseName
197
+ LEFT JOIN DatabaseSizeTable ds
198
+ ON sd.name = ds.DatabaseName
199
+ WHERE sd.name = @databaseName
@@ -0,0 +1,26 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @databaseName nvarchar(128)
4
+ DECLARE @logOnly bit
5
+ DECLARE @sqlQuery nvarchar(255)
6
+
7
+ SET @databaseName = '$(databasename)'
8
+ SET @logOnly = '$(logonly)'
9
+
10
+ IF EXISTS (SELECT * FROM sys.databases WHERE name = @databaseName)
11
+ BEGIN
12
+ WITH fs
13
+ AS
14
+ (
15
+ SELECT database_id, type, size * 8.0 / 1024 size
16
+ FROM sys.master_files
17
+ )
18
+ SELECT
19
+ (SELECT sum(size) FROM fs WHERE type = @logOnly and fs.database_id = db.database_id) AS DatabaseSize
20
+ FROM sys.databases db
21
+ WHERE name = @databaseName
22
+ END
23
+ ELSE
24
+ BEGIN
25
+ SELECT NULL AS DatabaseSize
26
+ END
@@ -0,0 +1,14 @@
1
+ DECLARE @TargetFolder NVARCHAR(255)
2
+
3
+ SET @TargetFolder = '$(targetfolder)'
4
+
5
+ SELECT DISTINCT
6
+ SUBSTRING(volume_mount_point, 1, 1) AS volume_mount_point
7
+ ,total_bytes/1024/1024 AS Total_MB
8
+ ,available_bytes/1024/1024 AS Available_MB
9
+ ,ROUND(CONVERT(FLOAT, available_bytes)/CONVERT(FLOAT, total_bytes) * 100, 2) AS Percent_Free
10
+ FROM
11
+ sys.master_files AS f
12
+ CROSS APPLY
13
+ sys.dm_os_volume_stats(f.database_id, f.file_id)
14
+ WHERE SUBSTRING(volume_mount_point, 1, 1) = SUBSTRING(@TargetFolder, 1, 1)
@@ -0,0 +1,17 @@
1
+ SET NOCOUNT ON
2
+
3
+ DECLARE @databaseName nvarchar(128)
4
+
5
+ SET @databaseName = '$(databasename)'
6
+
7
+ SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
8
+ AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
9
+ CONVERT(NUMERIC(10,1),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
10
+ CONVERT(NUMERIC(10,1),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
11
+ CONVERT(NUMERIC(10,1),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
12
+ CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
13
+ CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
14
+ FROM sys.dm_exec_sql_text(sql_handle))) AS [Command text]
15
+ FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE') AND
16
+ CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2, CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
17
+ FROM sys.dm_exec_sql_text(sql_handle))) LIKE '%RESTORE%[' + @databaseName + ']%'