domingo, 29 de junio de 2014

Borrar un content type huérfano (Delete an “Orphan” Content Type)

IMPORTANTE, LEER ANTES DE HACER CUALQUIER COSA: NO está soportado modificar la bases de Sharepoint. Por lo tanto no realices esto en PRD, ya que Microsoft no te dará soporte. Si tienes el problema que describo contacta al soporte premier de MS el cual te orientará en la solución.

Al tratar de activar la feature de “Report Server Integration Feature”

image

Me lanzaba el error:

image

The content type with Id 0x0101007DFDDF56F8A9492DAA9366B83A95B3A0 defined in feature {e8389ec7-70fd-4179-a1c4-6fcb4342d7a0} was found in the current site collection or in a subsite

El ID del content type puede ser cualquiera de los tres a continuación:

0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B (Report Builder Report)

0x010100D8704AF8ED734F4088724751E0F2727D (Report Builder Model)

0x0101007DFDDF56F8A9492DAA9366B83A95B3A0 (Report Data Source)

Entonces lo primero que hice fue forzar la activación de la feature via powershell

Enable-SPFeature -Identity E8389EC7-70FD-4179-A1C4-6FCB4342D7A0 -Url http://url_sitecollection –force

Este comando me activaba la feature pero no podía ver los content types de Reporting Services en la sección de content types del site collection o del web site

image

.image

Trate de desactivar de nuevo la feature de “Report Server Integration Feature” y activarla de nuevo desde la UI, pero me seguía tirando el mismo error.

A continuación trate de ejecutar un script de powershell para borrar los content types de la feature en todas las librerías donde estaban activado (dos scripts diferentes, uno por ID y dedicado a un website y otro por web application completo). Ejecutar estos scripts para cada content type de la feature de Reporting Services

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
get-spweb http://url_sitecollection
$spcontenttypeid = New-Object Microsoft.SharePoint.SPContentTypeId '0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B'
$ct = $web.ContentTypes[$spcontenttypeid]
$usages = [Microsoft.Sharepoint.SPContentTypeUsage]::GetUsages($ct)
foreach ($usage in $usages) {
    Write-Host $usage.Url
}

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
$targetCT = "Report Builder Report"
$targetWebApp = "url_WEBAPPLICATION"
$webapp = Get-SPWebApplication $targetWebApp
$sites = $webapp.Sites
foreach ($site in $sites)
{
foreach ($web in $site.AllWebs)
    {
        foreach ($ct in $web.ContentTypes)
        {
            if($ct.Name -eq $targetCT)
            {
            Write-Host $targetCT is defined as a content type in $web.Url
            }
        }

        foreach ($list in $web.Lists)
        {
            foreach ($listct in $list.ContentTypes)
            {
                if($listct.Name -eq $targetCT)
                {
                Write-Host $targetCT is defined in list $list in $web.Url
                }
            }
        }
        Write-Host
    }
}

Los dos scripts me decían que se estaban usando en una librería, pero al querer entrar a la librería no veía los content types.

image

Entonces a continuación borré la librería (desde las dos papeleras de reciclaje, usuario y del site collection). Pero me seguía diciendo que estaba siendo usada.

Cuando en Sharepoint te deci que algo está usado, y no lo ves, en general es porque algún componente quedo huérfano.Entonces revise la base de content types de la content database donde está el site collection (OJO, RECUERDA EL WARNING DEL PRIMER PARRAFO, NO ESTA SOPORTADO CONSULTAR LA BD DE SHAREPOINT NI MODIFICARLA, pero esto es un ejemplo para entender las cosas.)

Ejecuté la siguiente consulta de SQL:

SELECT [SiteId] ,[Class] ,[Scope] ,[ContentTypeId] ,[Version] ,[NextChildByte] ,[Size] ,[Definition] ,[ResourceDir] ,[SolutionId] ,[IsFromFeature] ,[DeleteTransactionId] FROM [Intra_ContentDB1].[dbo].[ContentTypes]
Recuerda hacer esto para cada content type.image

Vi que la columna Definition estaba con valor NULL, esto significa que esos content types NO tenían una definición. Ej: de definición del content type 0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B

<ContentType ID="0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B" Name="$Resources:ReportServerResources,ReportBuilderContentTypeName;" Group="$Resources:ReportServerResources,ReportServerContentTypeGroup;" Description="$Resources:ReportServerResources,ReportBuilderContentTypeDesc;" RequireClientRenderingOnNew="FALSE" Version="1" FeatureId="{e8389ec7-70fd-4179-a1c4-6fcb4342d7a0}"><Folder TargetName="_cts/Report Builder Report" /><FieldRefs><FieldRef ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType" /><FieldRef ID="{5f47e085-2150-41dc-b661-442f3027f552}" Name="SelectFilename" /><FieldRef ID="{8553196d-ec8d-4564-9861-3dbe931050c8}" Name="FileLeafRef" Required="TRUE" /><FieldRef ID="{8c06beca-0777-48f7-91c7-6da68bc07b69}" Name="Created" Hidden="TRUE" /><FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="FALSE" ShowInNewForm="FALSE" ShowInEditForm="TRUE" /><FieldRef ID="{28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f}" Name="Modified" Hidden="TRUE" /><FieldRef ID="{822c78e3-1ea9-4943-b449-57863ad33ca9}" Name="Modified_x0020_By" Hidden="FALSE" /><FieldRef ID="{4dd7e525-8d6b-4cb4-9d3e-44ee25f973eb}" Name="Created_x0020_By" Hidden="FALSE" /></FieldRefs><DocumentTemplate TargetName="/_layouts/15/ReportServer/rs.rsapplication" /><XmlDocuments><XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">PEZvcm1UZW1wbGF0ZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC92My9jb250ZW50dHlwZS9mb3JtcyI+PERpc3BsYXk+RG9jdW1lbnRMaWJyYXJ5Rm9ybTwvRGlzcGxheT48RWRpdD5Eb2N1bWVudExpYnJhcnlGb3JtPC9FZGl0PjxOZXc+RG9jdW1lbnRMaWJyYXJ5Rm9ybTwvTmV3PjwvRm9ybVRlbXBsYXRlcz4=</XmlDocument></XmlDocuments></ContentType>

Entonces lo que hice es copiar el mismo content type en las filas donde estaban en null. Ej: este es  el update para el content type  0x0101007DFDDF56F8A9492DAA9366B83A95B3A0. IMPORTANTE: hacer lo mismo para los demás content types.

UPDATE [Intra_ContentDB1].[dbo].[ContentTypes] SET Definition = '<ContentType ID="0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B" Name="$Resources:ReportServerResources,ReportBuilderContentTypeName;" Group="$Resources:ReportServerResources,ReportServerContentTypeGroup;" Description="$Resources:ReportServerResources,ReportBuilderContentTypeDesc;" RequireClientRenderingOnNew="FALSE" Version="1" FeatureId="{e8389ec7-70fd-4179-a1c4-6fcb4342d7a0}"><Folder TargetName="_cts/Report Builder Report" /><FieldRefs><FieldRef ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType" /><FieldRef ID="{5f47e085-2150-41dc-b661-442f3027f552}" Name="SelectFilename" /><FieldRef ID="{8553196d-ec8d-4564-9861-3dbe931050c8}" Name="FileLeafRef" Required="TRUE" /><FieldRef ID="{8c06beca-0777-48f7-91c7-6da68bc07b69}" Name="Created" Hidden="TRUE" /><FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="FALSE" ShowInNewForm="FALSE" ShowInEditForm="TRUE" /><FieldRef ID="{28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f}" Name="Modified" Hidden="TRUE" /><FieldRef ID="{822c78e3-1ea9-4943-b449-57863ad33ca9}" Name="Modified_x0020_By" Hidden="FALSE" /><FieldRef ID="{4dd7e525-8d6b-4cb4-9d3e-44ee25f973eb}" Name="Created_x0020_By" Hidden="FALSE" /></FieldRefs><DocumentTemplate TargetName="/_layouts/15/ReportServer/rs.rsapplication" /><XmlDocuments><XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">PEZvcm1UZW1wbGF0ZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC92My9jb250ZW50dHlwZS9mb3JtcyI+PERpc3BsYXk+RG9jdW1lbnRMaWJyYXJ5Rm9ybTwvRGlzcGxheT48RWRpdD5Eb2N1bWVudExpYnJhcnlGb3JtPC9FZGl0PjxOZXc+RG9jdW1lbnRMaWJyYXJ5Rm9ybTwvTmV3PjwvRm9ybVRlbXBsYXRlcz4=</XmlDocument></XmlDocuments></ContentType>' WHERE ContentTypeId = 0x010100C3676CDFA2F24E1D949A8BF2B06F6B8B and Definition is null
Después de ejecutar estas queries para los tres content  types, ya me apareció en la sección de content types los tipos de contentido y en la librería donde se estaban usando y no los veía.

image


image

No hay comentarios:

Publicar un comentario