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