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
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.
Article ID: 2664150 - Last Review: 06/27/2012 12:54:00 - Revision: 6.0
- kbmbsmigrate kbsurveynew KB2664150
 
How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011的更多相关文章
- Microsoft Dynamics CRM4.0 和 Microsoft Dynamics CRM 2011 JScript 方法对比
		
CRM 2011 如果需要再IE里面调试,可以按F12在前面加上contentIFrame,比如 contentIFrame.document.getElementById("字段" ...
 - Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)
		
本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下 ...
 - Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library
		
XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservic ...
 - 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 Dynam ...
 - Microsoft Dynamics CRM 2011 相关-摘自网络
		
Microsoft Dynamics CRM Server 2011硬件需求: 组件 *最低要求 *推荐配置 处理器 x64 体系结构或兼容的双核 1.5 GHz 处理器 四核 x64 体系结构 2 ...
 - Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
		
症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...
 - 转:JavaScript Reference for Microsoft Dynamics CRM 2011 / 2013
		
JavaScript Reference for Microsoft Dynamics CRM 2011 / 2013 98 Replies Here’s a quick reference guid ...
 - Microsoft Dynamics CRM 2011 安装完全教程
		
作者:卞功鑫,转载请保留.http://www.cnblogs.com/BinBinGo/p/4302612.html 环境介绍 WINDOWS 2008 R2 Datacenter Microsof ...
 - Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络
		
1: 安装windows server 2008 R2 中文版 (过程略) 安装完成后设置机器名和IP地址, 本过程机器名 crm5dev,192.168.0.110 dns: 192.168.0.1 ...
 
随机推荐
- Oracle数据库——体系结构
			
一.涉及内容 1.了解数据库的物理存储结构和逻辑存储结构 二.具体操作 1.分别使用SQL 命令和OEM 图形化工具查看本地数据库的物理文件,并使用OEM 工具在现有的users 表空间中添加user ...
 - 简单配置IIS 以及web service 实现js跨域
			
因为浏览器的安全模型,js 是不能跨域的. 解决的方法有以下几种: 1. 使用代理服务转发 2. 目前服务器添加:Access-Control-Allow-Origin 3. 使用jsonp 4. 使 ...
 - 转载——Python模拟登录代码
			
''' Created on 2014-2-20 @author: Vincent ''' import urllib.parse import gzip import json import re ...
 - ExtJs学习之Window
			
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
 - C/C++中产生随机数(rand,srand用法)
			
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...
 - Bind9用view配主从
			
We use two Bind server to realize view, master, slave----------------------------------------------- ...
 - Windows 7无线网卡启用wifi共享蓝屏!
			
我的笔记本是联想Y460P,装的是Windows 7 Ultiame(x64)系统,通过设置笔记本的无线(Intel WiFi Link 1000 BGN)搭建Wifi环境并共享,使手机能够通过笔记本 ...
 - 更改AD查询LDAP条目的1000限制
			
解除LDAP导入时的AD条目查询限制 解除LDAP导入或读取AD用户数限制问题 更改AD查询LDAP条目的1000限制 来源:http://www.jiancool.com/article/55373 ...
 - (WF)InvalidWorkflowException
			
之前一直运行正常的xaml突然不能运行了,总是显示如下错误. The test caught an unhandled exception. Caught: System.Activities.Inv ...
 - ADF_General JSF系列3_将JSP页面绑定到一个Managed Bean
			
2015-02-17 Created By BaoXinjian