<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Maintenance</title>
        <link>http://blog.crmbuzz.net/category/8.aspx</link>
        <description>Maintenance</description>
        <language>en-US</language>
        <copyright>Abe Saldana</copyright>
        <managingEditor>abraham@CRMBuzz.net</managingEditor>
        <generator>Subtext Version 1.9.4.78</generator>
        <item>
            <title>Purging rows on Princiapl Object Access</title>
            <link>http://blog.crmbuzz.net/archive/2007/05/07/Purging-rows-on-Princiapl-Object-Access.aspx</link>
            <description>&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Arial; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;[Disclaimer:All postings are provided "AS IS" with no warranties, and confer no rights.]&lt;br /&gt;
&lt;br /&gt;
Purging some tables on Crm is simple as calling the delete service and make sure that everything continues running properly, but when you have more than 10 million rows on one table (PrincipalObjectAccess) how do you will be able to take the delete process on stages?&lt;br /&gt;
&lt;br /&gt;
[MS Crm support response: There is an un-supported option that you could try if you want to get rid of all sharing that is currently setup in CRM. You could directly update the PrincipalObjectAccess table and set the AccessRightsMask and InheritedAccessRightsMask columns to 0. Then we have a deletion service that will go through and automatically clean up that table. This is not technically supported, but if you want to remove all sharing this could be an option that you could do.&lt;br /&gt;
&lt;br /&gt;
Ok that is awesome, but how to identify the rows that are not in use or ready to be deleted.&lt;br /&gt;
&lt;br /&gt;
This is one of the Sql scripts to get the total of rows ready to be deleted and terminated&lt;/span&gt;&lt;/p&gt;
&lt;div style="BORDER-RIGHT: black 1pt dashed; PADDING-RIGHT: 4pt; BORDER-TOP: black 1pt dashed; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: black 1pt dashed; PADDING-TOP: 1pt; BORDER-BOTTOM: black 1pt dashed; mso-element: para-border-div; mso-border-themecolor: text1; mso-border-alt: dot-dash black .75pt; mso-shading: windowtext; mso-pattern: gray-20 auto"&gt;
&lt;p class="CodeStyle"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="CodeStyle"&gt;declare @totalRows int&lt;br /&gt;
declare @ToDelete int&lt;br /&gt;
declare @ToDeleteMarked int&lt;br /&gt;
&lt;br /&gt;
SELECT @totalRows = count( * )&lt;br /&gt;
FROM PrincipalObjectAccess (nolock)&lt;br /&gt;
&lt;br /&gt;
SELECT @ToDelete= count( *) &lt;br /&gt;
FROM PrincipalObjectAccess (nolock)&lt;br /&gt;
where AccessRightsMask = 0&lt;br /&gt;
and InheritedAccessRightsMask &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
SELECT @ToDeleteMarked= count( *) &lt;br /&gt;
FROM PrincipalObjectAccess (nolock)&lt;br /&gt;
where AccessRightsMask = 0&lt;br /&gt;
and InheritedAccessRightsMask = 0&lt;br /&gt;
&lt;br /&gt;
Select @totalRows as TotalRows, &lt;br /&gt;
@ToDelete as ToDelete, &lt;br /&gt;
(@totalRows - @ToDelete) as RemainingRows, &lt;br /&gt;
@ToDeleteMarked as ToDeleteMarked&lt;span style="mso-tab-count: 1"&gt;  &lt;/span&gt;&lt;br style="mso-special-character: line-break" /&gt;
&lt;br style="mso-special-character: line-break" /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Arial; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Arial; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Using the previous script will give you the totals only the following script is the one that will update your columns and marked the rows for deletion..&lt;br /&gt;
&lt;br /&gt;
[IMPORTANT: Make sure that you have SQL database backups before trying this and know that you may have to restore your databases if you run into issues. Also this can ONLY be done if you want to remove ALL sharing. There is not a way to leave some sharing intact. ]&lt;br style="mso-special-character: line-break" /&gt;
&lt;br style="mso-special-character: line-break" /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div style="BORDER-RIGHT: black 1pt dashed; PADDING-RIGHT: 4pt; BORDER-TOP: black 1pt dashed; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: black 1pt dashed; PADDING-TOP: 1pt; BORDER-BOTTOM: black 1pt dashed; mso-element: para-border-div; mso-border-themecolor: text1; mso-border-alt: dot-dash black .75pt; mso-shading: windowtext; mso-pattern: gray-20 auto"&gt;
&lt;p class="CodeStyle" style="BACKGROUND: #cccccc; mso-shading: windowtext; mso-pattern: gray-20 auto"&gt;&lt;span style="COLOR: #008a3e"&gt;SELECT&lt;/span&gt; top 500000 * &lt;br /&gt;
&lt;span style="COLOR: #008a3e"&gt;into&lt;/span&gt; #TempPOA &lt;span style="COLOR: #008a3e"&gt;FROM&lt;/span&gt; &lt;br /&gt;
&lt;span style="COLOR: #c00000"&gt;PrincipalObjectAccess&lt;/span&gt; (nolock)&lt;br /&gt;
&lt;span style="COLOR: #008a3e"&gt;where&lt;/span&gt; AccessRightsMask = 0 &lt;br /&gt;
and InheritedAccessRightsMask &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;span style="COLOR: #008a3e"&gt;update&lt;/span&gt; &lt;span style="COLOR: #c00000"&gt;PrincipalObjectAccess&lt;/span&gt; &lt;br /&gt;
&lt;span style="COLOR: #008a3e"&gt;set&lt;/span&gt; InheritedAccessRightsMask = 0&lt;br /&gt;
&lt;span style="COLOR: #008a3e"&gt;where&lt;/span&gt; rowguid in (&lt;span style="COLOR: #008a3e"&gt;Select&lt;/span&gt; rowguid &lt;span style="COLOR: #008a3e"&gt;from&lt;/span&gt; #tempPOA)&lt;br /&gt;
&lt;br /&gt;
drop table #TempPOA&lt;br style="mso-special-character: line-break" /&gt;
&lt;br style="mso-special-character: line-break" /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;After finishing marking all the rows for deletion, now you can run the delete service, stop the service (not required) then run the following dos command&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="BORDER-RIGHT: black 1pt dashed; PADDING-RIGHT: 4pt; BORDER-TOP: black 1pt dashed; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: black 1pt dashed; PADDING-TOP: 1pt; BORDER-BOTTOM: black 1pt dashed; mso-element: para-border-div; mso-border-themecolor: text1; mso-border-alt: dot-dash black .75pt; mso-shading: windowtext; mso-pattern: gray-20 auto"&gt;
&lt;p class="CodeStyle"&gt;&lt;span style="FONT-SIZE: 10pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeStyle"&gt;&lt;span style="FONT-SIZE: 10pt"&gt;C:\Program Files\Microsoft CRM\Server\bin\&lt;span style="COLOR: #c00000"&gt;CrmDeletionService.exe&lt;/span&gt; &lt;span style="COLOR: #008a3e"&gt;-runonce&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
[NOTE: -runonce = Clean up database right now.] &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;we schedule the deletion service to run only once a day, on a business downtime, this process will keep your tables purged and on optimal conditions&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
regards, &lt;br /&gt;
Abe Saldaña&lt;/p&gt;
&lt;p&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;img src="http://blog.crmbuzz.net/aggbug/3.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abe Saldana</dc:creator>
            <guid>http://blog.crmbuzz.net/archive/2007/05/07/Purging-rows-on-Princiapl-Object-Access.aspx</guid>
            <pubDate>Tue, 08 May 2007 03:23:24 GMT</pubDate>
            <wfw:comment>http://blog.crmbuzz.net/comments/3.aspx</wfw:comment>
            <comments>http://blog.crmbuzz.net/archive/2007/05/07/Purging-rows-on-Princiapl-Object-Access.aspx#feedback</comments>
            <wfw:commentRss>http://blog.crmbuzz.net/comments/commentRss/3.aspx</wfw:commentRss>
            <trackback:ping>http://blog.crmbuzz.net/services/trackbacks/3.aspx</trackback:ping>
        </item>
    </channel>
</rss>