无法删除未引用的网站列

时间:2011-02-10 04:51:18

标签: sharepoint-2010 content-type custom-fields

我刚创建了几个通过VS2010引用它们的网站列和内容类型。我更新了其中一个字段然后尝试重新部署,但在撤消后,部署失败,因为先前创建的站点列仍然存在。我试图从用户界面手动删除它们,并收到一条包含此消息的警告框:

  

无法删除内容类型中包含的网站列。   删除对此站点的所有引用   删除之前的列。

我在SharePoint Manager中挖掘并没有找到任何引用,因此我使用powershell枚举所有内容类型和列表,以查找对我的站点列的引用,但一无所获。

我试图像这样使用PowerShell删除:

$web.Fields.Delete("StartTime")

导致此错误:

Exception calling "Delete" with "1" argument(s): "Site columns which are included in 
content types or on lists cannot be deleted. Please remove all instances of this site 
column prior to deleting it."
At line:1 char:19
+ $web.Fields.Delete <<<< ("StartTime")
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

最后,对PowerShell中列的简单检查显示以下内容:

Title                               Id                                                         CanBeDeleted ParentList                                                       Sealed ListsFieldUsedIn                   
-----                               --                                                         ------------ ----------                                                       ------ ----------------                   
Start Time OBE                      6fa0d85b-9af1-408b-835f-d4c66536...                                True                                                                   False {}                                 
Time Tracker Tags                   92bc866b-0415-45f0-b431-d4df69c4...                                True                                                                   False {}                                 

我对MOSS 2007和SP2010的新手很有经验,但我以前从未见过这种情况。有人有任何提示吗?

5 个答案:

答案 0 :(得分:2)

也发生在SharePoint 2010上。试着看看:

$field.AllowDeletion = $TRUE
$field.Update()

当我设定时,似乎工作。现在我无法复制它,以证明我的观点。典型

答案 1 :(得分:2)

我遇到了同样的问题,并且能够使用SharePoint Designer进行删除 - 不确定是否有人可以验证这是否适合他们。

答案 2 :(得分:2)

您需要查找和删除使用站点列的内容类型以及使用您尝试删除的站点列的任何列表或库。使用PowerShell通过以下方式获取站点列对象:

 $column = $web.Fields[“Column Display Name”]

然后找到使用它的所有地方,使用类似的东西:

$column.ListsFieldUsedIn()

使用此内容类型的每个地方吐出两个GUIDs - WebIDListID

下面是一个PowerShell脚本,它循环遍历从ListFieldUsedIn()返回的所有列表GUID,然后找到与该GUID匹配的子站点和列表,并打印出每个用法的列表名称和子站点URL:

$site = Get-SPSite "http://sharepoint"
$rootweb = $site.rootweb
$siteColumnToRemove = "Column Display Name”
$sc = $rootweb.Fields[$siteColumnToRemove]
if ($sc)
{
    write-host "  Found Site Column '" $sc.Title "' in gallery" -ForegroundColor Gray
    foreach( $listusage in $sc.ListsFieldUsedIn() )
    {
        $listID = $listusage.ListID            
        foreach ($subweb in $site.allwebs)
        {
            foreach ($list in $subweb.lists)
            {
                if ($list.ID -eq $listID)
                {                     
                     write-host "    Site Column '" $sc.Title "' used in list '" $list.Title "' in site '" $subweb.Url "'" -BackgroundColor Yellow -ForegroundColor Black
                }
            }
        }
    }
}

答案 3 :(得分:0)

已经有一段时间了,我很久以前就已经解决了这个问题,但我认为最终的答案是依赖于某个特定站点列的内容类型没有被SPM选中。

我想一旦我从网站上撤回了所有自定义内容,我就能正常删除。

答案 4 :(得分:0)

我的指导是,您永远不应删除使用过的网站列。由于尝试删除网站列或内容类型的问题,我发现网站集完全无法使用。

如果您不再需要网站列,只需隐藏它即可。