mirror of
https://github.com/Microsoft/sql-server-samples.git
synced 2025-12-08 14:58:54 +00:00
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.<?char 13?> The statement has been terminated.<?char 13?>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+130
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RptDataSource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="PolicyDW">
|
||||
<ConnectionProperties>
|
||||
<Extension>SQL</Extension>
|
||||
<ConnectString>Data Source=localhost;Initial Catalog=MDW</ConnectString>
|
||||
<IntegratedSecurity>true</IntegratedSecurity>
|
||||
</ConnectionProperties>
|
||||
<DataSourceID>be53e7b6-9fc8-452b-ac5e-151bec780bf7</DataSourceID>
|
||||
</RptDataSource>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+847
File diff suppressed because one or more lines are too long
+343
File diff suppressed because one or more lines are too long
+645
File diff suppressed because one or more lines are too long
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ToolsVersion="2.0">
|
||||
<State>$base64$PFNvdXJjZUNvbnRyb2xJbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmRkbDI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yIiB4bWxuczpkZGwyXzI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yLzIiIHhtbG5zOmRkbDEwMF8xMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDA4L2VuZ2luZS8xMDAvMTAwIiB4bWxuczpkZGwyMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAiIHhtbG5zOmRkbDIwMF8yMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAvMjAwIiB4bWxuczpkd2Q9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vRGF0YVdhcmVob3VzZS9EZXNpZ25lci8xLjAiPg0KICA8RW5hYmxlZD5mYWxzZTwvRW5hYmxlZD4NCiAgPFByb2plY3ROYW1lPjwvUHJvamVjdE5hbWU+DQogIDxBdXhQYXRoPjwvQXV4UGF0aD4NCiAgPExvY2FsUGF0aD48L0xvY2FsUGF0aD4NCiAgPFByb3ZpZGVyPjwvUHJvdmlkZXI+DQo8L1NvdXJjZUNvbnRyb2xJbmZvPg==</State>
|
||||
<DataSources>
|
||||
<ProjectItem>
|
||||
<Name>PolicyDW.rds</Name>
|
||||
<FullPath>PolicyDW.rds</FullPath>
|
||||
</ProjectItem>
|
||||
</DataSources>
|
||||
<DataSets>
|
||||
<ProjectItem>
|
||||
<Name>ReportHistory.rsd</Name>
|
||||
<FullPath>ReportHistory.rsd</FullPath>
|
||||
</ProjectItem>
|
||||
</DataSets>
|
||||
<Reports>
|
||||
<ProjectItem>
|
||||
<Name>PolicyDashboard.rdl</Name>
|
||||
<FullPath>PolicyDashboard.rdl</FullPath>
|
||||
</ProjectItem>
|
||||
<ProjectItem>
|
||||
<Name>PolicyDetails.rdl</Name>
|
||||
<FullPath>PolicyDetails.rdl</FullPath>
|
||||
</ProjectItem>
|
||||
<ProjectItem>
|
||||
<Name>PolicyEvaluationDetails.rdl</Name>
|
||||
<FullPath>PolicyEvaluationDetails.rdl</FullPath>
|
||||
</ProjectItem>
|
||||
<ProjectItem>
|
||||
<Name>PolicyEvaluationErrorDetails.rdl</Name>
|
||||
<FullPath>PolicyEvaluationErrorDetails.rdl</FullPath>
|
||||
</ProjectItem>
|
||||
<ProjectItem>
|
||||
<Name>PolicyEvaluationErrors.rdl</Name>
|
||||
<FullPath>PolicyEvaluationErrors.rdl</FullPath>
|
||||
</ProjectItem>
|
||||
</Reports>
|
||||
<Configurations>
|
||||
<Configuration>
|
||||
<Name>Debug</Name>
|
||||
<Platform>Win32</Platform>
|
||||
<Options>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<TargetServerVersion>SSRS2008R2</TargetServerVersion>
|
||||
<TargetServerURL>http://localhost/Reportserver</TargetServerURL>
|
||||
<TargetFolder>EPM/EPM Reports</TargetFolder>
|
||||
<TargetDataSourceFolder>EPM/EPM Data Sources</TargetDataSourceFolder>
|
||||
<OverwriteDataSources>true</OverwriteDataSources>
|
||||
<TargetDatasetFolder>EPM/EPM Data Sets</TargetDatasetFolder>
|
||||
<OverwriteDatasets>true</OverwriteDatasets>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration>
|
||||
<Name>DebugLocal</Name>
|
||||
<Platform>Win32</Platform>
|
||||
<Options>
|
||||
<OutputPath>bin\DebugLocal</OutputPath>
|
||||
<TargetServerVersion>SSRS2008</TargetServerVersion>
|
||||
<TargetFolder>PolicyReports</TargetFolder>
|
||||
<TargetDataSourceFolder>Data Sources</TargetDataSourceFolder>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration>
|
||||
<Name>Release</Name>
|
||||
<Platform>Win32</Platform>
|
||||
<Options>
|
||||
<OutputPath>bin\Release</OutputPath>
|
||||
<TargetServerVersion>SSRS2008</TargetServerVersion>
|
||||
<TargetFolder>PolicyReports</TargetFolder>
|
||||
<TargetDataSourceFolder>Data Sources</TargetDataSourceFolder>
|
||||
</Options>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
</Project>
|
||||
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<SharedDataSet xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition">
|
||||
<Description />
|
||||
<DataSet Name="ReportHistory">
|
||||
<Query>
|
||||
<DataSourceReference>PolicyDW</DataSourceReference>
|
||||
<DataSetParameters>
|
||||
<DataSetParameter Name="@EvaluatedPolicy">
|
||||
<ReadOnly>false</ReadOnly>
|
||||
<Nullable>true</Nullable>
|
||||
<OmitFromQuery>false</OmitFromQuery>
|
||||
<rd:UserDefined>true</rd:UserDefined>
|
||||
</DataSetParameter>
|
||||
<DataSetParameter Name="@CategoryName">
|
||||
<ReadOnly>false</ReadOnly>
|
||||
<Nullable>false</Nullable>
|
||||
<OmitFromQuery>false</OmitFromQuery>
|
||||
<rd:DbType>Object</rd:DbType>
|
||||
</DataSetParameter>
|
||||
<DataSetParameter Name="@ServerGroupName">
|
||||
<ReadOnly>false</ReadOnly>
|
||||
<Nullable>false</Nullable>
|
||||
<OmitFromQuery>false</OmitFromQuery>
|
||||
<rd:DbType>Object</rd:DbType>
|
||||
</DataSetParameter>
|
||||
</DataSetParameters>
|
||||
<CommandText>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 (SELECT server_name
|
||||
FROM policy.pfn_ServerGroupInstances(@ServerGroupName))
|
||||
OR @ServerGroupName = '')
|
||||
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')
|
||||
ORDER BY PolicyResult, EvaluatedServer</CommandText>
|
||||
<rd:UseGenericDesigner>true</rd:UseGenericDesigner>
|
||||
</Query>
|
||||
<Fields>
|
||||
<Field Name="EvaluatedServer">
|
||||
<DataField>EvaluatedServer</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="TrimCategoryName">
|
||||
<Value>=IIF(Fields!CategoryName.Value LIKE "*:*", Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)), Fields!CategoryName.Value)</Value>
|
||||
</Field>
|
||||
<Field Name="EvaluationDateTime">
|
||||
<DataField>EvaluationDateTime</DataField>
|
||||
<rd:TypeName>System.DateTime</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="EvaluatedPolicy">
|
||||
<DataField>EvaluatedPolicy</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="EvaluatedObject">
|
||||
<DataField>EvaluatedObject</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="AggEvaluatedObject">
|
||||
<DataField>AggEvaluatedObject</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="PolicyResult">
|
||||
<DataField>PolicyResult</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="policy_id">
|
||||
<DataField>policy_id</DataField>
|
||||
<rd:TypeName>System.Int32</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="CategoryName">
|
||||
<DataField>CategoryName</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="MonthYear">
|
||||
<DataField>MonthYear</DataField>
|
||||
<rd:TypeName>System.String</rd:TypeName>
|
||||
</Field>
|
||||
<Field Name="FailedPolicyCount">
|
||||
<DataField>FailedPolicyCount</DataField>
|
||||
<rd:TypeName>System.Int32</rd:TypeName>
|
||||
</Field>
|
||||
</Fields>
|
||||
</DataSet>
|
||||
</SharedDataSet>
|
||||
@@ -0,0 +1,184 @@
|
||||
-- Correct imported policies
|
||||
|
||||
-- Update existing condition name to match other similar conditions. All current policies using the below condition will update automatically.
|
||||
EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'SQL Server 2005 or a Later Version', @new_name = N'SQL Server Version 2005 or a Later Version';
|
||||
GO
|
||||
|
||||
/*
|
||||
Notes:
|
||||
Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features.
|
||||
Then change "Surface Area Configuration for Database Engine 2008 Features" to apply from SQL 2005 onwards, otherwise policy evaluation fails.
|
||||
*/
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_condition @name = N'Surface Area Configuration for Database Engine 2005 and 2000 Features', @description=N'Confirms that the default surface area settings are set for Database 2000 Engine features.', @expression=N'<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>AND</OpType>
|
||||
<Count>2</Count>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>AND</OpType>
|
||||
<Count>2</Count>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>AND</OpType>
|
||||
<Count>2</Count>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>AND</OpType>
|
||||
<Count>2</Count>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>EQ</OpType>
|
||||
<Count>2</Count>
|
||||
<Attribute>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<Name>AdHocRemoteQueriesEnabled</Name>
|
||||
</Attribute>
|
||||
<Function>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<FunctionType>False</FunctionType>
|
||||
<ReturnType>Bool</ReturnType>
|
||||
<Count>0</Count>
|
||||
</Function>
|
||||
</Operator>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>EQ</OpType>
|
||||
<Count>2</Count>
|
||||
<Attribute>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<Name>OleAutomationEnabled</Name>
|
||||
</Attribute>
|
||||
<Function>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<FunctionType>False</FunctionType>
|
||||
<ReturnType>Bool</ReturnType>
|
||||
<Count>0</Count>
|
||||
</Function>
|
||||
</Operator>
|
||||
</Operator>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>EQ</OpType>
|
||||
<Count>2</Count>
|
||||
<Attribute>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<Name>SqlMailEnabled</Name>
|
||||
</Attribute>
|
||||
<Function>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<FunctionType>False</FunctionType>
|
||||
<ReturnType>Bool</ReturnType>
|
||||
<Count>0</Count>
|
||||
</Function>
|
||||
</Operator>
|
||||
</Operator>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>EQ</OpType>
|
||||
<Count>2</Count>
|
||||
<Attribute>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<Name>WebAssistantEnabled</Name>
|
||||
</Attribute>
|
||||
<Function>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<FunctionType>False</FunctionType>
|
||||
<ReturnType>Bool</ReturnType>
|
||||
<Count>0</Count>
|
||||
</Function>
|
||||
</Operator>
|
||||
</Operator>
|
||||
<Operator>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<OpType>EQ</OpType>
|
||||
<Count>2</Count>
|
||||
<Attribute>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<Name>XPCmdShellEnabled</Name>
|
||||
</Attribute>
|
||||
<Function>
|
||||
<TypeClass>Bool</TypeClass>
|
||||
<FunctionType>False</FunctionType>
|
||||
<ReturnType>Bool</ReturnType>
|
||||
<Count>0</Count>
|
||||
</Function>
|
||||
</Operator>
|
||||
</Operator>', @is_name_condition=0, @obj_name=N''
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name=N'Surface Area Configuration for Database Engine 2005 and 2000 Features', @root_condition_name=N'SQL Server Version 2000'
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_rename_policy @name = N'Surface Area Configuration for Database Engine 2005 and 2000 Features', @new_name = N'Surface Area Configuration for Database Engine 2000 Features';
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'Surface Area Configuration for Database Engine 2005 and 2000 Features', @new_name = N'Surface Area Configuration for Database Engine 2000 Features';
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_condition @name = N'Surface Area Configuration for Database Engine 2008 Features', @description=N'Confirms that the default surface area settings are set for Database 2005 and above Engine features.', @is_name_condition=0, @obj_name=N''
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name=N'Surface Area Configuration for Database Engine 2008 Features', @root_condition_name=N'SQL Server Version 2005 or a Later Version'
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_rename_policy @name = N'Surface Area Configuration for Database Engine 2008 Features', @new_name = N'Surface Area Configuration for Database Engine Features';
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'Surface Area Configuration for Database Engine 2008 Features', @new_name = N'Surface Area Configuration for Database Engine Features';
|
||||
GO
|
||||
|
||||
/*
|
||||
Note:
|
||||
"Surface Area Configuration for Service Broker Endpoints" and "Surface Area Configuration for SOAP Endpoints" fails on SQL 2000
|
||||
*/
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name = N'Surface Area Configuration for Service Broker Endpoints', @root_condition_name=N'SQL Server Version 2005 or a Later Version'
|
||||
GO
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name = N'Surface Area Configuration for SOAP Endpoints', @root_condition_name=N'SQL Server Version 2005 or a Later Version'
|
||||
GO
|
||||
|
||||
/*
|
||||
Note:
|
||||
"Public Not Granted Server Permissions" fails on SQL 2000
|
||||
*/
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Public Not Granted Server Permissions', @root_condition_name=N'SQL Server Version 2005 or a Later Version'
|
||||
GO
|
||||
|
||||
-- Fix typos or extra white spaces in descriptions
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'Checks an instance of SQL Server for setting, affinity mask to its default value 0, since in most cases, the Microsoft Windows 2000 or Windows Server 2003 default affinity provides the best performance.
|
||||
Confirms whether the setting affinity mask of server is set to zero.'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Last Successful Backup Date', @description=N'Checks whether a database has recent backups. Scheduling regular backups is important for protecting your databases against data loss from a variety of failures.
|
||||
The appropriate frequency for backing up data depends on the recovery model of the database, on business requirements regarding potential data loss, and on how frequently the database is updated. In a frequently updated database, the amount of work-loss exposure increases relatively quickly between backups.
|
||||
The best practice is to perform backups frequently enough to protect databases against data loss. The simple recovery model and full recovery model both require data backups. The full recovery model also requires log backups, which should be taken more often than data backups. For either recovery model, you can supplement your full backups with differential backups to efficiently reduce the risk of data loss. For a database that uses the full recovery model, Microsoft recommends that you take frequent log backups. For a production database that contains critical data, log backups would typically be taken every one to fifteen minutes. Note: The recommended method for scheduling backups is a database maintenance plan. '
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Cluster Disk Resource Corruption Error', @description=N'Detects SCSI host adapter configuration issues or a malfunctioning device error message in the System Log.
|
||||
http://support.microsoft.com/kb/311081'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'Detects Error EventID –11 in the System Log. This error could be because of a corrupted device driver, a hardware problem, a malfunctioning device, poor cabling, or termination issues.
|
||||
http://support.microsoft.com/kb/259237
|
||||
http://support.microsoft.com/kb/154690'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Not Ready Error', @description=N'This policy detects for error messages in Detects error messages in the System Log that can be the result of SCSI host adapter configuration issues or related problems.
|
||||
http://support.microsoft.com/kb/259237
|
||||
http://support.microsoft.com/kb/154690'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Disk Defragmentation', @description=N'This policy detects error message in System Log Detects an error message in the System Log that can result when the Windows 2000 disk defragmenter tool does not move a particular data element, and schedules Chkdsk.exe. In this condition, the error is a false positive. There is no loss of data, and, the integrity of the data is not affected.
|
||||
http://support.microsoft.com/kb/885688
|
||||
http://support.microsoft.com/kb/320866'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Failed I/O Request Error', @description=N' This policy detects a failed I/O request error message in the system log. This could be the result of a variety of things, including a firmware bug or faulty SCSI cables.
|
||||
http://support.microsoft.com/kb/311081
|
||||
http://support.microsoft.com/kb/885688'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log I/O Error During Hard Page Fault Error', @description=N'Detects I/O Error during hard page fault in System Log.
|
||||
http://support.microsoft.com/kb/304415
|
||||
http://support.microsoft.com/kb/305547'
|
||||
GO
|
||||
|
||||
EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'Detects Error EventID –9 in the System Log. This error indicates that I/O time-out has occurred within the storage system, as detected from the driver for the controller.
|
||||
http://support.microsoft.com/kb/259237
|
||||
http://support.microsoft.com/kb/154690'
|
||||
GO
|
||||
Binary file not shown.
@@ -0,0 +1,61 @@
|
||||
#EPM Framework 4 Release Notes
|
||||
|
||||
Over 4.12.1 below, EPM Framework 4.12.2 includes the following updates (as per received feedback): Fixed collation issues on views and reports
|
||||
|
||||
Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per received feedback):
|
||||
- Update documentation with PS security related information.
|
||||
- Added existence check conditions to "4FixImportedPolicies" to avoid errors when not all default policies were imported.
|
||||
- Fixed call to evaluation details sub-report not auto selecting policies, when called from "Failed Object Count by Policy Category" chart.
|
||||
- Added better context in text pop-up in "Failed Object Count by Policy Category" chart.
|
||||
- Added auto filtering by status when calling sub-report in "Failed Object Count by Policy Category" chart.
|
||||
- Added auto filtering by status when calling sub-report in "Failed Policy % By Month" chart.
|
||||
- Added policy filtering options in PolicyEvaluationDetails and PolicyEvaluationErrors sub-reports.
|
||||
- Added call to evaluation details sub-report from "Objects in Failed State" value in the top-left of the Policy Dashboard.
|
||||
- In PBM_Custom.zip, corrected script calling in job creation script.
|
||||
|
||||
Over 4.11 below, EPM Framework 4.12 includes the following updates (as per received feedback):
|
||||
- Fixed issue with failed execution under SQL Agent PS job due to Write-Output.
|
||||
- Fixed issue with Invoke-PolicyEvaluation and null values.
|
||||
- Added resilience with different PS versions.
|
||||
- Added server filtering options in PolicyEvaluationDetails and PolicyEvaluationErrors sub-reports.
|
||||
- In PBM_Custom.zip, fixed condition for "Enterprise Features" policy that generated evaluation errors.
|
||||
|
||||
Over 4.1 below, EPM Framework 4.11 includes the following updates (as per received feedback):
|
||||
- Fixed sub-reports deployment fail due to failed validation.
|
||||
- Fixed issue in Data Loading Stored Procedure.
|
||||
|
||||
The EPM Framework 4.1 includes the following updates:
|
||||
- New PS script Improved resilience when running from CMS hosted on SQL Server 2008, 2008R2, 2012 and 2014.
|
||||
- Improved resilience when used with PS v2, v3 and v4.
|
||||
- Improved Data Loading Stored Procedure, where some policy results might not be loaded (this has been identified as active since EPM v3).
|
||||
|
||||
The EPM Framework 4.0 includes the following updates:
|
||||
- For enhanced support of large environments Reviewed database design, including views and indexing.
|
||||
- Redesigned data load procedure.
|
||||
- PowerShell execution now deletes XML files as soon as load is done - improves space usage on temp folder.
|
||||
- Redesigned reports.
|
||||
|
||||
Tested from SQL Server 2000 to 2014.
|
||||
|
||||
Note: an upgrade script for all the relevant database objects is provided, supporting direct upgrade from v3 and v4. Please check the documentation for further information.
|
||||
|
||||
We are also providing a set of scripts as an extension to the base set of Microsoft provided policies, and assumes the user has previously imported these Microsoft provided policies, as described by the "Configure/Create Policies and Centralize on the Central Management Server" section of the EPM Configuration Documentation.
|
||||
These scripts have some fixes for the Microsoft provided policies, and include extra policies:
|
||||
- Determining the if SQL Server instances are at the recommended SP level. Note that the condition has to be updated with proper build numbers for the policy to be current.
|
||||
- Determining the if SQL Server instances are at the recommended CU or Hotfix. Note that the condition has to be updated with proper build numbers for the policy to be current.
|
||||
- Do I have log backups older than 24h?
|
||||
- Do I have full backups on read-write, full RM databases?
|
||||
- The Service accounts must not match between the several services, so what is the current status?
|
||||
- Is AutoUpdateStats Disabled and AutoUpdateStats Async Enabled? Using SSMS gives you no warning if you’ve enabled this scenario, but if you think you are using * AutoUpdateStats Async, guess again.
|
||||
- Check for database status that prevent database access, like Emergency mode or Suspect.
|
||||
- Are there Non-unique clustered indexes? This might be something you wouldn’t want as a rule-of thumb.
|
||||
- Are there tables with non-clustered IXs but no clustered IX? This might hint you to evaluate your application query activity against heaps.
|
||||
- Do I have log growth in percentage, and it’s already over 1GB?
|
||||
- Do I have more VLFs than my rule-of-thumb? This has a 100 VLF threshold – change as appropriate.
|
||||
- Am I using Enterprise SKU features? Maybe I need to move a database to another server, and if it’s not an Enterprise Edition, so I must account for this?
|
||||
- Is Maximum Server Memory set at default? You will want to set this setting different from default.
|
||||
- Is Server Memory set at a fixed value?
|
||||
- Are DB Compatibility levels same as engine version?
|
||||
- Is Tempdb number of files appropriate? Regarding number of schedulers and if is multiple of 4?
|
||||
- Do TempDB data file sizes match?
|
||||
- Is MaxDOP setting at the recommended value?
|
||||
Reference in New Issue
Block a user