sql_cmd 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/optional_dependencies.rb +30 -0
  4. data/lib/sql_cmd/agent.rb +32 -0
  5. data/lib/sql_cmd/always_on.rb +267 -0
  6. data/lib/sql_cmd/azure.rb +80 -0
  7. data/lib/sql_cmd/backups.rb +276 -0
  8. data/lib/sql_cmd/config.rb +62 -0
  9. data/lib/sql_cmd/database.rb +618 -0
  10. data/lib/sql_cmd/format.rb +124 -0
  11. data/lib/sql_cmd/query.rb +350 -0
  12. data/lib/sql_cmd/security.rb +21 -0
  13. data/lib/sql_cmd/sql_helper.ps1 +89 -0
  14. data/lib/sql_cmd.rb +44 -0
  15. data/sql_scripts/Agent/CreateSQLJob.sql +81 -0
  16. data/sql_scripts/Agent/JobLastRunInfo.sql +70 -0
  17. data/sql_scripts/Agent/JobRunStatus.sql +21 -0
  18. data/sql_scripts/Agent/SQLAgentStatus.sql +8 -0
  19. data/sql_scripts/AlwaysOn/AddDatabaseToAvailabilityGroupOnSecondary.sql +72 -0
  20. data/sql_scripts/AlwaysOn/AddDatabaseToPrimaryAvailabilityGroup.sql +16 -0
  21. data/sql_scripts/AlwaysOn/AutomaticSeedingProgress.sql +34 -0
  22. data/sql_scripts/AlwaysOn/ConfigurePrimaryForAutomaticSeeding.sql +2 -0
  23. data/sql_scripts/AlwaysOn/ConfigurePrimaryForManualSeeding.sql +2 -0
  24. data/sql_scripts/AlwaysOn/ConfigureSecondaryForAutomaticSeeding.sql +1 -0
  25. data/sql_scripts/AlwaysOn/DropSecondary.sql +58 -0
  26. data/sql_scripts/AlwaysOn/RemoveDatabaseFromGroup.sql +2 -0
  27. data/sql_scripts/AlwaysOn/SynchronizationState.sql +14 -0
  28. data/sql_scripts/Database/BackupDatabase.sql +95 -0
  29. data/sql_scripts/Database/CompressAllTables.sql +100 -0
  30. data/sql_scripts/Database/CreateLogin.sql +16 -0
  31. data/sql_scripts/Database/DropDatabase.sql +51 -0
  32. data/sql_scripts/Database/GetBackupFiles.sql +31 -0
  33. data/sql_scripts/Database/GetBackupHeaders.sql +94 -0
  34. data/sql_scripts/Database/GetFileInfoFromBackup.sql +9 -0
  35. data/sql_scripts/Database/RestoreDatabase.sql +185 -0
  36. data/sql_scripts/Database/SetFullRecovery.sql +19 -0
  37. data/sql_scripts/Database/SetSQLCompatibility.sql +33 -0
  38. data/sql_scripts/Security/AssignDatabaseRoles.sql +44 -0
  39. data/sql_scripts/Security/CreateOrUpdateCredential.sql +11 -0
  40. data/sql_scripts/Security/CreateSqlLogin.sql +20 -0
  41. data/sql_scripts/Security/ExportDatabasePermissions.sql +757 -0
  42. data/sql_scripts/Security/GenerateCreateLoginsScript.sql +144 -0
  43. data/sql_scripts/Security/GenerateValidateLoginsScript.sql +83 -0
  44. data/sql_scripts/Security/GetUserSID.sql +3 -0
  45. data/sql_scripts/Security/UpdateSqlPassword.sql +24 -0
  46. data/sql_scripts/Security/ValidateDatabaseRoles.sql +12 -0
  47. data/sql_scripts/Status/ANSINullsOffTableCount.sql +13 -0
  48. data/sql_scripts/Status/ANSINullsOffTables.sql +9 -0
  49. data/sql_scripts/Status/BackupProgress.sql +17 -0
  50. data/sql_scripts/Status/DatabaseInfo.sql +199 -0
  51. data/sql_scripts/Status/DatabaseSize.sql +26 -0
  52. data/sql_scripts/Status/DiskSpace.sql +14 -0
  53. data/sql_scripts/Status/RestoreProgress.sql +17 -0
  54. data/sql_scripts/Status/SQLSettings.sql +182 -0
  55. data/sql_scripts/Status/UncompressedTableCount.sql +27 -0
  56. metadata +224 -0
@@ -0,0 +1,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 + ']%'