From 0854c9261a0ac868973380656d19ccb0dd122919 Mon Sep 17 00:00:00 2001 From: Sergio Fonseca Date: Wed, 4 Oct 2017 15:21:25 +0100 Subject: [PATCH 1/6] Add EPM version 5.0 that works with SQL 2016, and new SQLServer Powershell module. https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-ps-module Fix for error: Microsoft.SqlServer.Management.Dmf.PolicyEvaluationException: Exception encountered while executing policy Table Name Pattern. ---> Microsoft.SqlServer.Management.Sdk.Sfc.EnumeratorException: Failed to retrieve data for this request. ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlException: Arithmetic overflow error for data type tinyint, value = -1. The statement has been terminated. --- .../EPM_Create_Database_Objects.sql | 803 ++++ .../EPM_Upgrade_Database_Objects.sql | 679 ++++ .../EPM_EnterpriseEvaluation_5.ps1 | 130 + .../5.0/2Reporting/PolicyReports.sln | 26 + .../5.0/2Reporting/PolicyReports.v11.sln | 25 + .../5.0/2Reporting/PolicyReports/PolicyDW.rds | 9 + .../PolicyReports/PolicyDashboard.rdl | 3286 +++++++++++++++++ .../PolicyReports/PolicyDetails.rdl | 963 +++++ .../PolicyReports/PolicyEvaluationDetails.rdl | 847 +++++ .../PolicyEvaluationErrorDetails.rdl | 343 ++ .../PolicyReports/PolicyEvaluationErrors.rdl | 645 ++++ .../PolicyReports/PolicyReports.rptproj | 74 + .../PolicyReports/ReportHistory.rsd | 99 + .../PBM_Fix_ImportedPolicies.sql | 184 + .../EPM Configuration Documentation v4.docx | Bin 0 -> 351262 bytes samples/features/epm-framework/5.0/README.md | 61 + 16 files changed, 8174 insertions(+) create mode 100644 samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql create mode 100644 samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql create mode 100644 samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationDetails.rdl create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrorDetails.rdl create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrors.rdl create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyReports.rptproj create mode 100644 samples/features/epm-framework/5.0/2Reporting/PolicyReports/ReportHistory.rsd create mode 100644 samples/features/epm-framework/5.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql create mode 100644 samples/features/epm-framework/5.0/EPM Configuration Documentation v4.docx create mode 100644 samples/features/epm-framework/5.0/README.md diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql new file mode 100644 index 0000000000..cdda9126b5 --- /dev/null +++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql @@ -0,0 +1,803 @@ +/* +SQLCMD script to generate the required objects to support a centralized Policy-Based Management solution. +This is the first script to run. +Set the variables to define the server and database which stores the policy results. +*/ +:SETVAR ServerName "WIN2012" +:SETVAR ManagementDatabase "MDW" +GO +:CONNECT $(ServerName) +GO + +--Create the specified database if it does not exist +IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = '$(ManagementDatabase)') +CREATE DATABASE $(ManagementDatabase) +GO + +--Create a schema to support the EPM framework objects. +USE $(ManagementDatabase) +GO +IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'policy') +EXEC sys.sp_executesql N'CREATE SCHEMA [policy] AUTHORIZATION [dbo]' + +--Start create tables and indexes + +--Create the table to store the results from the PowerShell evaluation. +IF NOT EXISTS(SELECT * FROM sys.objects WHERE type = N'U' AND name = N'PolicyHistory') +BEGIN + CREATE TABLE [policy].[PolicyHistory]( + [PolicyHistoryID] [int] IDENTITY NOT NULL , + [EvaluatedServer] [nvarchar](50) NULL, + [EvaluationDateTime] [datetime] NULL, + [EvaluatedPolicy] [nvarchar](128) NULL, + [EvaluationResults] [xml] NOT NULL, + CONSTRAINT PK_PolicyHistory PRIMARY KEY CLUSTERED (PolicyHistoryID) + ) + + ALTER TABLE [policy].[PolicyHistory] ADD CONSTRAINT [DF_PolicyHistory_EvaluationDateTime] DEFAULT (GETDATE()) FOR [EvaluationDateTime] +END +GO +IF EXISTS(SELECT * FROM sys.columns WHERE object_id = object_id('policy.policyhistory') AND name = 'PolicyResult') + BEGIN + ALTER TABLE policy.PolicyHistory + DROP COLUMN PolicyResult + END +GO +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationResults') +DROP INDEX IX_EvaluationResults ON policy.PolicyHistory +GO +CREATE PRIMARY XML INDEX IX_EvaluationResults ON policy.PolicyHistory (EvaluationResults) +GO + +CREATE XML INDEX IX_EvaluationResults_PROPERTY ON policy.PolicyHistory (EvaluationResults) +USING XML INDEX IX_EvaluationResults +FOR PROPERTY +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedPolicy') +DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistory +GO +CREATE INDEX IX_EvaluatedPolicy ON policy.PolicyHistory(EvaluatedPolicy) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedServer') +DROP INDEX IX_EvaluatedServer ON policy.PolicyHistory +GO +CREATE INDEX IX_EvaluatedServer ON [policy].[PolicyHistory] ([EvaluatedServer]) +INCLUDE ([PolicyHistoryID],[EvaluationDateTime],[EvaluatedPolicy]) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationDateTime') +DROP INDEX IX_EvaluationDateTime ON policy.PolicyHistory +GO +CREATE INDEX IX_EvaluationDateTime ON policy.PolicyHistory (EvaluationDateTime) +GO + +--Create the table to store the error information from the failed PowerShell executions. +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = N'U' AND name = N'EvaluationErrorHistory') +BEGIN + CREATE TABLE [policy].[EvaluationErrorHistory]( + [ErrorHistoryID] [int] IDENTITY(1,1) NOT NULL, + [EvaluatedServer] [nvarchar](50) NULL, + [EvaluationDateTime] [datetime] NULL, + [EvaluatedPolicy] [nvarchar](128) NULL, + [EvaluationResults] [nvarchar](max) NOT NULL, + CONSTRAINT PK_EvaluationErrorHistory PRIMARY KEY CLUSTERED ([ErrorHistoryID] ASC) + ) + + ALTER TABLE [policy].[EvaluationErrorHistory] ADD CONSTRAINT [DF_EvaluationErrorHistory_EvaluationDateTime] DEFAULT (getdate()) FOR [EvaluationDateTime] +END + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryView') +DROP INDEX IX_EvaluationErrorHistoryView ON policy.EvaluationErrorHistory +GO +CREATE INDEX [IX_EvaluationErrorHistoryView] ON policy.EvaluationErrorHistory ([EvaluatedPolicy] ASC, [EvaluatedServer] ASC, [EvaluationDateTime] DESC) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryPurge') +DROP INDEX IX_EvaluationErrorHistoryPurge ON policy.EvaluationErrorHistory +GO +CREATE INDEX [IX_EvaluationErrorHistoryPurge] ON policy.EvaluationErrorHistory ([EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] ON [policy].[EvaluationErrorHistory]([EvaluatedPolicy], [ErrorHistoryID], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime]) +GO + +--Create the table to store the policy result details. +--This table is loaded with the procedure policy.epm_LoadPolicyHistoryDetail or through the SQL Server SSIS policy package. +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND type in (N'U')) +BEGIN + CREATE TABLE [policy].[PolicyHistoryDetail]( + [PolicyHistoryDetailID] [int] IDENTITY NOT NULL, + [PolicyHistoryID] [int] NULL, + [EvaluatedServer] [nvarchar](128) NULL, + [EvaluationDateTime] [datetime] NULL, + [MonthYear] [nvarchar](14) NULL, + [EvaluatedPolicy] [nvarchar](128) NULL, + [policy_id] [int] NULL, + [CategoryName] [nvarchar](128) NULL, + [EvaluatedObject] [nvarchar](256) NULL, + [PolicyResult] [nvarchar](5) NOT NULL, + [ExceptionMessage] [nvarchar](max) NULL, + [ResultDetail] [xml] NULL, + [PolicyHistorySource] [nvarchar](50) NOT NULL, + CONSTRAINT PK_PolicyHistoryDetail PRIMARY KEY CLUSTERED ([PolicyHistoryDetailID]) + ) +END +GO + +ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT + FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY + (PolicyHistoryID) REFERENCES policy.PolicyHistory + (PolicyHistoryID) + ON UPDATE CASCADE + ON DELETE CASCADE +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'FK_PolicyHistoryID') +DROP INDEX FK_PolicyHistoryID ON policy.PolicyHistoryDetail +GO +CREATE INDEX FK_PolicyHistoryID ON [policy].[PolicyHistoryDetail] (PolicyHistoryID) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy') +DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistoryDetail +GO +CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy]) +INCLUDE ([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [MonthYear], [policy_id], [CategoryName], [EvaluatedObject], [PolicyResult]) +GO +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView') +DROP INDEX IX_PolicyHistoryView ON policy.PolicyHistoryDetail +GO +CREATE INDEX [IX_PolicyHistoryView] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC, [EvaluatedServer] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] DESC, [PolicyResult] ASC, [policy_id] ASC, CategoryName, MonthYear) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView_2') +DROP INDEX IX_PolicyHistoryView_2 ON policy.PolicyHistoryDetail +GO +CREATE INDEX [IX_PolicyHistoryView_2] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC ,[EvaluatedServer] ASC ,[EvaluationDateTime] ASC) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime') +DROP INDEX IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime ON policy.PolicyHistoryDetail +GO +CREATE INDEX [IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer] ASC, [EvaluatedPolicy] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] ASC) +INCLUDE ([PolicyResult]) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_MonthYear') +DROP INDEX IX_EvaluatedPolicy_MonthYear ON policy.PolicyHistoryDetail +GO +CREATE INDEX IX_EvaluatedPolicy_MonthYear ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[MonthYear]) +INCLUDE (EvaluationDateTime) +GO + +--CREATE INDEX IX_CategoryName_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([CategoryName],[EvaluatedPolicy]) +--GO + +--CREATE INDEX IX_EvaluatedPolicy_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[CategoryName]) +--GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_EvalDateTime_CategoryName') +DROP INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON policy.PolicyHistoryDetail +GO +CREATE INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[EvaluationDateTime],[CategoryName]) +INCLUDE ([PolicyHistoryDetailID],[MonthYear],[PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] +GO +CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedServer' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedServer] +GO +CREATE STATISTICS [Stat_PolicyResult_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([PolicyResult], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_PolicyResult_CategoryName') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_PolicyResult_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_PolicyResult_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [PolicyResult], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime], [PolicyResult], [PolicyHistoryID], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_PolicyResult] +GO +CREATE STATISTICS Stat_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([CategoryName], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy] +GO +CREATE STATISTICS Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [PolicyHistoryDetailID], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime] +GO +CREATE STATISTICS Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [CategoryName], [PolicyResult], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult] +GO +CREATE STATISTICS Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyHistoryDetailID], [CategoryName], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID] +GO +CREATE STATISTICS Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [CategoryName], [PolicyResult], [EvaluatedPolicy], [EvaluationDateTime], [PolicyHistoryDetailID]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([CategoryName], [EvaluatedPolicy], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluatedObject], [EvaluationDateTime], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyHistoryDetailID], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] +GO +CREATE STATISTICS [Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] ON [policy].[PolicyHistoryDetail]([PolicyResult], [EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([PolicyHistoryDetailID], [PolicyHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id], [CategoryName], [PolicyHistoryID]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyResult], [EvaluatedServer], [EvaluationDateTime], [PolicyHistoryDetailID], [policy_id], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyResult], [EvaluationDateTime], [PolicyHistoryDetailID], [PolicyHistoryID], [policy_id], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [CategoryName]) +GO + +--Create the function to support server selection. +--The following function will support nested CMS folders for the EPM Framework. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. + +USE $(ManagementDatabase) +GO +IF EXISTS(SELECT * FROM sys.objects WHERE name = 'pfn_ServerGroupInstances' AND type = 'TF') + DROP FUNCTION policy.pfn_ServerGroupInstances +GO +CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) +RETURNS TABLE +AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS + ( + SELECT parent_id, server_group_id, name + FROM msdb.dbo.sysmanagement_shared_server_groups tg + WHERE is_system_object = 0 + AND (tg.name = @server_group_name OR @server_group_name = '') + UNION ALL + SELECT cg.parent_id, cg.server_group_id, cg.name + FROM msdb.dbo.sysmanagement_shared_server_groups cg + INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id + ) + SELECT s.server_name, sg.name AS GroupName + FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s + INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id +) +GO +/* +CREATE FUNCTION policy.pfn_ServerGroupInstances (@server_group_name NVARCHAR(128)) +RETURNS @ServerGroups TABLE (server_name nvarchar(128), GroupName nvarchar(128)) +AS +BEGIN +IF @server_group_name = '' + BEGIN + INSERT @ServerGroups + SELECT s.server_name, ssg.name AS GroupName + FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s + INNER JOIN msdb.dbo.sysmanagement_shared_server_groups ssg + ON s.server_group_id = ssg.server_group_id + END + ELSE + WITH ServerGroups(parent_id, server_group_id, name) AS + ( + SELECT parent_id, server_group_id, name + FROM msdb.dbo.sysmanagement_shared_server_groups tg + WHERE is_system_object = 0 + AND (tg.name = @server_group_name OR @server_group_name = '') + UNION ALL + SELECT cg.parent_id, cg.server_group_id, cg.name + FROM msdb.dbo.sysmanagement_shared_server_groups cg + INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id + ) + INSERT @ServerGroups + SELECT s.server_name, sg.name AS GroupName + FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s + INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id + RETURN +END +GO +*/ + +--Create the views which are used in the policy reports + +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) +DROP VIEW [policy].[v_ServerGroups] +GO +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS +(SELECT parent_id + , server_group_id + , CAST('ALL' AS varchar(500)) + , 1 AS GroupLevel + , CAST('ALL' AS varchar(500)) AS Sort + , CAST('' AS varchar(255)) AS GroupValue +FROM msdb.dbo.sysmanagement_shared_server_groups tg +WHERE server_type = 0 AND parent_id IS NULL +UNION ALL +SELECT cg.parent_id + , cg.server_group_id + , CAST(REPLICATE(' ', GroupLevel) + cg.name AS varchar(500)) + , GroupLevel + 1 + , CAST(Sort + ' | ' + cg.name AS varchar(500)) AS Sort + , CAST(name AS varchar(255)) AS GroupValue +FROM msdb.dbo.sysmanagement_shared_server_groups cg +INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) + +SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue +FROM ServerGroups +GO + + +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) +DROP VIEW [policy].[v_PolicyHistory] +GO +CREATE VIEW [policy].[v_PolicyHistory] +AS +--The policy.v_PolicyHistory view will return all results +--and identify the policy evaluation result AS PASS, FAIL, or +--ERROR. The ERROR result indicates that the policy was not able +--to evaluate against an object. +SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , PH.PolicyResult + , PH.ExceptionMessage + , PH.ResultDetail + , PH.EvaluatedObject + , PH.policy_id + , PH.CategoryName + , PH.MonthYear +FROM policy.PolicyHistoryDetail PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +--INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp + INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id + WHERE spc.name = 'Disabled') +GO + + +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) +DROP VIEW policy.v_PolicyHistory_Rank +GO +CREATE VIEW policy.v_PolicyHistory_Rank +AS +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ResultDetail + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , DENSE_RANK() OVER ( + PARTITION BY EvaluatedPolicy, EvaluatedServer, EvaluatedObject + ORDER BY EvaluationDateTime DESC) AS EvaluationOrderDesc +FROM policy.v_PolicyHistory VPH +GO + +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]')) +DROP VIEW policy.v_PolicyHistory_LastEvaluation +GO +CREATE VIEW policy.v_PolicyHistory_LastEvaluation +AS +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--This view requires the v_PolicyHistory view exist. +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ResultDetail + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , EvaluationOrderDesc +FROM policy.v_PolicyHistory_Rank VPH +WHERE EvaluationOrderDesc = 1 +AND NOT EXISTS( + SELECT * + FROM policy.PolicyHistoryDetail PH + WHERE PH.EvaluatedPolicy = VPH.EvaluatedPolicy + AND PH.EvaluatedServer = VPH.EvaluatedServer + AND PH.EvaluationDateTime > VPH.EvaluationDateTime) +GO + +--Create a view to return all errors. +--Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) +DROP VIEW policy.v_EvaluationErrorHistory +GO +CREATE VIEW policy.v_EvaluationErrorHistory +AS +SELECT EEH.ErrorHistoryID + , EEH.EvaluatedServer + , EEH.EvaluationDateTime + , EEH.EvaluatedPolicy + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) + ELSE EEH.EvaluatedServer + END + AS EvaluatedObject + , EEH.EvaluationResults + , p.policy_id + , c.name AS CategoryName + , DATENAME(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear + , 'ERROR' AS PolicyResult +FROM policy.EvaluationErrorHistory AS EEH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = EEH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +UNION ALL +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , RIGHT(EvaluatedObject, CHARINDEX('\', REVERSE(EvaluatedObject)) - 1) + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , PolicyResult +FROM policy.v_PolicyHistory_LastEvaluation +WHERE PolicyResult = 'ERROR' +GO + +--Create a view to return the last error for each policy against +--an instance. +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]')) +DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation +GO +CREATE VIEW policy.v_EvaluationErrorHistory_LastEvaluation +AS +SELECT ErrorHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , Policy_ID + , EvaluatedObject + , EvaluationResults + , CategoryName + , MonthYear + , PolicyResult + , DENSE_RANK() OVER ( + PARTITION BY EvaluatedServer, EvaluatedPolicy + ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc +FROM policy.v_EvaluationErrorHistory EEH +WHERE NOT EXISTS ( + SELECT * + FROM policy.PolicyHistoryDetail PH + WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy + AND PH.EvaluatedServer = EEH.EvaluatedServer + AND PH.EvaluationDateTime > EEH.EvaluationDateTime) +GO + + +--Create the procedure epm_LoadPolicyHistoryDetail will load the details from the XML documents in PolicyHistory to the PolicyHistoryDetails table. +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[epm_LoadPolicyHistoryDetail]') AND type in (N'P', N'PC')) +DROP PROCEDURE [policy].[epm_LoadPolicyHistoryDetail] +GO +CREATE PROCEDURE policy.epm_LoadPolicyHistoryDetail @PolicyCategoryFilter VARCHAR(255) +AS +SET NOCOUNT ON; + +IF @PolicyCategoryFilter = '' +SET @PolicyCategoryFilter = NULL + +DECLARE @sqlcmd VARCHAR(8000), @Text NVARCHAR(255), @Remain int +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the evaluation results. +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +,cteEval AS (SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') AS EvaluatedObject + , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' + THEN ''FAIL'' + WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> '''' + THEN ''ERROR'' + ELSE ''PASS'' + END) AS PolicyResult + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage + , CAST(Expr.value(''(../DMF:ResultDetail)[1]'', ''nvarchar(max)'')AS XML) AS ResultDetail + , p.policy_id + , c.name AS CategoryName + , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear + , ''PowerShell EPM Framework'' AS PolicyHistorySource + , DENSE_RANK() OVER (PARTITION BY Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') ORDER BY Expr) AS [TopRank] + FROM policy.PolicyHistory AS PH + INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id + CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //TargetQueryExpression'' + ) AS Res(Expr) + WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NOT NULL) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:EvaluationDetail'') = 1) +INSERT INTO policy.PolicyHistoryDetail ( + PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource +) +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource +FROM cteEval +WHERE cteEval.[TopRank] = 1'; -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting no target data integration' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the policies that evaluated with no target +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +INSERT INTO policy.PolicyHistoryDetail ( + PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource + ) +SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , ''No Targets Found'' AS EvaluatedObject + , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' + THEN ''FAIL'' + WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' + THEN ''ERROR'' + ELSE ''PASS'' + END) AS PolicyResult + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage + , NULL AS ResultDetail + , p.policy_id + , c.name AS CategoryName + , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear + , ''PowerShell EPM Framework'' +FROM policy.PolicyHistory AS PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:ServerInstance'' + ) AS Res(Expr) +WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NULL) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:EvaluationDetail'') = 0 +ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting errors data integration' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the error records +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +INSERT INTO policy.EvaluationErrorHistory( + EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluationResults + ) +SELECT PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage +FROM policy.PolicyHistory AS PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:ServerInstance'' + ) AS Res(Expr) +WHERE PH.PolicyHistoryID NOT IN (SELECT DISTINCT PH.PolicyHistoryID FROM policy.EvaluationErrorHistory AS PHD WITH(NOLOCK) INNER JOIN policy.PolicyHistory AS PH WITH(NOLOCK) ON PH.EvaluatedServer = PHD.EvaluatedServer AND PH.EvaluationDateTime = PHD.EvaluationDateTime AND PH.EvaluatedPolicy = PHD.EvaluatedPolicy) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> '''' + --AND Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' +ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Finished data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END +RAISERROR (@Text, 10, 1) WITH NOWAIT; +GO + +USE $(ManagementDatabase) +GO +EXEC policy.epm_LoadPolicyHistoryDetail NULL +GO + +USE $(ManagementDatabase) +GO +IF (SELECT SERVERPROPERTY('EditionID')) IN (1804890536, 1872460670, 610778273, -2117995310) -- Supports Enterprise only features +BEGIN + ALTER INDEX [PK_EvaluationErrorHistory] ON [policy].[EvaluationErrorHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) + ALTER INDEX [PK_PolicyHistoryDetail] ON [policy].[PolicyHistoryDetail] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) + ALTER INDEX [PK_PolicyHistory] ON [policy].[PolicyHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) +END; +GO + diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql new file mode 100644 index 0000000000..7035124d39 --- /dev/null +++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql @@ -0,0 +1,679 @@ +/* +SQLCMD script to upgrade changed objects from previous deployment of a centralized Policy-Based Management solution. +Set the variables to define the server and database which stores the policy results. +*/ +:SETVAR ServerName "WIN2012" +:SETVAR ManagementDatabase "MDW" +GO +:CONNECT $(ServerName) +GO + +--Drop old indexes and stats +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer') +DROP INDEX IX_EvaluatedServer ON policy.PolicyHistoryDetail +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Policy_Server_Category' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Policy_Server_Category] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Policy_Result_Server') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Policy_Result_Server] +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Covered' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Covered] +GO + +--Start create new indexes and stats +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationDateTime') +DROP INDEX IX_EvaluationDateTime ON policy.PolicyHistory +GO +CREATE INDEX IX_EvaluationDateTime ON policy.PolicyHistory (EvaluationDateTime) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryPurge') +DROP INDEX IX_EvaluationErrorHistoryPurge ON policy.EvaluationErrorHistory +GO +CREATE INDEX [IX_EvaluationErrorHistoryPurge] ON policy.EvaluationErrorHistory ([EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] ON [policy].[EvaluationErrorHistory]([EvaluatedPolicy], [ErrorHistoryID], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime]) +GO + +ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT + FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY + (PolicyHistoryID) REFERENCES policy.PolicyHistory + (PolicyHistoryID) + ON UPDATE CASCADE + ON DELETE CASCADE +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'FK_PolicyHistoryID') +DROP INDEX FK_PolicyHistoryID ON policy.PolicyHistoryDetail +GO +CREATE INDEX FK_PolicyHistoryID ON [policy].[PolicyHistoryDetail] (PolicyHistoryID) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView_2') +DROP INDEX IX_PolicyHistoryView_2 ON policy.PolicyHistoryDetail +GO +CREATE INDEX [IX_PolicyHistoryView_2] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC ,[EvaluatedServer] ASC ,[EvaluationDateTime] ASC) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime') +DROP INDEX IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime ON policy.PolicyHistoryDetail +GO +CREATE INDEX [IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer] ASC, [EvaluatedPolicy] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] ASC) +INCLUDE ([PolicyResult]) +GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_MonthYear') +DROP INDEX IX_EvaluatedPolicy_MonthYear ON policy.PolicyHistoryDetail +GO +CREATE INDEX IX_EvaluatedPolicy_MonthYear ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[MonthYear]) +INCLUDE (EvaluationDateTime) +GO + +--CREATE INDEX IX_CategoryName_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([CategoryName],[EvaluatedPolicy]) +--GO + +--CREATE INDEX IX_EvaluatedPolicy_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[CategoryName]) +--GO + +IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_EvalDateTime_CategoryName') +DROP INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON policy.PolicyHistoryDetail +GO +CREATE INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[EvaluationDateTime],[CategoryName]) +INCLUDE ([PolicyHistoryDetailID],[MonthYear],[PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] +GO +CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedServer' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedServer] +GO +CREATE STATISTICS [Stat_PolicyResult_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([PolicyResult], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_PolicyResult_CategoryName') +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_PolicyResult_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_PolicyResult_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [PolicyResult], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime], [PolicyResult], [PolicyHistoryID], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_PolicyResult] +GO +CREATE STATISTICS Stat_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([CategoryName], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy] +GO +CREATE STATISTICS Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [PolicyHistoryDetailID], [EvaluatedPolicy]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime] +GO +CREATE STATISTICS Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [CategoryName], [PolicyResult], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult] +GO +CREATE STATISTICS Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyHistoryDetailID], [CategoryName], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID] +GO +CREATE STATISTICS Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [CategoryName], [PolicyResult], [EvaluatedPolicy], [EvaluationDateTime], [PolicyHistoryDetailID]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([CategoryName], [EvaluatedPolicy], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluatedObject], [EvaluationDateTime], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyHistoryDetailID], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] +GO +CREATE STATISTICS [Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] ON [policy].[PolicyHistoryDetail]([PolicyResult], [EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] +GO +CREATE STATISTICS [Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([PolicyHistoryDetailID], [PolicyHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] +GO +CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id], [CategoryName], [PolicyHistoryID]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyResult], [EvaluatedServer], [EvaluationDateTime], [PolicyHistoryDetailID], [policy_id], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] +GO +CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyResult], [EvaluationDateTime], [PolicyHistoryDetailID], [PolicyHistoryID], [policy_id], [CategoryName]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] +GO +CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyResult]) +GO + +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName' ) +DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] +GO +CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [CategoryName]) +GO + +--Update the function to support server selection. +--The following function will support nested CMS folders for the EPM Framework. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. + +USE $(ManagementDatabase) +GO +IF EXISTS(SELECT * FROM sys.objects WHERE name = 'pfn_ServerGroupInstances' AND type = 'TF') + DROP FUNCTION policy.pfn_ServerGroupInstances +GO +CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) +RETURNS TABLE +AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS + ( + SELECT parent_id, server_group_id, name + FROM msdb.dbo.sysmanagement_shared_server_groups tg + WHERE is_system_object = 0 + AND (tg.name = @server_group_name OR @server_group_name = '') + UNION ALL + SELECT cg.parent_id, cg.server_group_id, cg.name + FROM msdb.dbo.sysmanagement_shared_server_groups cg + INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id + ) + SELECT s.server_name, sg.name AS GroupName + FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s + INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id +) +GO + +--Update the views which are used in the policy reports + +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) +DROP VIEW [policy].[v_ServerGroups] +GO +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS +(SELECT parent_id + , server_group_id + , CAST('ALL' AS varchar(500)) + , 1 AS GroupLevel + , CAST('ALL' AS varchar(500)) AS Sort + , CAST('' AS varchar(255)) AS GroupValue +FROM msdb.dbo.sysmanagement_shared_server_groups tg +WHERE server_type = 0 AND parent_id IS NULL +UNION ALL +SELECT cg.parent_id + , cg.server_group_id + , CAST(REPLICATE(' ', GroupLevel) + cg.name AS varchar(500)) + , GroupLevel + 1 + , CAST(Sort + ' | ' + cg.name AS varchar(500)) AS Sort + , CAST(name AS varchar(255)) AS GroupValue +FROM msdb.dbo.sysmanagement_shared_server_groups cg +INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) + +SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue +FROM ServerGroups +GO + +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) +DROP VIEW [policy].[v_PolicyHistory] +GO +CREATE VIEW [policy].[v_PolicyHistory] +AS +--The policy.v_PolicyHistory view will return all results +--and identify the policy evaluation result AS PASS, FAIL, or +--ERROR. The ERROR result indicates that the policy was not able +--to evaluate against an object. +SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , PH.PolicyResult + , PH.ExceptionMessage + , PH.ResultDetail + , PH.EvaluatedObject + , PH.policy_id + , PH.CategoryName + , PH.MonthYear +FROM policy.PolicyHistoryDetail PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +--INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp + INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id + WHERE spc.name = 'Disabled') +GO + +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) +DROP VIEW policy.v_PolicyHistory_Rank +GO +CREATE VIEW policy.v_PolicyHistory_Rank +AS +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ResultDetail + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , DENSE_RANK() OVER ( + PARTITION BY EvaluatedPolicy, EvaluatedServer, EvaluatedObject + ORDER BY EvaluationDateTime DESC) AS EvaluationOrderDesc +FROM policy.v_PolicyHistory VPH +GO + +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]')) +DROP VIEW policy.v_PolicyHistory_LastEvaluation +GO +CREATE VIEW policy.v_PolicyHistory_LastEvaluation +AS +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--This view requires the v_PolicyHistory view exist. +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ResultDetail + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , EvaluationOrderDesc +FROM policy.v_PolicyHistory_Rank VPH +WHERE EvaluationOrderDesc = 1 +AND NOT EXISTS( + SELECT * + FROM policy.PolicyHistoryDetail PH + WHERE PH.EvaluatedPolicy = VPH.EvaluatedPolicy + AND PH.EvaluatedServer = VPH.EvaluatedServer + AND PH.EvaluationDateTime > VPH.EvaluationDateTime) +GO + +--Create a view to return all errors. +--Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. +--Drop the view if it exists. +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) +DROP VIEW policy.v_EvaluationErrorHistory +GO +CREATE VIEW policy.v_EvaluationErrorHistory +AS +SELECT EEH.ErrorHistoryID + , EEH.EvaluatedServer + , EEH.EvaluationDateTime + , EEH.EvaluatedPolicy + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) + ELSE EEH.EvaluatedServer + END + AS EvaluatedObject + , EEH.EvaluationResults + , p.policy_id + , c.name AS CategoryName + , DATENAME(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear + , 'ERROR' AS PolicyResult +FROM policy.EvaluationErrorHistory AS EEH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = EEH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +UNION ALL +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , RIGHT(EvaluatedObject, CHARINDEX('\', REVERSE(EvaluatedObject)) - 1) + , ExceptionMessage + , policy_id + , CategoryName + , MonthYear + , PolicyResult +FROM policy.v_PolicyHistory_LastEvaluation +WHERE PolicyResult = 'ERROR' +GO + +IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]')) +DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation +GO +CREATE VIEW policy.v_EvaluationErrorHistory_LastEvaluation +AS +SELECT ErrorHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , Policy_ID + , EvaluatedObject + , EvaluationResults + , CategoryName + , MonthYear + , PolicyResult + , DENSE_RANK() OVER ( + PARTITION BY EvaluatedServer, EvaluatedPolicy + ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc +FROM policy.v_EvaluationErrorHistory EEH +WHERE NOT EXISTS ( + SELECT * + FROM policy.PolicyHistoryDetail PH + WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy + AND PH.EvaluatedServer = EEH.EvaluatedServer + AND PH.EvaluationDateTime > EEH.EvaluationDateTime) +GO + +--Update the procedure epm_LoadPolicyHistoryDetail will load the details from the XML documents in PolicyHistory to the PolicyHistoryDetails table. +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[epm_LoadPolicyHistoryDetail]') AND type in (N'P', N'PC')) +DROP PROCEDURE [policy].[epm_LoadPolicyHistoryDetail] +GO +CREATE PROCEDURE policy.epm_LoadPolicyHistoryDetail @PolicyCategoryFilter VARCHAR(255) +AS +SET NOCOUNT ON; + +IF @PolicyCategoryFilter = '' +SET @PolicyCategoryFilter = NULL + +DECLARE @sqlcmd VARCHAR(8000), @Text NVARCHAR(255), @Remain int +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the evaluation results. +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +,cteEval AS (SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') AS EvaluatedObject + , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' + THEN ''FAIL'' + WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> '''' + THEN ''ERROR'' + ELSE ''PASS'' + END) AS PolicyResult + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage + , CAST(Expr.value(''(../DMF:ResultDetail)[1]'', ''nvarchar(max)'')AS XML) AS ResultDetail + , p.policy_id + , c.name AS CategoryName + , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear + , ''PowerShell EPM Framework'' AS PolicyHistorySource + , DENSE_RANK() OVER (PARTITION BY Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') ORDER BY Expr) AS [TopRank] + FROM policy.PolicyHistory AS PH + INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id + CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //TargetQueryExpression'' + ) AS Res(Expr) + WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NOT NULL) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:EvaluationDetail'') = 1) +INSERT INTO policy.PolicyHistoryDetail ( + PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource +) +SELECT PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource +FROM cteEval +WHERE cteEval.[TopRank] = 1'; -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting no target data integration' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the policies that evaluated with no target +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +INSERT INTO policy.PolicyHistoryDetail ( + PolicyHistoryID + , EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , PolicyResult + , ExceptionMessage + , ResultDetail + , policy_id + , CategoryName + , MonthYear + , PolicyHistorySource + ) +SELECT PH.PolicyHistoryID + , PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , ''No Targets Found'' AS EvaluatedObject + , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' + THEN ''FAIL'' + WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' + THEN ''ERROR'' + ELSE ''PASS'' + END) AS PolicyResult + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage + , NULL AS ResultDetail + , p.policy_id + , c.name AS CategoryName + , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear + , ''PowerShell EPM Framework'' +FROM policy.PolicyHistory AS PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:ServerInstance'' + ) AS Res(Expr) +WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NULL) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:EvaluationDetail'') = 0 +ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting errors data integration' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +--Insert the error records +SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF) +INSERT INTO policy.EvaluationErrorHistory( + EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluationResults + ) +SELECT PH.EvaluatedServer + , PH.EvaluationDateTime + , PH.EvaluatedPolicy + , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage +FROM policy.PolicyHistory AS PH +INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy +INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id +CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; + //DMF:ServerInstance'' + ) AS Res(Expr) +WHERE PH.PolicyHistoryID NOT IN (SELECT DISTINCT PH.PolicyHistoryID FROM policy.EvaluationErrorHistory AS PHD WITH(NOLOCK) INNER JOIN policy.PolicyHistory AS PH WITH(NOLOCK) ON PH.EvaluatedServer = PHD.EvaluatedServer AND PH.EvaluationDateTime = PHD.EvaluationDateTime AND PH.EvaluatedPolicy = PHD.EvaluatedPolicy) + ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + ' + AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> '''' + --AND Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' +ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates + +EXEC (@sqlcmd); + +SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...' +RAISERROR (@Text, 10, 1) WITH NOWAIT; + +SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Finished data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END +RAISERROR (@Text, 10, 1) WITH NOWAIT; +GO + +USE $(ManagementDatabase) +GO +EXEC policy.epm_LoadPolicyHistoryDetail NULL +GO + +USE $(ManagementDatabase) +GO +IF (SELECT SERVERPROPERTY('EditionID')) IN (1804890536, 1872460670, 610778273, -2117995310) -- Supports Enterprise only features +BEGIN + ALTER INDEX [PK_EvaluationErrorHistory] ON [policy].[EvaluationErrorHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) + ALTER INDEX [PK_PolicyHistoryDetail] ON [policy].[PolicyHistoryDetail] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) + ALTER INDEX [PK_PolicyHistory] ON [policy].[PolicyHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) +END; +GO + diff --git a/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 new file mode 100644 index 0000000000..cc0f1af8c1 --- /dev/null +++ b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 @@ -0,0 +1,130 @@ +# Evaluate specific Policies against a Server List +# Uses the Invoke-PolicyEvaluation Cmdlet + +#SAMPLE: #.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "DEV" -PolicyCategoryFilter "Name Pattern" –EvalMode “Check” + +<# +Run Powershell ISE as Admin + +https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-ps-module + +#https://www.powershellgallery.com/packages/PowerShellGet/ +Install-Module -Name PowerShellGet -Force + +#https://www.powershellgallery.com/packages/SqlServer/ +Install-Module -Name SqlServer -Force -AllowClobber + +#> + +param([string]$ConfigurationGroup=$(Throw ` +"Parameter missing: -ConfigurationGroup ConfigGroup"),` +[string]$PolicyCategoryFilter=$(Throw "Parameter missing: ` +-PolicyCategoryFilter Category"), ` +[string]$EvalMode=$(Throw "Parameter missing: -EvalMode EvalMode")) + +Remove-Module SQLPS -Force -ErrorAction SilentlyContinue +Import-Module SqlServer -DisableNameChecking + +# Parameter -ConfigurationGroup specifies the +# Central Management Server group to evaluate +# Parameter -PolicyCategoryFilter specifies the +# category of policies to evaluate +# Parameter -EvalMode accepts "Check" to report policy +# results, "Configure" to reconfigure any violations + +# Declare variables to define the central warehouse +# in which to write the output, store the policies +$CentralManagementServer = "Win2012" +$HistoryDatabase = "MDW" +# Define the location to write the results of the policy evaluation +$ResultDir = "E:\Results\" +# End of variables + +#Function to insert policy evaluation results into SQL Server - table policy.PolicyHistory +function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) +{ + &{ + $sqlQueryText = "INSERT INTO policy.PolicyHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResults')" + Invoke-Sqlcmd -ServerInstance $sqlServerVariable -Database $sqlDatabaseVariable -Query $sqlQueryText -ErrorAction Stop + } + trap + { + $ExceptionText = $_.Exception.Message -replace "'", "" + } +} + +#Function to insert policy evaluation errors into SQL Server - table policy.EvaluationErrorHistory +function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) +{ + &{ + $sqlQueryText = "INSERT INTO policy.EvaluationErrorHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResultsEscape')" + Invoke-Sqlcmd -ServerInstance $sqlServerVariable -Database $sqlDatabaseVariable -Query $sqlQueryText -ErrorAction Stop + } + trap + { + $ExceptionText = $_.Exception.Message -replace "'", "" + } +} + +#Function to delete files from this policy only +function PolicyFileDelete($File) +{ + # Delete evaluation files in the directory. + Remove-Item -Path $File + # ugly but moves on... + trap + { + continue; + } +} + +# Connection to the policy store +$conn = new-object Microsoft.SQlServer.Management.Sdk.Sfc.SqlStoreConnection("server=$CentralManagementServer;Trusted_Connection=true"); +$PolicyStore = new-object Microsoft.SqlServer.Management.DMF.PolicyStore($conn); + +# Create recordset of servers to evaluate +$sconn = new-object System.Data.SqlClient.SqlConnection("server=$CentralManagementServer;Trusted_Connection=true"); +$q = "SELECT DISTINCT server_name FROM $HistoryDatabase.[policy].[pfn_ServerGroupInstances]('$ConfigurationGroup');" + +$sconn.Open() +$cmd = new-object System.Data.SqlClient.SqlCommand ($q, $sconn); +$cmd.CommandTimeout = 0; +$dr = $cmd.ExecuteReader(); + +# Loop through the servers and then loop through +# the policies. For each server and policy, +# call cmdlet to evaluate policy on server and delete xml file afterwards + +while ($dr.Read()) { + $ServerName = $dr.GetValue(0); + foreach ($Policy in $PolicyStore.Policies) + { + if (($Policy.PolicyCategory -eq $PolicyCategoryFilter)-or ($PolicyCategoryFilter -eq "")) + { + &{ + $OutputFile = $ResultDir + ("{0}_{1}.xml" -f (Encode-SqlName $ServerName ), ($Policy.Name)); + Invoke-PolicyEvaluation -Policy $Policy -TargetServerName $ServerName -AdHocPolicyEvaluationMode $EvalMode -OutputXML > $OutputFile; + $PolicyResult = Get-Content $OutputFile -encoding UTF8; + $PolicyResult = $PolicyResult -replace "'", "" + PolicyHistoryInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $PolicyResult; + $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); + PolicyFileDelete $File; + } + trap [Exception] + { + $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); + PolicyFileDelete $File; + $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionMessage = $_.Exception.GetType().FullName + ", " + $ExceptionText + PolicyErrorInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $ExceptionMessage; + continue; + } + } + } + } + +$dr.Close() +$sconn.Close() + +#Shred the XML results to PolicyHistoryDetails +Invoke-Sqlcmd -ServerInstance $CentralManagementServer -Database $HistoryDatabase -Query "EXEC policy.epm_LoadPolicyHistoryDetail `$(PolicyCategory)" -Variable "PolicyCategory='${PolicyCategoryFilter}'" -QueryTimeout 65535 -Verbose -ErrorAction Stop diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln new file mode 100644 index 0000000000..503642c952 --- /dev/null +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{F14B399A-7131-4C87-9E4B-1186C45EF12D}") = "PolicyReports", "PolicyReports.rptproj", "{E0F65769-8BEA-4BFD-B715-44519AF1CF80}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Default = Debug|Default + DebugLocal|Default = DebugLocal|Default + Release|Default = Release|Default + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.ActiveCfg = Debug + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.Build.0 = DebugLocal + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.Deploy.0 = DebugLocal + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.ActiveCfg = DebugLocal + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.Build.0 = DebugLocal + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.Deploy.0 = DebugLocal + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.ActiveCfg = Release + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.Build.0 = Release + {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.Deploy.0 = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln new file mode 100644 index 0000000000..cc6d923673 --- /dev/null +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{F14B399A-7131-4C87-9E4B-1186C45EF12D}") = "PolicyReports", "PolicyReports\PolicyReports.rptproj", "{30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Default = Debug|Default + DebugLocal|Default = DebugLocal|Default + Release|Default = Release|Default + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.ActiveCfg = Debug + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.Build.0 = DebugLocal + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.Deploy.0 = DebugLocal + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.DebugLocal|Default.ActiveCfg = DebugLocal + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.DebugLocal|Default.Build.0 = DebugLocal + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.ActiveCfg = Release + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.Build.0 = Release + {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.Deploy.0 = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds new file mode 100644 index 0000000000..75ad7949f6 --- /dev/null +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds @@ -0,0 +1,9 @@ + + + + SQL + Data Source=localhost;Initial Catalog=MDW + true + + be53e7b6-9fc8-452b-ac5e-151bec780bf7 + \ No newline at end of file diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl new file mode 100644 index 0000000000..7becb2c013 --- /dev/null +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl @@ -0,0 +1,3286 @@ + + + Overview of current state of enterprise SQL Server instances. Launch detail reports through defined actions in the report. + 0 + + + PolicyDW + None + 9d3c6ede-25bb-4220-87c8-3455b1167deb + + + + + + ReportHistory + + + =Parameters!EvaluatedPolicy.Value + true + + + =Parameters!CategoryName.Value + + + =Parameters!ServerGroupName.Value + + + + + + EvaluatedServer + System.String + + + EvaluationDateTime + System.DateTime + + + EvaluatedPolicy + System.String + + + EvaluatedObject + System.String + + + AggEvaluatedObject + System.String + + + PolicyResult + System.String + + + policy_id + System.Int32 + + + CategoryName + System.String + + + MonthYear + System.String + + + FailedPolicyCount + System.Int32 + + + TrimCategoryName + + + + + + PolicyDW + SELECT DISTINCT CategoryName +FROM policy.v_PolicyHistory + true + + + + CategoryName + System.String + + + =IIF(Fields!CategoryName.Value LIKE "*:*", Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)), Fields!CategoryName.Value) + + + + + + PolicyDW + SELECT DISTINCT DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart +, MonthYear +FROM policy.v_PolicyHistory +UNION +SELECT '1900-01-01', 'ALL' +ORDER BY MonthStart DESC + true + + + + MonthYear + System.String + + + MonthStart + System.DateTime + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + =Parameters!DateMonth.Value + + + =Parameters!EvaluatedPolicy.Value + + + =Parameters!ServerGroupName.Value + + + SELECT MonthYear + , DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart + , CASE WHEN PolicyResult IN ('Fail') THEN 1 ELSE 0 end AS FailedPolicyCount +FROM policy.v_PolicyHistory +WHERE CategoryName IN (@CategoryName) +AND EvaluatedPolicy IN (@EvaluatedPolicy) +AND (EvaluatedServer IN (SELECT server_name + FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +AND @DateMonth = '1900-01-01')) + true + + + + FailedPolicyCount + System.Int32 + + + MonthStart + System.DateTime + + + MonthYear + System.String + + + + + + PolicyDW + + + =Parameters!EvaluatedPolicy.Value + true + + + =Parameters!CategoryName.Value + + + =Parameters!ServerGroupName.Value + + + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple + WHERE iple.EvaluatedServer = ple.EvaluatedServer + AND iple.CategoryName IN (@CategoryName) + AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) + AND iple.PolicyResult = 'FAIL') + THEN 'Out of Compliance' + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple + WHERE iple.EvaluatedServer = ple.EvaluatedServer + AND iple.CategoryName IN (@CategoryName) + AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) + AND iple.PolicyResult = 'ERROR') + THEN 'Unknown' + ELSE 'In Compliance' + END AS InstanceStatus + , EvaluatedServer +FROM policy.v_PolicyHistory ple +WHERE (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') +GROUP BY EvaluatedServer + true + + + + InstanceStatus + System.String + + + EvaluatedServer + System.String + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + =Parameters!ServerGroupName.Value + + + =Parameters!EvaluatedPolicy.Value + + + SELECT ErrorHistoryID +FROM policy.v_EvaluationErrorHistory_LastEvaluation +WHERE EvaluationOrderDesc = 1 +AND CategoryName IN (@CategoryName) +AND EvaluatedPolicy IN (@EvaluatedPolicy) +AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') + true + + + + ErrorHistoryID + System.Int32 + + + + + + PolicyDW + SELECT GroupName, GroupValue +FROM policy.v_ServerGroups +ORDER BY Sort + true + + + + GroupName + System.String + + + GroupValue + System.String + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + SELECT DISTINCT EvaluatedPolicy +FROM policy.v_PolicyHistory +WHERE CategoryName IN (@CategoryName) + true + + + + EvaluatedPolicy + System.String + + + + + + + + + + + + + 2.84375in + + + 1.83333in + + + 1.29167in + + + + + 0.25in + + + + + true + true + + + + + Last Execution Status + + + + + + + Textbox50 + + + 3 + + + + + + + + 0.2725in + + + + + true + true + + + + + Server/Instance/Database Object + + + + + + + + + + + true + true + + + + + Policy Result + + + + + + + + + + + + + + true + true + + + + + Failed Policies + + + + + + + + + + + + + + 0.21in + + + + + true + true + + + + + =Fields!EvaluatedServer.Value + + + + + + + + + + + + + + + + + Bar + + + + White + DiagonalLeft + =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold") + None + 1pt + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + + + 0pt + 0pt + External + + + 25 + Circle + Cross + 70 + + + + + + + Gray + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + 0 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + 80 + 80 + Cross + + + + + Silver + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + 80 + 80 + Cross + + + + + Gainsboro + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + 80 + 80 + Cross + + + + + #00ffffff + None + White + None + 0pt + + NaN + NaN + + 1 + 1 + + + 0 + 1 + + + NaN + NaN + + + DimGray + + -20 + Cross + + External + + + 5 + 0.5 + + + NaN + NaN + + + DimGray + + Cross + + External + + + 9 + 1 + true + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + NaN + NaN + 20 + Outside + true + true + true + true + + 0 + + + + + + WhiteSmoke + HorizontalCenter + DarkGray + None + 0pt + + RoundedRectangular + + + + + External + + + + true + + External + + + NaN + 50 + 100 + + + + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + NoOutput + + None + Tbl_PolicyHistory + + NaN + 1 + + + NaN + 1 + + None + + External + + + 1 + + + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + Red + 1 + ThreeSignsDiamond + + External + + + + + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + Tomato + 1 + ButtonStop + + External + + + + + + 0.01 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + Gold + 1 + ThreeSignsTriangle + + External + + + + + + 0 + 1 + NoOutput + + + 0 + 1 + NoOutput + + Green + 1 + Circle + + External + + + + + 0 + + ThreeSigns + + 54 + 4 + 42 + 92 + + + true + + + + Gainsboro + DiagonalLeft + Gray + None + 0pt + + + + + + External + + + + + External + + + ReportHistory + 9 + + + White + + + + + + + + true + true + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + + + + + + + + + White + 2pt + 20pt + 2pt + 2pt + + + + + + + + 0.21in + + + + + true + true + + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + + + + + + + + + + + + + Bar + + + + White + DiagonalLeft + =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold") + None + 1pt + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + + + 0pt + 0pt + External + + + 25 + Wedge + Cross + 70 + + + + + + + Gray + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + 0 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + 80 + 80 + Cross + + + + + Silver + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + 80 + 80 + Cross + + + + + Gainsboro + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + 80 + 80 + Cross + + + + + #00ffffff + None + White + None + 0pt + + NaN + NaN + + 1 + 1 + + + 0 + 1 + + + NaN + NaN + + + DimGray + + -20 + Cross + + External + + + 5 + 0.5 + + + NaN + NaN + + + DimGray + + Cross + + External + + + 9 + 1 + true + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + NaN + NaN + 20 + Outside + true + true + true + true + + 0 + + + + + + WhiteSmoke + HorizontalCenter + DarkGray + None + 0pt + + RoundedRectangular + + + + + External + + + + true + + External + + + NaN + 50 + 100 + + + + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + NoOutput + + None + table1_EvaluatedServer + + NaN + 1 + + + NaN + 1 + + None + + External + + + 1 + + + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + Red + 1 + ThreeSignsDiamond + + External + + + + + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + Tomato + 1 + ButtonStop + + External + + + + + + 0.01 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + Gold + 1 + ThreeSignsTriangle + + External + + + + + + 0 + 1 + NoOutput + + + 0 + 1 + NoOutput + + Green + 1 + ThreeSignsCircle + + External + + + + + 0 + + ThreeSigns + + 54 + 4 + 42 + 92 + + + true + + + + Gainsboro + DiagonalLeft + Gray + None + 0pt + + + + + + External + + + + + External + + + ReportHistory + 9 + + + White + + + + + + + + true + true + + + + + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, +Fields!PolicyResult.Value= "ERROR", 1, +Fields!PolicyResult.Value= "PASS", 0)) + + + + + + + + + White + 2pt + 20pt + 2pt + 2pt + + + + + + + + 0.21in + + + + + true + + =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) = Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False) + + true + + + + + =Fields!EvaluatedPolicy.Value + + + + + + + + + + + true + true + + + + + =Fields!PolicyResult.Value + + + + + + + PolicyResult + + + + + PolicyDetails + + + =Fields!policy_id.Value + + + =Fields!EvaluatedObject.Value + + + =Fields!PolicyResult.Value + + + + + + + + + + + + + + true + true + + + + + =Fields!EvaluationDateTime.Value + + + + + + + EvaluationDateTime + + + + + + + + 0.21in + + + + + true + true + + + + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + + + + + + + + true + true + + + + + + + + + + + + Textbox64 + + + + + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + =Fields!EvaluatedServer.Value + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + Descending + + + =Fields!EvaluatedServer.Value + + + + + true + + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + Descending + + + = +Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + true + + + + + + + + + =Fields!EvaluatedPolicy.Value + =Fields!EvaluationDateTime.Value + + + + + =Fields!EvaluatedPolicy.Value + + + + + After + + + + + StartAndEnd + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + NotEqual + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + Detail + + + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + + + + =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) <> Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False) + Policy + + Detail_Collection + Output + true + + + + true + DatabaseName + + + + + + + true + DatabaseName + + + + + true + EvaluatedServer + + + + + + + ReportHistory + 3.83in + 1.3625in + 5.96875in + + + + + Circle + + + + + + + True + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Failed Policies % + + + + True + + + + False + + + + + + 0.5 + + NaN + NaN + NaN + + + + Failed Objects Count + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + Failed Policy % By Month + + + + BrightPastel + + + + + No Data Available + + + ReportHistoryFull + 0.90292in + 6.01042in + 2.79167in + 4.98958in + 1 + + + White + None + + + + true + true + + + + + Objects in Failed State + + + + + + + 1.02792in + 0.93492cm + 0.31958in + 1.92012in + 2 + + + + true + true + + + + + =Sum(Fields!FailedPolicyCount.Value, "ReportHistory") + + + + + + + + + + + PolicyEvaluationDetails + + + =Parameters!CategoryName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + 1.02792in + 2.34376in + 0.31958in + 0.76389in + 3 + ="Click to review evaluation details" + + + + true + true + + + + + SQL Server Compliance + + + + + + + + + + + + + + + =Fields!CategoryName.Value + + + + + =Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)) + + + + + + + + + + + + =Fields!PolicyResult.Value + + + + + =IIF(Fields!PolicyResult.Value="FAIL", 1, (IIF(Fields!PolicyResult.Value="PASS", 2, 3))) + Descending + + + + + + + + + + + + + =Fields!TrimCategoryName.Value + =IIF(IsNothing(Fields!PolicyResult.Value), Nothing, Count(Fields!PolicyResult.Value)) + + + + + true + Outside + + ="View Failed Policy Details for " & Fields!CategoryName.Value + + + + + PolicyEvaluationDetails + + + =Fields!CategoryName.Value + + + ="ALL" + + + =Parameters!ServerGroupName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + + + + + + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + -45 + Rotate45 + true + 8pt + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Objects Count + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + + TopRight + WideTable + + + + + Black + Black + true + + + + + Failed Object Count by Policy Category + + true + + + + Black + Green + Red + + + + + + No Data Available + + + ReportHistory + 3.83in + 6.01042in + 4.73063in + 4.98958in + 5 + + + White + None + LightGrey + None + + + + true + true + + + + + =Sum(Fields!FailedPolicyCount.Value, "ReportHistory")/Count(Fields!PolicyResult.Value, "ReportHistory") + + + + + + + 1.41694in + 2.35764in + 0.31958in + 0.76389in + 6 + + + + true + true + + + + + Failed Policies (%) + + + + + + + 1.41694in + 0.36808in + 0.31958in + 1.92012in + 7 + + + + + + + + + =Fields!InstanceStatus.Value + + + + + + + + + + + + + + + + + + + + =IIF(IsNothing(Fields!EvaluatedServer.Value), Nothing, Count(Fields!EvaluatedServer.Value)) + + + + true + true + + ="Click to review evaluation details" + + + + + PolicyEvaluationDetails + + + ALL + + + =Parameters!CategoryName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + + TopRight + WideTable + + + + + Black + Black + + + + + Instance Compliance + + + + BrightPastel + + + + + No Data Available + + + FailedInstances + 0.90292in + 3.17709in + 2.79167in + 2.79166in + 8 + + + White + None + + + + true + true + + + + + =Count(Fields!ErrorHistoryID.Value, "Evaluation_Errors") + + + + + + + + + + + PolicyEvaluationErrors + + + =Parameters!EvaluatedPolicy.Value + + + =Parameters!CategoryName.Value + + + + + + + 1.80596in + 2.35764in + 0.31958in + 0.76389in + 9 + ="Click to view error details" + + + + true + true + + + + + Object Evaluation Errors + + + + + + + 1.80596in + 0.36808in + 0.31958in + 1.92012in + 10 + + + + 9.36271in + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =First(Fields!cName.Value, "ReportHistory") + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Database Compliance + + + + + + + + + + 1.16333in + 0.93417in + 0in + 8.02083in + 3 + + + + + + true + true + + + + + Category - + + + + + + + 1.21889in + 0.8925in + 0.29513in + 1.07639in + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Policy Name + + + + + + + 1.61125in + 0.8925in + 0.34375in + 1.70833in + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + 1.56958in + 0.93417in + 0in + 8.02083in + 6 + + + + + + + + + 1.70833in + + + 2.23958in + + + 1.73958in + + + 2.40625in + + + + + 0.25in + + + + + true + true + + + + + Date Created + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Created By + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Date Modified + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Modified By + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!date_created.Value + + + + + + + date_created + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!created_by.Value + + + + + + + created_by + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!date_modified.Value + + + + + + + date_modified + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!modified_by.Value + + + + + + + modified_by + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + After + + + + + + + ReportHistory + 2.82306in + 0.8925in + 0.5in + 8.09374in + 7 + + + + + + true + true + + + + + =First(Fields!description.Value, "ReportHistory") + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Fields!help_link.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Resources + + + + + + + 4.25361in + 0.8925in + 0.34375in + 2.85417in + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Policy Status + + + + + + + 1.61125in + 4.97916in + 0.34375in + 1.60083in + 11 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =SWITCH(Parameters!Status.Value="PASS","SUCCESS", +Parameters!Status.Value="FAIL", "FAILURE", +Parameters!Status.Value="ERROR", "ERROR") + + + + + + + 1.61125in + 7.11805in + 0.34375in + 1.71195in + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Policy Target + + + + + + + Textbox4 + 2.40987in + 0.8925in + 0.34375in + 1.70833in + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!Target.Value + + + + + + + Textbox4 + 2.40987in + 2.71209in + 0.34375in + 6.24291in + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + Embedded + =IIF(Parameters!Status.Value="PASS","IndicatorImageOK","IndicatorImageSTOP") + Clip + 1.63902in + 6.78818in + 0.29514in + 0.32292in + 15 + + + + + + 5.525in + + + + + + + Textbox1 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!EvaluatedPolicy.Value + + true + + + + + Evaluated Policy + + + + + + + Textbox3 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Right(Fields!EvaluatedObject.Value,(Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value,"\"))) + + true + + + + + Evaluated Object + + + + + + + Textbox5 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!EvaluationDateTime.Value + + true + + + + + Evaluation Date Time + + + + + + + Textbox7 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!PolicyResult.Value + + true + + + + + Policy Result + + + + + + + Textbox2 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!EvaluatedServer.Value + + + + + + =IIF(RowNumber(Nothing) MOD 2, "#cad4e2", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!EvaluatedPolicy.Value + + + + + + =IIF(RowNumber(Nothing) MOD 2, "#cad4e2", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Right(Fields!EvaluatedObject.Value,(Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value,"\"))) + + + + + + =IIF(RowNumber(Nothing) MOD 2, "#cad4e2", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!EvaluationDateTime.Value + + + + + + + EvaluationDateTime + + + =IIF(RowNumber(Nothing) MOD 2, "#cad4e2", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!PolicyResult.Value + + + + + + + PolicyResult + + + =IIF(RowNumber(Nothing) MOD 2, "#cad4e2", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + After + + + + + + + true + true + ReportHistory + + + =Fields!PolicyResult.Value + Descending + + + =Fields!EvaluatedServer.Value + + + =Fields!EvaluatedPolicy.Value + + + =Right(Fields!EvaluatedObject.Value,(Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value,"\"))) + + + =Fields!EvaluationDateTime.Value + Descending + + + 0.96542in + 0.5in + 8.17709in + + + + + + true + true + + + + + SQL Server Compliance + + + + + + + + + + 1.65625in + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Database Compliance + + + + + + + + + + 1.16333in + 0.93417in + 0in + 8.02083in + 2 + + + + + + true + true + + + + + Policy Name + + + + + + + 1.61125in + 0.8925in + 0.34375in + 1.70833in + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + 1.56958in + 0.93417in + 0in + 8.02083in + 4 + + + + + + true + true + + + + + =First(Fields!EvaluationResults.Value, "ErrorHistory") + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Policy Target Server + + + + + + + 2.40987in + 0.8925in + 0.34375in + 2.57291in + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =First(Fields!EvaluatedServer.Value, "ErrorHistory") + + + + + + + 2.40987in + 3.53486in + 0.34375in + 5.42014in + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + 5.525in + + + + r + + + + + + + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!EvaluatedPolicy.Value + + true + + + + + Evaluated Policy + + + + + + + Textbox3 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!EvaluationResults.Value + + true + + + + + Evaluated Date + + + + + + + Textbox5 + + + Silver + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!EvaluatedServer.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!EvaluatedPolicy.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!EvaluationDateTime.Value + + + + + + + EvaluationDateTime + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =LEFT(Fields!EvaluationResults.Value, 1000) + + + + + + 12pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + + + + + + + + + + + + After + + + + + + + + + + + true + EvaluationErrorHistory + + + =Fields!EvaluatedServer.Value + + + =Fields!EvaluatedPolicy.Value + + + =Fields!EvaluationDateTime.Value + Descending + + + 0.96542in + 0.75in + 5.69792in + + + + + + true + true + + + + + SQL Server Compliance + + + + + + + + + + 1.71542in + + 2pt 54 @@ -1339,6 +1342,9 @@ Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value ThreeSigns + 2pt 54 @@ -3280,6 +3286,49 @@ Count(Fields!ErrorHistoryID.Value, "Evaluation_Errors") = 0, "Black") true + + + 5 + 2 + + + 0 + 0 + ServerGroupName + + + 4 + 0 + CategoryName + + + 0 + 1 + DateMonth + + + 1 + 1 + PolicyResult + + + 2 + 1 + PolicyThresholdWarning + + + 3 + 1 + PolicyThresholdCaution + + + 4 + 1 + EvaluatedPolicy + + + + Inch http://localhost/ReportServer 6c2f485d-f3eb-401c-a53b-94c2eaba3d98 diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl new file mode 100644 index 0000000000..daecf3c964 --- /dev/null +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl @@ -0,0 +1,3465 @@ + + + Overview of current state of enterprise SQL Server instances. Launch detail reports through defined actions in the report. + 0 + + + PolicyDW + None + 9d3c6ede-25bb-4220-87c8-3455b1167deb + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + =Parameters!EvaluatedPolicy.Value + + + =Parameters!ServerName.Value + + + =Parameters!Object.Value + + + SELECT + * + ,SUBSTRING (AggEvaluatedObject, 0, CHARINDEX('\',AggEvaluatedObject)) AggEvaluatedObject_First +FROM +( + SELECT + EvaluatedServer + , EvaluationDateTime + , EvaluatedPolicy + , EvaluatedObject + , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' + ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' END AS AggEvaluatedObject + , PolicyResult + , policy_id + , CategoryName + , MonthYear + , CASE WHEN PolicyResult = 'Fail' THEN 1 ELSE 0 END AS FailedPolicyCount + FROM policy.v_PolicyHistory_LastEvaluation + WHERE CategoryName IN (@CategoryName) + AND EvaluatedPolicy IN (@EvaluatedPolicy) + AND EvaluatedServer IN (@ServerName) + AND EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb..syspolicy_policies spp + INNER JOIN msdb..syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id + WHERE spc.name = 'Disabled') +) A +WHERE SUBSTRING (AggEvaluatedObject, 0, CHARINDEX('\',AggEvaluatedObject)) IN (@Object) +ORDER BY PolicyResult, EvaluatedServer + + + + EvaluatedServer + System.String + + + EvaluationDateTime + System.DateTime + + + EvaluatedPolicy + System.String + + + EvaluatedObject + System.String + + + AggEvaluatedObject + System.String + + + PolicyResult + System.String + + + policy_id + System.Int32 + + + CategoryName + System.String + + + MonthYear + System.String + + + FailedPolicyCount + System.Int32 + + + AggEvaluatedObject_First + System.String + + + =IIF(Fields!CategoryName.Value LIKE "*:*", Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)), Fields!CategoryName.Value) + + + + + + PolicyDW + SELECT DISTINCT CategoryName +FROM policy.v_PolicyHistory + true + + + + CategoryName + System.String + + + =IIF(Fields!CategoryName.Value LIKE "*:*", Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)), Fields!CategoryName.Value) + + + + + + PolicyDW + SELECT DISTINCT DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart +, MonthYear +FROM policy.v_PolicyHistory +UNION +SELECT '1900-01-01', 'ALL' +ORDER BY MonthStart DESC + true + + + + MonthYear + System.String + + + MonthStart + System.DateTime + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + =Parameters!DateMonth.Value + + + =Parameters!EvaluatedPolicy.Value + + + =Parameters!ServerGroupName.Value + + + SELECT MonthYear + , DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart + , CASE WHEN PolicyResult IN ('Fail') THEN 1 ELSE 0 end AS FailedPolicyCount +FROM policy.v_PolicyHistory +WHERE CategoryName IN (@CategoryName) +AND EvaluatedPolicy IN (@EvaluatedPolicy) +AND (EvaluatedServer IN (SELECT server_name + FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +AND @DateMonth = '1900-01-01')) + true + + + + FailedPolicyCount + System.Int32 + + + MonthStart + System.DateTime + + + MonthYear + System.String + + + + + + PolicyDW + + + =Parameters!EvaluatedPolicy.Value + true + + + =Parameters!CategoryName.Value + + + =Parameters!ServerGroupName.Value + + + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple + WHERE iple.EvaluatedServer = ple.EvaluatedServer + AND iple.CategoryName IN (@CategoryName) + AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) + AND iple.PolicyResult = 'FAIL') + THEN 'Out of Compliance' + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple + WHERE iple.EvaluatedServer = ple.EvaluatedServer + AND iple.CategoryName IN (@CategoryName) + AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) + AND iple.PolicyResult = 'ERROR') + THEN 'Unknown' + ELSE 'In Compliance' + END AS InstanceStatus + , EvaluatedServer +FROM policy.v_PolicyHistory ple +WHERE (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') +GROUP BY EvaluatedServer + true + + + + InstanceStatus + System.String + + + EvaluatedServer + System.String + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + =Parameters!ServerGroupName.Value + + + =Parameters!EvaluatedPolicy.Value + + + SELECT ErrorHistoryID +FROM policy.v_EvaluationErrorHistory_LastEvaluation +WHERE EvaluationOrderDesc = 1 +AND CategoryName IN (@CategoryName) +AND EvaluatedPolicy IN (@EvaluatedPolicy) +AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) +OR @ServerGroupName = '') + true + + + + ErrorHistoryID + System.Int32 + + + + + + PolicyDW + SELECT GroupName, GroupValue +FROM policy.v_ServerGroups +ORDER BY Sort + true + + + + GroupName + System.String + + + GroupValue + System.String + + + + + + PolicyDW + + + =Parameters!CategoryName.Value + + + SELECT DISTINCT EvaluatedPolicy +FROM policy.v_PolicyHistory +WHERE CategoryName IN (@CategoryName) + true + + + + EvaluatedPolicy + System.String + + + + + + PolicyDW + + + =Parameters!ServerGroupName.Value + + + SELECT DISTINCT [EvaluatedServer] +FROM [policy].[PolicyHistoryDetail] +WHERE + (EvaluatedServer COLLATE SQL_Latin1_General_CP1_CI_AI IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) + OR @ServerGroupName = '') +ORDER BY [EvaluatedServer] + + + + EvaluatedServer + System.String + + + + + + PolicyDW + + + =Parameters!ServerName.Value + + + SELECT DISTINCT + SUBSTRING (AggEvaluatedObject, 0, CHARINDEX('\',AggEvaluatedObject)) AggEvaluatedObject_First +FROM +( + SELECT + CASE + WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' + ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' + END AS AggEvaluatedObject + FROM [policy].[PolicyHistoryDetail] + WHERE + EvaluatedServer IN (@ServerName) +) A +ORDER BY AggEvaluatedObject_First + + + + AggEvaluatedObject_First + System.String + + + + + + + + + + + + + 2.84375in + + + 1.83333in + + + 1.29167in + + + + + 0.25in + + + + + true + true + + + + + Last Execution Status + + + + + + + Textbox50 + + + 3 + + + + + + + + 0.2725in + + + + + true + true + + + + + Server/Instance/Database Object + + + + + + + + + + + true + true + + + + + Policy Result + + + + + + + + + + + + + + true + true + + + + + Failed Policies + + + + + + + + + + + + + + 0.21in + + + + + true + true + + + + + =Fields!EvaluatedServer.Value + + + + + + + + + + + + + + + + + Bar + + + + White + DiagonalLeft + =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold") + None + 1pt + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + + + 0pt + 0pt + External + + + 25 + Circle + Cross + 70 + + + + + + + Gray + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + 0 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + 80 + 80 + Cross + + + + + Silver + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + 80 + 80 + Cross + + + + + Gainsboro + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + 80 + 80 + Cross + + + + + #00ffffff + None + White + None + 0pt + + NaN + NaN + + 1 + 1 + + + 0 + 1 + + + NaN + NaN + + + DimGray + + -20 + Cross + + External + + + 5 + 0.5 + + + NaN + NaN + + + DimGray + + Cross + + External + + + 9 + 1 + true + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + NaN + NaN + 20 + Outside + true + true + true + true + + 0 + + + + + + WhiteSmoke + HorizontalCenter + DarkGray + None + 0pt + + RoundedRectangular + + + + + External + + + + true + + External + + + NaN + 50 + 100 + + + + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + NoOutput + + None + Tbl_PolicyHistory + + NaN + 1 + + + NaN + 1 + + None + + External + + + 1 + + + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + Red + 1 + ThreeSignsDiamond + + External + + + + + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + Tomato + 1 + ButtonStop + + External + + + + + + 0.01 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + Gold + 1 + ThreeSignsTriangle + + External + + + + + + 0 + 1 + NoOutput + + + 0 + 1 + NoOutput + + Green + 1 + Circle + + External + + + + + 0 + + ThreeSigns + + + 2pt + + 54 + 4 + 42 + 92 + + + true + + + + Gainsboro + DiagonalLeft + Gray + None + 0pt + + + + + + External + + + + + External + + + ReportHistory + 9 + + + White + + + + + + + + true + true + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + + + + + + + + + White + 2pt + 20pt + 2pt + 2pt + + + + + + + + 0.21in + + + + + true + true + + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + + + + + + + + + + + + + Bar + + + + White + DiagonalLeft + =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato", +Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold") + None + 1pt + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + + + 0pt + 0pt + External + + + 25 + Wedge + Cross + 70 + + + + + + + Gray + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + 0 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + 80 + 80 + Cross + + + + + Silver + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + 80 + 80 + Cross + + + + + Gainsboro + DiagonalLeft + Salmon + None + 0pt + + None + 0 + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + 80 + 80 + Cross + + + + + #00ffffff + None + White + None + 0pt + + NaN + NaN + + 1 + 1 + + + 0 + 1 + + + NaN + NaN + + + DimGray + + -20 + Cross + + External + + + 5 + 0.5 + + + NaN + NaN + + + DimGray + + Cross + + External + + + 9 + 1 + true + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + + 0 + + + + WhiteSmoke + + Cross + + External + + + 6 + 6 + Circle + + + + NaN + NaN + 20 + Outside + true + true + true + true + + 0 + + + + + + WhiteSmoke + HorizontalCenter + DarkGray + None + 0pt + + RoundedRectangular + + + + + External + + + + true + + External + + + NaN + 50 + 100 + + + + + + =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) + 1 + NoOutput + + None + table1_EvaluatedServer + + NaN + 1 + + + NaN + 1 + + None + + External + + + 1 + + + + =Parameters!PolicyThresholdWarning.Value + 1 + + + 1 + 1 + + Red + 1 + ThreeSignsDiamond + + External + + + + + + =Parameters!PolicyThresholdCaution.Value + 1 + + + =Parameters!PolicyThresholdWarning.Value + 1 + + Tomato + 1 + ButtonStop + + External + + + + + + 0.01 + 1 + + + =Parameters!PolicyThresholdCaution.Value + 1 + + Gold + 1 + ThreeSignsTriangle + + External + + + + + + 0 + 1 + NoOutput + + + 0 + 1 + NoOutput + + Green + 1 + ThreeSignsCircle + + External + + + + + 0 + + ThreeSigns + + + 2pt + + 54 + 4 + 42 + 92 + + + true + + + + Gainsboro + DiagonalLeft + Gray + None + 0pt + + + + + + External + + + + + External + + + ReportHistory + 9 + + + White + + + + + + + + true + true + + + + + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, +Fields!PolicyResult.Value= "ERROR", 1, +Fields!PolicyResult.Value= "PASS", 0)) + + + + + + + + + White + 2pt + 20pt + 2pt + 2pt + + + + + + + + 0.21in + + + + + true + + =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) = Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False) + + true + + + + + =Fields!EvaluatedPolicy.Value + + + + + + + + + + + true + true + + + + + =Fields!PolicyResult.Value + + + + + + + PolicyResult + + + + + PolicyDetails + + + =Fields!policy_id.Value + + + =Fields!EvaluatedObject.Value + + + =Fields!PolicyResult.Value + + + + + + + + + + + + + + true + true + + + + + =Fields!EvaluationDateTime.Value + + + + + + + EvaluationDateTime + + + + + + + + 0.21in + + + + + true + true + + + + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + + + + + + + + true + true + + + + + + + + + + + + Textbox64 + + + + + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + =Fields!EvaluatedServer.Value + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + Descending + + + =Fields!EvaluatedServer.Value + + + + + true + + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0)) + Descending + + + = +Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + + + + + true + + + + + + + + + =Fields!EvaluatedPolicy.Value + =Fields!EvaluationDateTime.Value + + + + + =Fields!EvaluatedPolicy.Value + + + + + After + + + + + StartAndEnd + + + + =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) + NotEqual + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + Detail + + + + =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))) + + + + + + + =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) <> Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False) + Policy + + Detail_Collection + Output + true + + + + true + DatabaseName + + + + + + + true + DatabaseName + + + + + true + EvaluatedServer + + + + + + + ReportHistory + 3.83in + 1.3625in + 5.96875in + + + + + Circle + + + + + + + True + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Failed Policies % + + + + True + + + + False + + + + + + 0.5 + + NaN + NaN + NaN + + + + Failed Objects Count + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + Failed Policy % By Month + + + + BrightPastel + + + + + No Data Available + + + ReportHistoryFull + 0.90292in + 6.01042in + 2.79167in + 4.98958in + 1 + + + White + None + + + + true + true + + + + + Objects in Failed State + + + + + + + 1.02792in + 0.93492cm + 0.31958in + 1.92012in + 2 + + + + true + true + + + + + =Sum(Fields!FailedPolicyCount.Value, "ReportHistory") + + + + + + + + + + + PolicyEvaluationDetails + + + =Parameters!CategoryName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + 1.02792in + 2.34376in + 0.31958in + 0.76389in + 3 + ="Click to review evaluation details" + + + + true + true + + + + + SQL Server Compliance + + + + + + + + + + + + + + + =Fields!CategoryName.Value + + + + + =Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)) + + + + + + + + + + + + =Fields!PolicyResult.Value + + + + + =IIF(Fields!PolicyResult.Value="FAIL", 1, (IIF(Fields!PolicyResult.Value="PASS", 2, 3))) + Descending + + + + + + + + + + + + + =Fields!TrimCategoryName.Value + =IIF(IsNothing(Fields!PolicyResult.Value), Nothing, Count(Fields!PolicyResult.Value)) + + + + + true + Outside + + ="View Failed Policy Details for " & Fields!CategoryName.Value + + + + + PolicyEvaluationDetails + + + =Fields!CategoryName.Value + + + ="ALL" + + + =Parameters!ServerGroupName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + + + + + + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + -45 + Rotate45 + true + 8pt + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Objects Count + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + + TopRight + WideTable + + + + + Black + Black + true + + + + + Failed Object Count by Policy Category + + true + + + + Black + Green + Red + + + + + + No Data Available + + + ReportHistory + 3.83in + 6.01042in + 4.73063in + 4.98958in + 5 + + + White + None + LightGrey + None + + + + true + true + + + + + =Sum(Fields!FailedPolicyCount.Value, "ReportHistory")/Count(Fields!PolicyResult.Value, "ReportHistory") + + + + + + + 1.41694in + 2.35764in + 0.31958in + 0.76389in + 6 + + + + true + true + + + + + Failed Policies (%) + + + + + + + 1.41694in + 0.36808in + 0.31958in + 1.92012in + 7 + + + + + + + + + =Fields!InstanceStatus.Value + + + + + + + + + + + + + + + + + + + + =IIF(IsNothing(Fields!EvaluatedServer.Value), Nothing, Count(Fields!EvaluatedServer.Value)) + + + + true + true + + ="Click to review evaluation details" + + + + + PolicyEvaluationDetails + + + ALL + + + =Parameters!CategoryName.Value + + + =Parameters!EvaluatedPolicy.Value + + + + + + + + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + NaN + NaN + + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + + TopRight + WideTable + + + + + Black + Black + + + + + Instance Compliance + + + + BrightPastel + + + + + No Data Available + + + FailedInstances + 0.90292in + 3.17709in + 2.79167in + 2.79166in + 8 + + + White + None + + + + true + true + + + + + =Count(Fields!ErrorHistoryID.Value, "Evaluation_Errors") + + + + + + + + + + + PolicyEvaluationErrors + + + =Parameters!EvaluatedPolicy.Value + + + =Parameters!CategoryName.Value + + + + + + + 1.80596in + 2.35764in + 0.31958in + 0.76389in + 9 + ="Click to view error details" + + + + true + true + + + + + Object Evaluation Errors + + + + + + + 1.80596in + 0.36808in + 0.31958in + 1.92012in + 10 + + + + 9.36271in +