How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011

https://support.microsoft.com/en-us/kb/2664150

How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011

  • Email
  • Print
SYMPTOMS

After you use Microsoft Dynamics CRM 2011, you may notice that the size of the SQL table PrincipalObjectAccess grows and could be using a large percentage of the database size.

CAUSE

When records are deleted in Microsoft Dynamics CRM, the related PrincipalObjectAccess records are not removed.

RESOLUTION

Apply Update Rollup 6, and then execute the script that is documented here. This script must be executed only one time after you apply Update Rollup 6. Update Rollup 6 and future Update Rollups will fix this known issue.

SQL Script To Execute
--Replace the text "Replace With DatabaseName" with your database name

--For Example

--USE [AdventureWorksCycle_MSCRM]
USE [<Replace With DatabaseName>]
GO

BEGIN TRY
BEGIN TRAN t1 

IF NOT EXISTS (SELECT * FROM sys.sysobjects

WHERE id = object_id(N‘[dbo].[ToDeletePOAEntries]‘)

AND ObjectProperty(id, N‘IsUserTable‘) = 1)

create table ToDeletePoaEntries
(
ObjectId uniqueidentifier,
Otc int
)

IF NOT EXISTS (SELECT * FROM sys.sysindexes si

INNER JOIN sys.sysobjects so ON si.id = so.id

WHERE so.id = OBJECT_ID(N‘[dbo].[ToDeletePoaEntries]‘)

AND OBJECTPROPERTY(so.id, N‘IsUserTable‘) = 1

AND si.name LIKE ‘%mainindex%‘)

CREATE UNIQUE NONCLUSTERED INDEX [mainindex] ON [dbo].[ToDeletePoaEntries]
(
[ObjectId] ASC,
[Otc] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

----- Insert records to be deleted in ToDeletePoaEntries

-- go through all user-owned entities which are not replicated and don‘t support duplicate detection
declare entity_cursor cursor local FORWARD_ONLY READ_ONLY
for select distinct e.ObjectTypeCode, e.BaseTableName, a.PhysicalName from EntityView e
inner join AttributeView a on e.EntityId = a.EntityId and a.IsPKAttribute = 1
where e.IsReplicated = 0 and e.IsDuplicateCheckSupported = 0 and e.OwnershipTypeMask & 1 = 1

open entity_cursor

declare @baseTableName sysname
declare @otc nvarchar(20)
declare @primaryKey sysname
declare @totalCollected int = 0
declare @currentCollected int

declare @tempRowCount int = 0
declare @collectstatement nvarchar(max)

fetch next from entity_cursor
into @otc, @baseTableName, @primaryKey

while @@FETCH_STATUS = 0
begin
print ‘Cleaning up POA for ‘ + @baseTableName

set @currentCollected = 0

set @collectstatement = ‘insert into ToDeletePoaEntries(ObjectId, Otc)
select distinct poa.ObjectId, poa.ObjectTypeCode
from PrincipalObjectAccess poa
left join ‘ + @baseTableName + ‘ e on poa.ObjectId = e.‘ + @primaryKey +
‘ where e.‘ + @primaryKey + ‘ is null and poa.ObjectTypeCode = ‘ + @otc;

print @collectstatement

exec(@collectstatement)
set @tempRowCount = @@ROWCOUNT
set @currentCollected = @currentCollected + @tempRowCount
print CAST(@currentCollected as nvarchar(20)) + ‘ records collected for ‘ + @baseTableName
set @totalCollected = @totalCollected + @currentCollected

fetch next from entity_cursor
into @otc, @baseTableName, @primaryKey
end

close entity_cursor
deallocate entity_cursor

print CAST(@totalCollected as nvarchar(20)) + ‘ total records collected‘

-- Delete query

-- This scripts cleans up orphaned POA records for selected entities

declare @deleteBatchSize int = 50000
declare @deleteBatchSizeNVarChar nvarchar(10) = CAST(@deleteBatchSize as nvarchar(10))
declare @totalDeleted int = 0
declare @currentDeleted int
declare @deletestatement nvarchar(max)

set @currentDeleted = 0
set @tempRowCount = 0

-- delete all records of the current entity type which don‘t have corresponding object in the base table
set @deletestatement = ‘delete top (‘ + @deleteBatchSizeNVarChar + ‘) from PrincipalObjectAccess
from PrincipalObjectAccess poa
join ToDeletePoaEntries e on poa.ObjectId = e.ObjectId and poa.ObjectTypeCode = e.Otc‘

print @deletestatement

-- delete PrincipalObjectAccess records in batches
exec(@deletestatement)
set @tempRowCount = @@ROWCOUNT
set @currentDeleted = @currentDeleted + @tempRowCount

while @tempRowCount = @deleteBatchSize
begin
exec(@deletestatement)
set @tempRowCount = @@ROWCOUNT
set @currentDeleted = @currentDeleted + @tempRowCount

print CAST(@currentDeleted as nvarchar(20)) + ‘ records deleted ‘ + cast(getUtcdate() as nvarchar(50))
--cleanup

end

COMMIT TRAN t1

-- Cleanup

DROP Table [dbo].[ToDeletePoaEntries]
PRINT ‘EXECUTION SUCCEED‘
END TRY
BEGIN CATCH
ROLLBACK TRAN t1

-- Cleanup

DROP Table [dbo].[ToDeletePoaEntries]

PRINT ‘EXECUTION FAILED :‘ + ERROR_MESSAGE()
END CATCH
MORE INFORMATION

This script only needs to be run one time after Update Rollup 6 or a future Update Rollup is installed. After the script is run to clean up the PrincipalObjectAccess table, the script does not need to be run after any future Update Rollup installations.

Properties

Article ID: 2664150 - Last Review: 06/27/2012 12:54:00 - Revision: 6.0

Applies to

Microsoft Dynamics CRM 2011

Keywords:

  • kbmbsmigrate kbsurveynew KB2664150
时间: 2024-08-24 21:54:03

How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011的相关文章

Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 &amp; CRM 2013 JavaScript Library

XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservicetoolkit.codeplex.com/documentation 特殊用法Create 和 Update { id: Id, logicalName: "new_entityname", type: "EntityReference" };       //Loo

Microsoft Dynamics CRM 2011 安装完全教程

环境介绍 WINDOWS 2008 R2 Datacenter Microsoft SQL SERVER 2008 R2 Microsoft Dynamics CRM 2011 准备工作 VM虚拟机中三台机器,三台机器最好是单独安装,如果是复制的会因为计算机系统的SID都是一样.所以想修改各个系统的SID号.以前WIN2003有修改SID的工具NEWSID,在WINDOWS2008系统集成了sysprep工具, 启动Windows2008进入系统后,打开“CMD窗 口”并进入到"C:\windo

Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法

症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 RetrieveMultiple 查询 Microsoft SQL 查询计划.RetrieveMultiple 优化的基本的深度,则需要读取权限"本地的深度"和"深层防御"读取权限. 解决方案 重要:此部分. 方法或任务包含一些介绍如何修改注册表的步骤.但是,如果不正确地修改了注册表,

Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)

本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下: 1 public virtual EntityCollection RetrieveMultiple (2 QueryBase query3 ) RetreiveMultiple方法的输入参数是QueryBase类的对象.QueryBase是一个基类,有多个子类,其类树如下图所示: 由上图可见,

Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法

Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011解决办法: John 25 Apr 2012 9:03 AM Yes thanks.  We were having this issue when importing a solution out of our development system that contain

Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络

1: 安装windows server 2008 R2 中文版 (过程略) 安装完成后设置机器名和IP地址, 本过程机器名 crm5dev,192.168.0.110 dns: 192.168.0.110(本机) Administrator/[email protected] 2: 通过服务器管理器添加域服务,配置域服务器域名为crm5.lab. 注意:使用高级模式安装. 说明:服务器是windows server 2003 那么就选windows server 2003 服务器是windows

Orchard CRM 更新 - 同时支持 Microsoft Dynamics CRM 2011, 2013, 2015!

本版本支持: 使用Orchard 1.8.1 系统 Dynamics CRM 2015 DLL .Net Framework 4.5.2 演示版本: http://www.orchardcrm.com/ Orchard CRM 模块下载: https://gallery.orchardproject.net/List/Modules/Orchard.Module.DynamicsCRM

Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络

The Challenge Oftentimes in the world of Dynamics CRM, the need arises for non-CRM users to gain access to CRM data. A common solution is the implementation of a web portal which allows these users to perform certain actions on applicable CRM data. M

从 Microsoft Dynamics CRM 4.0 服务器迁移到 Microsoft Dynamics CRM 2013 Server

不能就地升级早于 Microsoft Dynamics CRM Server 2011 的版本,比如 Microsoft Dynamics CRM 4.0 服务器.但是,可以在升级过程中使用 Microsoft Dynamics CRM Server 2011 的试用版 32 位版作为过渡步骤,将 Microsoft Dynamics CRM 4.0 部署升级为 Microsoft Dynamics CRM 2013.若要将本的 Microsoft Dynamics CRM 4.0 服务器 迁移