|
38 | 38 | SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
39 | 39 |
|
40 | 40 |
|
41 |
| - SELECT @Version = '8.15', @VersionDate = '20230613'; |
| 41 | + SELECT @Version = '8.16', @VersionDate = '20230820'; |
42 | 42 | SET @OutputType = UPPER(@OutputType);
|
43 | 43 |
|
44 | 44 | IF(@VersionCheckMode = 1)
|
@@ -186,11 +186,129 @@ AS
|
186 | 186 | ,@CurrentComponentVersionCheckModeOK BIT
|
187 | 187 | ,@canExitLoop BIT
|
188 | 188 | ,@frkIsConsistent BIT
|
189 |
| - ,@NeedToTurnNumericRoundabortBackOn BIT; |
| 189 | + ,@NeedToTurnNumericRoundabortBackOn BIT |
| 190 | + ,@sa bit = 1 |
| 191 | + ,@SUSER_NAME sysname = SUSER_SNAME() |
| 192 | + ,@SkipDBCC bit = 0 |
| 193 | + ,@SkipTrace bit = 0 |
| 194 | + ,@SkipXPRegRead bit = 0 |
| 195 | + ,@SkipXPFixedDrives bit = 0 |
| 196 | + ,@SkipXPCMDShell bit = 0 |
| 197 | + ,@SkipMaster bit = 0 |
| 198 | + ,@SkipMSDB bit = 0 |
| 199 | + ,@SkipModel bit = 0 |
| 200 | + ,@SkipTempDB bit = 0 |
| 201 | + ,@SkipValidateLogins bit = 0; |
| 202 | + |
| 203 | + DECLARE |
| 204 | + @db_perms table |
| 205 | + ( |
| 206 | + database_name sysname, |
| 207 | + permission_name sysname |
| 208 | + ); |
| 209 | + |
| 210 | + INSERT |
| 211 | + @db_perms |
| 212 | + ( |
| 213 | + database_name, |
| 214 | + permission_name |
| 215 | + ) |
| 216 | + SELECT |
| 217 | + database_name = |
| 218 | + DB_NAME(d.database_id), |
| 219 | + fmp.permission_name |
| 220 | + FROM sys.databases AS d |
| 221 | + CROSS APPLY fn_my_permissions(d.name, 'DATABASE') AS fmp |
| 222 | + WHERE fmp.permission_name = N'SELECT' /*Databases where we don't have read permissions*/ |
190 | 223 |
|
191 | 224 | /* End of declarations for First Responder Kit consistency check:*/
|
192 | 225 | ;
|
193 | 226 |
|
| 227 | + /*Starting permissions checks here, but only if we're not a sysadmin*/ |
| 228 | + IF |
| 229 | + ( |
| 230 | + SELECT |
| 231 | + sa = |
| 232 | + ISNULL |
| 233 | + ( |
| 234 | + IS_SRVROLEMEMBER(N'sysadmin'), |
| 235 | + 0 |
| 236 | + ) |
| 237 | + ) = 0 |
| 238 | + BEGIN |
| 239 | + IF @Debug IN (1, 2) RAISERROR('User not SA, checking permissions', 0, 1) WITH NOWAIT; |
| 240 | + |
| 241 | + SET @sa = 0; /*Setting this to 0 to skip DBCC COMMANDS*/ |
| 242 | + |
| 243 | + IF NOT EXISTS |
| 244 | + ( |
| 245 | + SELECT |
| 246 | + 1/0 |
| 247 | + FROM sys.fn_my_permissions(NULL, NULL) AS fmp |
| 248 | + WHERE fmp.permission_name = N'VIEW SERVER STATE' |
| 249 | + ) |
| 250 | + BEGIN |
| 251 | + RAISERROR('The user %s does not have VIEW SERVER STATE permissions.', 0, 11, @SUSER_NAME) WITH NOWAIT; |
| 252 | + RETURN; |
| 253 | + END; /*If we don't have this, we can't do anything at all.*/ |
| 254 | + |
| 255 | + IF NOT EXISTS |
| 256 | + ( |
| 257 | + SELECT |
| 258 | + 1/0 |
| 259 | + FROM fn_my_permissions(N'sys.traces', N'OBJECT') AS fmp |
| 260 | + WHERE fmp.permission_name = N'ALTER' |
| 261 | + ) |
| 262 | + BEGIN |
| 263 | + SET @SkipTrace = 1; |
| 264 | + END; /*We need this permission to execute trace stuff, apparently*/ |
| 265 | + |
| 266 | + IF NOT EXISTS |
| 267 | + ( |
| 268 | + SELECT |
| 269 | + 1/0 |
| 270 | + FROM fn_my_permissions(N'xp_regread', N'OBJECT') AS fmp |
| 271 | + WHERE fmp.permission_name = N'EXECUTE' |
| 272 | + ) |
| 273 | + BEGIN |
| 274 | + SET @SkipXPRegRead = 1; |
| 275 | + END; /*Need execute on xp_regread*/ |
| 276 | + |
| 277 | + IF NOT EXISTS |
| 278 | + ( |
| 279 | + SELECT |
| 280 | + 1/0 |
| 281 | + FROM fn_my_permissions(N'xp_fixeddrives', N'OBJECT') AS fmp |
| 282 | + WHERE fmp.permission_name = N'EXECUTE' |
| 283 | + ) |
| 284 | + BEGIN |
| 285 | + SET @SkipXPFixedDrives = 1; |
| 286 | + END; /*Need execute on xp_fixeddrives*/ |
| 287 | + |
| 288 | + IF NOT EXISTS |
| 289 | + ( |
| 290 | + SELECT |
| 291 | + 1/0 |
| 292 | + FROM fn_my_permissions(N'xp_cmdshell', N'OBJECT') AS fmp |
| 293 | + WHERE fmp.permission_name = N'EXECUTE' |
| 294 | + ) |
| 295 | + BEGIN |
| 296 | + SET @SkipXPCMDShell = 1; |
| 297 | + END; /*Need execute on xp_cmdshell*/ |
| 298 | + |
| 299 | + IF NOT EXISTS |
| 300 | + ( |
| 301 | + SELECT |
| 302 | + 1/0 |
| 303 | + FROM fn_my_permissions(N'sp_validatelogins', N'OBJECT') AS fmp |
| 304 | + WHERE fmp.permission_name = N'EXECUTE' |
| 305 | + ) |
| 306 | + BEGIN |
| 307 | + SET @SkipValidateLogins = 1; |
| 308 | + END; /*Need execute on sp_validatelogins*/ |
| 309 | + |
| 310 | + END; |
| 311 | + |
194 | 312 | SET @crlf = NCHAR(13) + NCHAR(10);
|
195 | 313 | SET @ResultText = 'sp_Blitz Results: ' + @crlf;
|
196 | 314 |
|
|
331 | 449 | OR LOWER(d.name) IN ('dbatools', 'dbadmin', 'dbmaintenance'))
|
332 | 450 | OPTION(RECOMPILE);
|
333 | 451 |
|
| 452 | + /*Skip checks for database where we don't have read permissions*/ |
| 453 | + INSERT INTO |
| 454 | + #SkipChecks |
| 455 | + ( |
| 456 | + DatabaseName |
| 457 | + ) |
| 458 | + SELECT |
| 459 | + DB_NAME(d.database_id) |
| 460 | + FROM sys.databases AS d |
| 461 | + WHERE NOT EXISTS |
| 462 | + ( |
| 463 | + SELECT |
| 464 | + 1/0 |
| 465 | + FROM @db_perms AS dp |
| 466 | + WHERE dp.database_name = DB_NAME(d.database_id) |
| 467 | + ); |
| 468 | + |
| 469 | + /*Skip individial checks where we don't have permissions*/ |
| 470 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 471 | + SELECT |
| 472 | + v.* |
| 473 | + FROM (VALUES(NULL, 29, NULL)) AS v (DatabaseName, CheckID, ServerName) /*Looks for user tables in model*/ |
| 474 | + WHERE NOT EXISTS (SELECT 1/0 FROM @db_perms AS dp WHERE dp.database_name = 'model'); |
| 475 | + |
| 476 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 477 | + SELECT |
| 478 | + v.* |
| 479 | + FROM (VALUES(NULL, 68, NULL)) AS v (DatabaseName, CheckID, ServerName) /*DBCC command*/ |
| 480 | + WHERE @sa = 0; |
| 481 | + |
| 482 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 483 | + SELECT |
| 484 | + v.* |
| 485 | + FROM (VALUES(NULL, 69, NULL)) AS v (DatabaseName, CheckID, ServerName) /*DBCC command*/ |
| 486 | + WHERE @sa = 0; |
| 487 | + |
| 488 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 489 | + SELECT |
| 490 | + v.* |
| 491 | + FROM (VALUES(NULL, 92, NULL)) AS v (DatabaseName, CheckID, ServerName) /*xp_fixeddrives*/ |
| 492 | + WHERE @SkipXPFixedDrives = 1; |
| 493 | + |
| 494 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 495 | + SELECT |
| 496 | + v.* |
| 497 | + FROM (VALUES(NULL, 211, NULL)) AS v (DatabaseName, CheckID, ServerName) /*xp_regread*/ |
| 498 | + WHERE @SkipXPRegRead = 1; |
| 499 | + |
| 500 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 501 | + SELECT |
| 502 | + v.* |
| 503 | + FROM (VALUES(NULL, 212, NULL)) AS v (DatabaseName, CheckID, ServerName) /*xp_regread*/ |
| 504 | + WHERE @SkipXPCMDShell = 1; |
| 505 | + |
| 506 | + INSERT #SkipChecks (DatabaseName, CheckID, ServerName) |
| 507 | + SELECT |
| 508 | + v.* |
| 509 | + FROM (VALUES(NULL, 2301, NULL)) AS v (DatabaseName, CheckID, ServerName) /*sp_validatelogins*/ |
| 510 | + WHERE @SkipValidateLogins = 1 |
| 511 | + |
334 | 512 | IF(OBJECT_ID('tempdb..#InvalidLogins') IS NOT NULL)
|
335 | 513 | BEGIN
|
336 | 514 | EXEC sp_executesql N'DROP TABLE #InvalidLogins;';
|
|
372 | 550 | SELECT @IsWindowsOperatingSystem = 1 ;
|
373 | 551 | END;
|
374 | 552 |
|
375 |
| - IF NOT EXISTS ( SELECT 1 |
| 553 | + |
| 554 | + IF NOT EXISTS ( SELECT 1 |
376 | 555 | FROM #SkipChecks
|
377 | 556 | WHERE DatabaseName IS NULL AND CheckID = 106 )
|
378 | 557 | AND (select convert(int,value_in_use) from sys.configurations where name = 'default trace enabled' ) = 1
|
@@ -4158,53 +4337,56 @@ AS
|
4158 | 4337 |
|
4159 | 4338 | /* First, let's check that there aren't any issues with the trace files */
|
4160 | 4339 | BEGIN TRY
|
4161 |
| - |
4162 |
| - INSERT INTO #fnTraceGettable |
4163 |
| - ( TextData , |
4164 |
| - DatabaseName , |
4165 |
| - EventClass , |
4166 |
| - Severity , |
4167 |
| - StartTime , |
4168 |
| - EndTime , |
4169 |
| - Duration , |
4170 |
| - NTUserName , |
4171 |
| - NTDomainName , |
4172 |
| - HostName , |
4173 |
| - ApplicationName , |
4174 |
| - LoginName , |
4175 |
| - DBUserName |
4176 |
| - ) |
4177 |
| - SELECT TOP 20000 |
4178 |
| - CONVERT(NVARCHAR(4000),t.TextData) , |
4179 |
| - t.DatabaseName , |
4180 |
| - t.EventClass , |
4181 |
| - t.Severity , |
4182 |
| - t.StartTime , |
4183 |
| - t.EndTime , |
4184 |
| - t.Duration , |
4185 |
| - t.NTUserName , |
4186 |
| - t.NTDomainName , |
4187 |
| - t.HostName , |
4188 |
| - t.ApplicationName , |
4189 |
| - t.LoginName , |
4190 |
| - t.DBUserName |
4191 |
| - FROM sys.fn_trace_gettable(@base_tracefilename, DEFAULT) t |
4192 |
| - WHERE |
4193 |
| - ( |
4194 |
| - t.EventClass = 22 |
4195 |
| - AND t.Severity >= 17 |
4196 |
| - AND t.StartTime > DATEADD(dd, -30, GETDATE()) |
4197 |
| - ) |
4198 |
| - OR |
4199 |
| - ( |
4200 |
| - t.EventClass IN (92, 93) |
4201 |
| - AND t.StartTime > DATEADD(dd, -30, GETDATE()) |
4202 |
| - AND t.Duration > 15000000 |
4203 |
| - ) |
4204 |
| - OR |
4205 |
| - ( |
4206 |
| - t.EventClass IN (94, 95, 116) |
4207 |
| - ) |
| 4340 | + |
| 4341 | + IF @SkipTrace = 0 |
| 4342 | + BEGIN |
| 4343 | + INSERT INTO #fnTraceGettable |
| 4344 | + ( TextData , |
| 4345 | + DatabaseName , |
| 4346 | + EventClass , |
| 4347 | + Severity , |
| 4348 | + StartTime , |
| 4349 | + EndTime , |
| 4350 | + Duration , |
| 4351 | + NTUserName , |
| 4352 | + NTDomainName , |
| 4353 | + HostName , |
| 4354 | + ApplicationName , |
| 4355 | + LoginName , |
| 4356 | + DBUserName |
| 4357 | + ) |
| 4358 | + SELECT TOP 20000 |
| 4359 | + CONVERT(NVARCHAR(4000),t.TextData) , |
| 4360 | + t.DatabaseName , |
| 4361 | + t.EventClass , |
| 4362 | + t.Severity , |
| 4363 | + t.StartTime , |
| 4364 | + t.EndTime , |
| 4365 | + t.Duration , |
| 4366 | + t.NTUserName , |
| 4367 | + t.NTDomainName , |
| 4368 | + t.HostName , |
| 4369 | + t.ApplicationName , |
| 4370 | + t.LoginName , |
| 4371 | + t.DBUserName |
| 4372 | + FROM sys.fn_trace_gettable(@base_tracefilename, DEFAULT) t |
| 4373 | + WHERE |
| 4374 | + ( |
| 4375 | + t.EventClass = 22 |
| 4376 | + AND t.Severity >= 17 |
| 4377 | + AND t.StartTime > DATEADD(dd, -30, GETDATE()) |
| 4378 | + ) |
| 4379 | + OR |
| 4380 | + ( |
| 4381 | + t.EventClass IN (92, 93) |
| 4382 | + AND t.StartTime > DATEADD(dd, -30, GETDATE()) |
| 4383 | + AND t.Duration > 15000000 |
| 4384 | + ) |
| 4385 | + OR |
| 4386 | + ( |
| 4387 | + t.EventClass IN (94, 95, 116) |
| 4388 | + ) |
| 4389 | + END; |
4208 | 4390 |
|
4209 | 4391 | SET @TraceFileIssue = 0
|
4210 | 4392 |
|
@@ -6579,10 +6761,10 @@ IF @ProductVersionMajor >= 10
|
6579 | 6761 | DatabaseName
|
6580 | 6762 | FROM #SkipChecks
|
6581 | 6763 | WHERE CheckID IS NULL OR CheckID = 19)
|
6582 |
| - AND is_published = 1 |
| 6764 | + AND (is_published = 1 |
6583 | 6765 | OR is_subscribed = 1
|
6584 | 6766 | OR is_merge_published = 1
|
6585 |
| - OR is_distributor = 1; |
| 6767 | + OR is_distributor = 1); |
6586 | 6768 |
|
6587 | 6769 | /* Method B: check subscribers for MSreplication_objects tables */
|
6588 | 6770 | EXEC dbo.sp_MSforeachdb 'USE [?]; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
0 commit comments