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,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,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 + ']%'
|