Microsoft.SystemCenter.DataProtectionManager.DedupReporter.6.3.DedupStatus.DataSet (DataWarehouseDataSet)

Element properties:

AccessibilityPublic

Source Code:

<DataWarehouseDataSet ID="Microsoft.SystemCenter.DataProtectionManager.DedupReporter.6.3.DedupStatus.DataSet" Accessibility="Public">
<Dependencies>
<DataWarehouseScript>SCDW!Microsoft.SystemCenter.DataWarehouse.Script.DatasetDebuggingSupport</DataWarehouseScript>
<DataWarehouseScript>SCDW!Microsoft.SystemCenter.DataWarehouse.Script.StandardDatasetSupport</DataWarehouseScript>
</Dependencies>
<Configuration>
<IncludeSchemaTypes>
<SchemaType>SCDW!Microsoft.SystemCenter.DataWarehouse.StandardDatasetSchema</SchemaType>
</IncludeSchemaTypes>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Aggregations" type="AggregationsType"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="RawInsertTableCount" type="xsd:positiveInteger"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="DefaultAggregationIntervalCount" type="xsd:positiveInteger"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="BlockingMaintenanceDailyStartTime" type="TimeOfDayType"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="BlockingMaintenanceDurationMinutes" type="xsd:positiveInteger"/>
</Configuration>
<Install>

--------------------------------------------------------------------------------------
-- Create the StandardDataset
--------------------------------------------------------------------------------------

SET NOCOUNT ON
GO

------------------------- Create independent table and view ---------------------------

---------------------------------------------------------------------------------------

DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)

SET @ErrorInd = 0

IF NOT EXISTS (SELECT * FROM StandardDataset WHERE DatasetId = '$Config/DatasetId$')
BEGIN TRY
INSERT INTO StandardDataset (
DatasetId
,SchemaName
,DefaultAggregationIntervalCount
,RawInsertTableCount
,StagingProcessorStoredProcedureName
,BlockingMaintenanceDailyStartTime
,BlockingMaintenanceDurationMinutes
)
VALUES
(
'$Config/DatasetId$'
,'FS'
,$Config/DefaultAggregationIntervalCount$
,$Config/RawInsertTableCount$
,'FS.DedupStatusProcessStaging'
,'$Config/BlockingMaintenanceDailyStartTime$'
,$Config/BlockingMaintenanceDurationMinutes$
)
END TRY
BEGIN CATCH
SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971001, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO

--------------------------------------------------------------------------------------
-- Create the StandardDatasetAggregation entries
--------------------------------------------------------------------------------------

SET NOCOUNT ON

DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)

SET @ErrorInd = 0

DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)

IF NOT EXISTS (SELECT * FROM StandardDatasetAggregation WHERE DatasetId = '$Config/DatasetId$')
BEGIN TRY
SET @XmlDocText = '&lt;Aggregations&gt;$Config/Aggregations$&lt;/Aggregations&gt;'

EXEC @ExecResult = sp_xml_preparedocument @XmlDocHandle OUTPUT, @XmlDocText
IF @ExecResult &lt;&gt; 0 RAISERROR(777971010, 16, 1, 'FS_DedupStatusAggregation', @ExecResult)

INSERT StandardDatasetAggregation
(
DatasetId
,AggregationTypeId
,AggregationIntervalDurationMinutes
,AggregationStartDelayMinutes
,BuildAggregationStoredProcedureName
,DeleteAggregationStoredProcedureName
,GroomStoredProcedureName
,IndexOptimizationIntervalMinutes
,MaxDataAgeDays
,GroomingIntervalMinutes
,MaxRowsToGroom
,LastGroomingDateTime
,DataFileGroupName
,IndexFileGroupName
)
SELECT
'$Config/DatasetId$'
,CASE AggregationType
WHEN 'Raw' THEN 0
WHEN 'Hourly' THEN 20
WHEN 'Daily' THEN 30
END
,CASE AggregationType
WHEN 'Raw' THEN 0
WHEN 'Hourly' THEN 60
WHEN 'Daily' THEN 60*24
END
,CASE AggregationType
WHEN 'Raw' THEN 1
WHEN 'Hourly' THEN 60
WHEN 'Daily' THEN 60*24
END
,CASE AggregationType
WHEN 'Raw' THEN NULL
ELSE 'FS.DedupStatusAggregate'
END
,
CASE AggregationType
WHEN 'Raw' THEN NULL
ELSE 'FS.DedupStatusAggregationDelete'
END
,'FS.DedupStatusGroom'
,IndexOptimizationIntervalMinutes
,MaxDataAgeDays
,GroomingIntervalMinutes
,MaxRowsToGroom
,GETUTCDATE()
,DataFileGroupName
,IndexFileGroupName
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname'
,MaxTableRowCount int
,MaxTableSizeKb int
,AggregationStartDelayMinutes int
,MaxDataAgeDays int
,GroomingIntervalMinutes int
,MaxRowsToGroom int
,IndexOptimizationIntervalMinutes int
,DataFileGroupName nvarchar(256)
,IndexFileGroupName nvarchar(256)
,AggregationIntervalDurationMinutes int
)
END TRY
BEGIN CATCH
SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle

IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971002, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO

--------------------------------------------------------------------------------------
-- Define the tables and views
--------------------------------------------------------------------------------------

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE [name] = 'FS')
BEGIN
EXECUTE('CREATE SCHEMA FS')
END
GO


-- change schema ownership to allow index rebuild and reorganize
ALTER AUTHORIZATION ON SCHEMA::FS TO OpsMgrWriter
GO

-- change schema alter to allow domain table index rebuild
GRANT ALTER ON SCHEMA::dbo TO OpsMgrWriter
GO
GRANT ALTER ON SCHEMA::FS TO OpsMgrWriter
GO

-- grant create table permissions
GRANT CREATE TABLE TO OpsMgrWriter
GO

SET NOCOUNT ON

DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)

SET @ErrorInd = 0

DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)


BEGIN TRY

-- Insert definition for FS.DedupStatusStaging table into StandardDatasetStagingArea.
BEGIN TRAN
IF EXISTS (SELECT * FROM StandardDatasetStagingArea WHERE DatasetId = '$Config/DatasetId$')
BEGIN
DELETE StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$';
END

INSERT INTO StandardDatasetStagingArea
(
DatasetId
,StagingTableColumnDefinition
,MaxRowsToProcessPerTransactionCount
,BatchedProcessingSupportedInd
)
VALUES
(
'$Config/DatasetId$'
,
'DedupStatusRowId int NOT NULL IDENTITY(1, 1)
,ComputerName varchar(256)
,VolumeId varchar(256)
,Volume varchar(256)
,DaysSinceLastOptimization int
,DaysSinceLastGarbageCollection int
,DaysSinceLastScrubbing int
,OptimizedFilesCount bigint
,OptimizedFilesSize bigint
,InPolicyFilesCount bigint
,InPolicyFilesSize bigint
,DedupCompletionPercent float
,SavingsRate float
,SavedSpace bigint
,CreationTime datetime
'
-- This defines how many records does ProcessStaging sproc process per each execution (every 1 minute).
,10000 -- Value based on experience in Datacenter Production environment
,1
)
COMMIT

-- Create the FS.DedupStatusStaging table.
BEGIN TRAN
-- Drop table if it exists.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusStaging]') AND type in (N'U'))
BEGIN
DROP TABLE [FS].[DedupStatusStaging];
END

DECLARE @Statement nvarchar(max);
-- Create table.
SELECT @Statement = 'CREATE TABLE [FS].[DedupStatusStaging] (' + StagingTableColumnDefinition + ')'
FROM StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$';

EXECUTE (@Statement);

GRANT SELECT, INSERT, UPDATE, DELETE ON FS.DedupStatusStaging TO OpsMgrWriter
COMMIT

-- Inserting definition for table that will hold raw (non-aggregated) data.

INSERT StandardDatasetAggregationStorage
(
DatasetId
,AggregationTypeId
,BaseTableName
,DependentTableInd
,TableTemplate
,CoverViewSelectClause
,MaxTableRowCount
,MaxTableSizeKb
)
VALUES
(
'$Config/DatasetId$'
,0
,'DedupStatus'
,0
,'
CREATE TABLE [FS].[DedupStatus_$Guid$]
(
DedupStatusRowId uniqueidentifier DEFAULT NEWID()
,ComputerName varchar(256)
,VolumeId varchar(256)
,Volume varchar(256)
,DaysSinceLastOptimization int
,DaysSinceLastGarbageCollection int
,DaysSinceLastScrubbing int
,OptimizedFilesCount bigint
,OptimizedFilesSize bigint
,InPolicyFilesCount bigint
,InPolicyFilesSize bigint
,DedupCompletionPercent float
,SavingsRate float
,SavedSpace bigint
,CreationTime datetime
,CONSTRAINT [PK_DedupStatus_$Guid$] PRIMARY KEY CLUSTERED (DedupStatusRowId) ON $DataFileGroupName$
) ON $DataFileGroupName$
'
,'
SELECT
DedupStatusRowId
,ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
'
-- Do not partition table.
,10000000
,NULL
)

END TRY
BEGIN CATCH
SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-'),@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle

IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971003, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO

--------------------------------------------------------------------------------------
-- Allocate standard storage for the dataset.
--------------------------------------------------------------------------------------

SET NOCOUNT ON

DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)

SET @ErrorInd = 0

DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)

BEGIN TRY
SET @XmlDocText = '&lt;Aggregations&gt;$Config/Aggregations$&lt;/Aggregations&gt;'

EXEC @ExecResult = sp_xml_preparedocument @XmlDocHandle OUTPUT, @XmlDocText
IF @ExecResult &lt;&gt; 0 RAISERROR(777971004, 16, 1, 'FS_DedupStatusAggregation', @ExecResult)

DECLARE
@AggregationType varchar(50)
,@Statement nvarchar(max)

SET @AggregationType = ''

WHILE EXISTS (SELECT *
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname')
WHERE AggregationType &gt; @AggregationType
)
BEGIN
SELECT TOP 1 @AggregationType = AggregationType
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname')
WHERE AggregationType &gt; @AggregationType
ORDER BY AggregationType

SET @Statement = 'EXEC StandardDatasetAllocateStorage @DatasetId = ''$Config/DatasetId$'', @AggregationTypeId='
+ CASE @AggregationType
WHEN 'Raw' THEN '0'
WHEN 'Hourly' THEN '20'
WHEN 'Daily' THEN '30'
END
EXECUTE (@Statement)
END
END TRY
BEGIN CATCH
SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle

IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971005, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusProcessStaging]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusProcessStaging] AS RETURN 1')
END
GO

ALTER PROCEDURE [FS].[DedupStatusProcessStaging]
@DatasetId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON

DECLARE
@ErrorInd bit
,@ErrorMessage nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(4000)

SET @ErrorInd = 0

DECLARE
-- Configuration variables.
-- Maximum age of data to keep in table DedupStatusStaging.
@MaxDataAgeDays int
-- Maximum number of rows to process per single run of this stored procedure.
,@MaxRowsToProcess int
-- Diagnostic variables.
,@DebugLevel int
,@DebugMessage nvarchar(4000)
,@OperationStartedDateTime datetime
,@OperationDurationMs bigint
,@RowsDeleted int
,@CountTotalProcessedRecords int
-- Number of records successfully processed and submitted into table.
,@CountSubmittedRecords int
-- Number of records for which there no match was found in Alert table.
,@CountSkippedRecords int
-- Number of records with invalid content in 'Context' column.
,@CountInvalidRecords int

-- Processing variables.
,@BaseTableName nvarchar(90)
,@InsertTableName nvarchar(90)
,@Statement nvarchar(max)
,@SchemaName nvarchar(max)
,@TableGuid varchar(50)
,@StoredTableGuid varchar(50)
,@StoredInsertTableName nvarchar(90)
,@RowId int


BEGIN TRY
-- Get the debug level for dataset.
SELECT @DebugLevel = DebugLevel ,
@SchemaName = SchemaName
FROM dbo.StandardDataset WHERE DatasetId = @DatasetId;

EXEC dbo.StandardDatasetGetInsertTableGuid @DatasetId, 0, @TableGuid OUTPUT
SET @TableGuid = REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')

SELECT @BaseTableName = BaseTableName
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (DependentTableInd = 0)

SET @InsertTableName = QUOTENAME(@SchemaName) + '.' + QUOTENAME(@BaseTableName + '_' + @TableGuid )
--
-- Groom the table DedupStatusStaging.
--
-- Get the grooming settings for table.
SELECT @MaxDataAgeDays = MaxDataAgeDays
FROM dbo.StandardDatasetAggregation WHERE DatasetId = @DatasetId AND AggregationTypeId = 0;
-- Delete the outdated records using the same grooming settings as for DedupStatusStaging table.
DELETE FROM FS.DedupStatusStaging WHERE [CreationTime] &lt; DATEADD(day, - @MaxDataAgeDays, GETUTCDATE());
SET @RowsDeleted = @@ROWCOUNT;

IF((@DebugLevel &gt; 2) AND (@RowsDeleted &lt; 0))
-- Log a debug message.
BEGIN
SET @DebugMessage = 'Groomed table FS.DedupStatusStaging by ' + CAST(@RowsDeleted as varchar(16)) + ' records.';

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 3
,@MessageText = @DebugMessage
,@OperationDurationMs = @OperationDurationMs;
END
-- Log a debug message.
IF (@DebugLevel &gt; 2)
BEGIN
SET @OperationStartedDateTime = GETDATE();
SET @OperationDurationMs = 0;

SET @DebugMessage = 'Started stage processing of FS.DedupStatusStaging table.';

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 3
,@MessageText = @DebugMessage
,@OperationDurationMs = @OperationDurationMs;
END

--
-- Perform stage processing.
--
-- Get the configuration value for stage processing.
SELECT @MaxRowsToProcess = MaxRowsToProcessPerTransactionCount
FROM dbo.StandardDatasetStagingArea
WHERE DatasetId = @DatasetId;

if object_id('tempdb..#DedupStatusStagingBatch') is not null drop table #DedupStatusStagingBatch

CREATE TABLE #DedupStatusStagingBatch
(
DedupStatusRowId int
,ComputerName varchar(256)
,VolumeId varchar(256)
,Volume varchar(256)
,DaysSinceLastOptimization int
,DaysSinceLastGarbageCollection int
,DaysSinceLastScrubbing int
,OptimizedFilesCount bigint
,OptimizedFilesSize bigint
,InPolicyFilesCount bigint
,InPolicyFilesSize bigint
,DedupCompletionPercent float
,SavingsRate float
,SavedSpace bigint
,CreationTime datetime
);

BEGIN TRAN

-- Select only the earliest @MaxRowsToProcess records from DedupStatusStaging for processing.
-- This way the processing is balanced in order not to let this stored procedure to time out.
INSERT INTO #DedupStatusStagingBatch(
DedupStatusRowId
,ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
)
SELECT TOP (@MaxRowsToProcess)
DedupStatusRowId
,ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
FROM FS.DedupStatusStaging AS A
ORDER BY DedupStatusRowId;

SET @Statement = 'INSERT INTO [FS].DedupStatus_' + CAST(@TableGuid AS varchar(300)) +
'(
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
)
SELECT
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
FROM #DedupStatusStagingBatch B'

EXECUTE (@Statement)

DELETE FROM [FS].DedupStatusStaging
FROM [FS].DedupStatusStaging AS staging -- Second FROM clause is used for filtering the records to be deleted.
INNER JOIN #DedupStatusStagingBatch AS batch ON staging.DedupStatusRowId = batch.DedupStatusRowId

COMMIT TRAN
-- Drop the temporary table.
DROP TABLE #DedupStatusStagingBatch;
END TRY
BEGIN CATCH
IF (@@TRANCOUNT &gt; 0)
ROLLBACK TRAN

SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel &gt; 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)

SET @DebugMessageText = N'Failed to process staging. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 1
,@MessageText = @DebugMessageText
END
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971006, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END

END
GO

GRANT EXECUTE ON [FS].[DedupStatusProcessStaging] TO OpsMgrWriter
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregate]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusAggregate] AS RETURN 1')
END
GO

ALTER PROCEDURE FS.DedupStatusAggregate
@DatasetId uniqueidentifier
,@AggregationTypeId int -- aggregration type: e.g. 20 = hourly
,@InsertTableGuid varchar(256) -- GUID of the aggregation table
,@IntervalStartDateTime datetime
,@IntervalEndDateTime datetime
AS
BEGIN
SET NOCOUNT ON
return 1
GRANT EXECUTE ON [FS].[DedupStatusAggregate] TO OpsMgrWriter
END
GO

GRANT EXECUTE ON [FS].[DedupStatusAggregate] TO OpsMgrWriter
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregationDelete]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusAggregationDelete] AS RETURN 1')
END
GO

ALTER PROCEDURE FS.DedupStatusAggregationDelete
@DatasetId uniqueidentifier
,@AggregationTypeId tinyint
,@TableGuid uniqueidentifier
,@AggregationDateTime datetime
,@RowsDeleted int OUTPUT
AS
BEGIN
SET NOCOUNT ON
return 1
RETURN @RowsDeleted
END
GO

GRANT EXECUTE ON [FS].[DedupStatusAggregationDelete] TO OpsMgrWriter
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusGroom]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusGroom] AS RETURN 1')
END
GO

ALTER PROCEDURE FS.DedupStatusGroom
@DatasetId uniqueidentifier
,@AggregationTypeId tinyint
,@TableGuid uniqueidentifier
,@CutoffDateTime datetime
,@MaxRowsToGroom int
,@RowsDeleted int OUTPUT
AS
BEGIN
SET NOCOUNT ON

DECLARE
@ErrorInd bit
,@ErrorMessage nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(4000)

SET @ErrorInd = 0

DECLARE
@TableName sysname
,@Statement nvarchar(max)
,@DebugLevel tinyint
,@SchemaName sysname

BEGIN TRY
SELECT
@DebugLevel = DebugLevel
,@SchemaName = SchemaName
FROM StandardDataset
WHERE DatasetId = @DatasetId

SELECT @TableName = BaseTableName + '_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = @AggregationTypeId)
AND (DependentTableInd = 0)

SET @Statement = 'DELETE TOP (' + CAST(@MaxRowsToGroom AS varchar(15)) + ')'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName)
+ ' WHERE (CreationTime &lt; ''' + CONVERT(varchar(50), @CutoffDateTime, 120) + ''')'
EXECUTE (@Statement)

SET @RowsDeleted = @@ROWCOUNT
GRANT EXECUTE ON [FS].[DedupStatusGroom] TO OpsMgrWriter
END TRY
BEGIN CATCH
IF (@@TRANCOUNT &gt; 0)
ROLLBACK TRAN

SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

-- report error if any
IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel &gt; 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)

SET @DebugMessageText = N'Failed to groom data for DedupStatus data set. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 1
,@MessageText = @DebugMessageText
END

DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971007, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END

RETURN @RowsDeleted
END
GO

GRANT EXECUTE ON [FS].[DedupStatusGroom] TO OpsMgrWriter
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusInsert]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusInsert] AS RETURN 1')
END
GO

ALTER PROCEDURE FS.DedupStatusInsert
@ManagementGroupId uniqueidentifier
,@DatasetId uniqueidentifier
,@DataXml nvarchar(max)
AS
BEGIN
SET NOCOUNT ON
DECLARE @CheckExecResult int
,@ManagementGroupRowId int

-- get the management group
SELECT @ManagementGroupRowId = ManagementGroupRowId
FROM vManagementGroup
WHERE (ManagementGroupGuid = @ManagementGroupId) AND (WriterLoginName = SUSER_Name())

-- access check
EXEC @CheckExecResult = ManagementGroupAccessCheck @ManagementGroupId, @ManagementGroupRowId OUTPUT
IF(@CheckExecResult &lt;&gt; 0) RETURN @CheckExecResult

DECLARE
@CurentTime datetime
,@ErrorInd bit
,@ErrorMessage nvarchar(max)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(max)
,@ResultingState int

SET @ErrorInd = 0
SET @ResultingState = 1

DECLARE
@ExecResult int
,@XmlDocHandle int

BEGIN TRY
-- Add it to FS.DedupStatusStaging

-- @DataXml=

EXEC @ExecResult = sp_xml_preparedocument @XmlDocHandle OUTPUT, @DataXml
IF @ExecResult &lt;&gt; 0 RAISERROR(777971008, 16, 1, 'FS_DedupStatusInsert', @ExecResult)

INSERT INTO [FS].DedupStatusStaging
(
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
)
SELECT
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,GETUTCDATE()
FROM OPENXML(@XmlDocHandle, '/Root/Item/Context/DataItem/EventData/DataItem', 2) WITH
(
ComputerName varchar(256) 'Property[1]',
VolumeId varchar(256) 'Property[2]',
Volume varchar(256) 'Property[3]',
DaysSinceLastOptimization int 'Property[4]',
DaysSinceLastGarbageCollection int 'Property[5]',
DaysSinceLastScrubbing int 'Property[6]',
OptimizedFilesCount bigint 'Property[7]',
OptimizedFilesSize bigint 'Property[8]',
InPolicyFilesCount bigint 'Property[9]',
InPolicyFilesSize bigint 'Property[10]',
DedupCompletionPercent float 'Property[11]',
SavingsRate float 'Property[12]',
SavedSpace bigint 'Property[13]'
)

END TRY
BEGIN CATCH
IF (@@TRANCOUNT &gt; 0)
ROLLBACK TRAN

SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

SET @ErrorInd = 1
END CATCH

IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle

-- report error if any
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971009, @AdjustedErrorSeverity, @ResultingState
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
END
GO

GRANT EXECUTE ON FS.DedupStatusInsert TO OpsMgrWriter
GO
</Install>
<Uninstall>
-- drop SPs
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregate]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusAggregate]')
END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregationDelete]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusAggregationDelete]')
END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusGroom]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusGroom]')
END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusInsert]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusInsert]')
END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusProcessStaging]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusProcessStaging]')
END

-- delete std dataset related data
EXEC StandardDatasetDelete '$Config/DatasetId$'
GO
</Uninstall>
<Upgrade/>
</DataWarehouseDataSet>