Как извлечь данные из базы данных Microsoft Content Management Server (MCMS) - PullRequest
1 голос
/ 12 июля 2011

Мне нужно извлечь значительный объем данных (> 1000 страниц) из базы данных Microsoft Content Management Server (MCMS) для использования на веб-сайте Sitecore.

Я вижу два основных варианта:

  1. Перенос данных в новую упрощенную базу данных и отображение этой информации на новом веб-сайте.

  2. Преобразование решения MCMS в SharePoint и использование модуля соединителя SharePointдоступна для Sitecore для отображения этой информации.

Я бы предпочел пойти по первому маршруту, поскольку в будущем нет планов использовать SharePoint для управления данными / контентом и предпочел бы хранитьэта информация в простой базе данных SQL Server для лучшего поиска.

Я посмотрел на соответствующую базу данных и думаю, что основные таблицы, которые меня интересуют, это Node, NodePlaceholder и NodePlaceholderContent но я изо всех сил пытаюсь найти то, что я ожидал.Может ли кто-нибудь дать мне немного объяснения относительно схемы этой базы данных?Или у меня возникнут проблемы при попытке перенести данные таким образом?

1 Ответ

6 голосов
/ 07 декабря 2011

Я только недавно проходил аналогичный процесс экспорта страниц контента из MCMS 2002 (миграция в Wordpress).

Я не говорю, что это 100% правильный способ получения данных, но у меня это сработало.

Вот процесс, который я предпринял, чтобы извлечь содержимое страницы из базы данных.

Как вы уже видели, таблицы, хранящие большую часть данных, Node и NodePlaceholderContent

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 

Этот запрос позволяет мне узнать, что страницы находятся в родительских узлах с именем Folders или Archive 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 может быть как постом, так и страницей (это не одно и то же, но они связаны). Так что теперь мы присоединяем наши страницы к записям записей, чтобы определить путь.

После некоторых поисков в Google я наткнулся на этот отрывок из Microsoft Content Management Server 2002: полное руководство действительно помогло найти остальную часть пути (и определил 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.) Последний шаг теперь состоит в том, чтобы продолжать подниматься по иерархии post parent, в результате чего несколько LEFT JOINS активизируют цепочку ParentGUID. Этот запрос дает визуальное представление иерархии, используя эти ЛЕВЫЕ СОЕДИНЕНИЯ.

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 ...

...