【问题标题】:How to extract data from Microsoft Content Management Server (MCMS) database如何从 Microsoft 内容管理服务器 (MCMS) 数据库中提取数据
【发布时间】:2011-07-12 13:36:37
【问题描述】:

我需要从 Microsoft 内容管理服务器 (MCMS) 数据库中提取大量数据(> 1000 页)以用于 Sitecore 网站。

我可以看到两个主要选项:

  1. 将数据迁移到新的简化数据库并显示 新网站上的信息。

  2. 将 MCMS 解决方案转换为 SharePoint 并使用 SharePoint 可供 Sitecore 显示此信息的连接器模块。

我更愿意走第一条路线,因为没有计划在未来使用 SharePoint 来管理数据/内容,并且更愿意将此信息存储在一个简单的 SQL Server 数据库中以便更好地进行搜索。

我查看了有问题的数据库,并认为我感兴趣的主要表是 NodeNodePlaceholderNodePlaceholderContent,但我很难找到我所期望的。有人可以为我解释一下这个数据库的架构吗?或者我在尝试以这种方式迁移数据时会遇到问题吗?

【问题讨论】:

    标签: asp.net sql-server sitecore mcms-2000 mcms


    【解决方案1】:

    我最近刚刚经历了从 MCMS 2002 中导出内容页面的类似过程(迁移到 Wordpress)。

    我并不是说这是获取数据的 100% 正确的方法,但它对我有用。

    这是我从数据库中获取页面内容的过程。

    正如您已经看到的,存储大部分数据的表是 NodeNodePlaceholderContent

    1.) 要了解Node 表的内容,您可以查看按类型组织的内容

    SELECT
        [Type]
        ,CASE [Type] 
            WHEN      1 THEN 'Server'
            WHEN      4 THEN 'Channel'
            WHEN     16 THEN 'Post/Page'
            WHEN     64 THEN 'Resource Gallery'
            WHEN    256 THEN 'Resource Gallery Item (images/documents)'
            WHEN  16384 THEN 'Template Gallery'
            WHEN  65536 THEN 'Template' END as [Description]
        ,COUNT([Type]) as [Count]
    FROM        dbo.Node
    GROUP BY    [Type]
    ORDER BY    [Count] DESC
    

    2.) 页面(和帖子,将在更下方覆盖帖子)的类型 = 16...但要仅获取页面(而不是帖子),我们需要按 IsShortcut = 0 过滤

    SELECT * FROM dbo.Node WHERE [Type] = 16 AND IsShortcut = 0
    

    3.) 我只想要已发布的页面,所以按 ApprovalStatus = 1 过滤

    -- Get all published pages
    SELECT * 
    FROM dbo.Node WHERE [Type] = 16 
    AND IsShortcut = 0
    AND ApprovalStatus = 1 
    

    4.) 接下来,确定由(使用用户名)创建/修改的页面

    -- Get published pages & author/editor
    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    -- add JOIN on created by user
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    -- add JOIN on modified by user
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    WHERE [Type] = 16 
    AND IsShortcut = 0
    AND ApprovalStatus = 1 
    

    5.) 接下来,使用Node.ParentGUID 列找出我们在层次结构中的位置

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[pageParent].Name -- add page parent Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    -- add JOIN on Node using ParentGUID
    INNER JOIN  dbo.Node [pageParent] ON [pageParent].NodeGUID = [page].ParentGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    此查询让我知道页面位于名为 FoldersArchive Folder 的父节点中

    6.) 再上一层(获取父级的父级)

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[pageParent].Name 
        ,[pageParent2].Name -- add parent of parent name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    INNER JOIN  dbo.Node [pageParent] ON [pageParent].NodeGUID = [page].ParentGUID
    -- add another JOIN on Node using ParentGUID (parent of parent)
    INNER JOIN  dbo.Node [pageParent2] ON [pageParent2].NodeGUID = [pageParent].ParentGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    父级的父级是Server(根级别)所以现在我的结论是如果页面的父级是:

    • Folders - 那么这是一个活动页面
    • Archive Folder - 那是另一个页面的先前版本

    我只想要活动页面,所以我将只加入 Folders 父级

    7.) 现在如何标记。在我们的 MCMS 模板中,只有一个占位符区域。 NodePlaceholder 表将识别占位符的名称,如果您的模板中有多个占位符区域,这将很有帮助。为简单起见,我只会加入 NodePlaceholdercontent

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        /* remove parent names */
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
        ,html.PropValue as 'HTML' -- add the markup
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    -- change alias to "folders"
    INNER JOIN  dbo.Node [folders] ON [folders].NodeGUID = [page].ParentGUID AND [folders].Name = 'Folders'
    -- join on PlaceholderContent to get the HTML
    -- this table will also have references to any static files contained in the page (such as images) so we filter those out by PropName = 'HTML'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = [page].Id AND html.PropName = 'HTML' 
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    8.) 所以此时我有点卡在试图确定页面在系统中的位置(即相对路径或它所在的频道),回到第 1 步和第 2 步,输入 = 16 可以是帖子或页面(它们不是同一件事,但它们是相关的)。所以现在我们将我们的页面加入到帖子记录中以确定路径。

    经过一些谷歌搜索后,我偶然发现了 this excerpt from Microsoft Content Management Server 2002: a complete guide 确实有助于完成剩下的工作(并确定了 Node.Type 枚举)

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[post].DisplayName as 'Title' -- add page Title from the post record
        ,[pageParent].Name 
        ,[pageParent2].Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
        ,html.PropValue as 'HTML'
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    INNER JOIN  dbo.Node [folders] ON [folders].NodeGUID = [page].ParentGUID AND [folders].Name = 'Folders'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = [page].Id AND html.PropName = 'HTML' 
    -- join using followGUID to get the posting
    INNER JOIN  dbo.Node [post] ON [post].FollowGUID = [page].NodeGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    9.) 现在的最后一步是继续向上传递父级层次结构,从而导致多个 LEFT JOINS 逐步提升 ParentGUID 链。此查询使用这些 LEFT JOINS 提供层次结构的可视化表示。

    SELECT 
        CASE WHEN postParent9.Name IS NULL THEN '' ELSE postParent9.Name + ' > ' END +
        CASE WHEN postParent8.Name IS NULL THEN '' ELSE postParent8.Name + ' > ' END +
        CASE WHEN postParent7.Name IS NULL THEN '' ELSE postParent7.Name + ' > ' END +
        CASE WHEN postParent6.Name IS NULL THEN '' ELSE postParent6.Name + ' > ' END +
        CASE WHEN postParent5.Name IS NULL THEN '' ELSE postParent5.Name + ' > ' END +
        CASE WHEN postParent4.Name IS NULL THEN '' ELSE postParent4.Name + ' > ' END +
        CASE WHEN postParent3.Name IS NULL THEN '' ELSE postParent3.Name + ' > ' END +
        CASE WHEN postParent2.Name IS NULL THEN '' ELSE postParent2.Name + ' > ' END +
        CASE WHEN postParent1.Name IS NULL THEN '' ELSE postParent1.Name + ' > ' END +
        page.Name as [Path]
        ,page.Name + '.htm' as [PageName]
        ,post.DisplayName as [PageTitle]
        ,CASE page.[Type] 
            WHEN      1 THEN 'Server'
            WHEN      4 THEN 'Channel'
            WHEN     16 THEN 'Post/Page'
            WHEN     64 THEN 'Resource Gallery'
            WHEN    256 THEN 'Resource Gallery Item (images/documents)'
            WHEN  16384 THEN 'Template Gallery'
            WHEN  65536 THEN 'Template' END as [Type]
        ,page.CreatedWhen as 'Created'
        ,page.ModifiedWhen as 'Modified'
        ,html.PropValue as 'HTML'
    FROM        dbo.Node page
    INNER JOIN  dbo.Node folders ON folders.NodeGUID = page.ParentGUID AND folders.Name = 'Folders'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = page.Id AND html.PropName = 'HTML'
    INNER JOIN  dbo.Node post ON post.FollowGUID = page.NodeGUID AND post.IsShortcut = 1
    LEFT JOIN   dbo.Node postParent1 ON postParent1.NodeGuid = post.ParentGUID
    LEFT JOIN   dbo.Node postParent2 ON postParent2.NodeGuid = postParent1.ParentGUID
    LEFT JOIN   dbo.Node postParent3 ON postParent3.NodeGuid = postParent2.ParentGUID
    LEFT JOIN   dbo.Node postParent4 ON postParent4.NodeGuid = postParent3.ParentGUID
    LEFT JOIN   dbo.Node postParent5 ON postParent5.NodeGuid = postParent4.ParentGUID
    LEFT JOIN   dbo.Node postParent6 ON postParent6.NodeGuid = postParent5.ParentGUID
    LEFT JOIN   dbo.Node postParent7 ON postParent7.NodeGuid = postParent6.ParentGUID
    LEFT JOIN   dbo.Node postParent8 ON postParent8.NodeGuid = postParent7.ParentGUID
    LEFT JOIN   dbo.Node postParent9 ON postParent9.NodeGuid = postParent8.ParentGUID
    

    顺便说一句,我的任务不涉及导出资源库内容(图像/文档/等),但如果您也需要这些部分,这里应该有足够的信息来获得良好的开端。

    我希望这对从 MCMS 2002 迁移的其他人有所帮助...

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2012-06-13
      • 2023-03-05
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2011-02-28
      • 2012-05-23
      • 1970-01-01
      相关资源
      最近更新 更多