Введение в OLAP. Часть 11

Применение SQL DSO для создания серверных OLAP-кубов

Алексей Федоров, Наталия Елманова

Введение в объектную модель SQL DSO

Типичные задачи

   Обновление ранее созданных кубов

Работа с коллективными объектами

   Создание и удаление многомерных баз данных

   Создание и удаление источников данных

   Создание коллективных измерений

   Создание кубов

Поставка приложений, использующих SQL DSO

Заключение

 

Предыдущая статья данного цикла (КомпьютерПресс № 1’2002) была посвящена созданию локальных OLAP-кубов с помощью Microsoft PivotTable Service. В ней мы обсудили главные возможности PivotTable Service, а также основные свойства, необходимые для программного создания локальных кубов.

Отметим, однако, что иногда требуется программное создание или, что встречается гораздо более часто, обновление серверных OLAP-кубов. Эту задачу нельзя решить с помощью PivotTable Service, так как эти библиотеки предназначены для управления клиентским кэшем. Подобные задачи обычно решаются с помощью SQL DSO (Decision Support Objects) — COM-серверов, предназначенных для управления метаданными и для иных манипуляций с объектами многомерных баз данных Analysis Services. Эти же библиотеки используются и самим приложением Analysis Manager.

Введение в объектную модель SQL DSO

Объекты SQL DSO представляют собой COM-серверы, предназначенные для управления объектами многомерных баз данных Microsoft SQL Server Analysis Services. С их помощью можно создавать многомерные базы данных, измерения, кубы и другие объекты, содержащиеся в таких базах данных.

DSO состоят из иерархически организованных групп объектов, соответствующих основным объектам многомерных баз данных. Иерархия этих объектов в основном соответствует той, что можно увидеть в левой части окна Analysis Manager (рис. 1).

Основным в объектной модели SQL DSO является объект DSO.Server, представляющий сервер Analysis Services. Он, в свою очередь, обладает свойством Databases — коллекцией объектов, представляющих многомерные базы данных, которыми управляет данный сервер. Каждый такой объект, в свою очередь, обладает коллекциями объектов, представляющих кубы различных типов, коллективные измерения, источники данных, роли.

С точки зрения DSO базы данных (объекты типа DSO.Database) и OLAP-кубы (объекты типа DSO.Cubes) обладают коллекциями MDStores, и создание баз данных, кубов, агрегатов производится путем добавления новых элементов в соответствующие коллекции.

Мы не будем подробно описывать объектную модель SQL DSO (найти ее подробное описание можно в Microsoft SQL Server Books On-Line), а рассмотрим несколько наиболее типичных задач, которые решаются с помощью этих объектов. Для этой цели мы воспользуемся Borland Delphi — пользователи Visual Basic смогут создать такие же примеры самостоятельно.

В начало В начало

Типичные задачи

Прежде чем обсуждать манипуляцию объектами в многомерных базах данных с помощью SQL DSO, отметим, что библиотека типов SQL DSO содержится в файле msmddo80.dll, который находится в каталоге Program Files\Common Files\Microsoft Shared\Dso. В случае применения в качестве средства разработки Visual Basic следует просто сослаться на библиотеку Microsoft Decision Support Objects (это, по существу, и есть тот же самый файл), а вот в случае применения Delphi импортировать эту библиотеку не удастся. Поэтому при создании приложений — клиентов SQL DSO с помощью Delphi следует использовать позднее связывание, а значения констант, содержащихся в этой библиотеке, получать с помощью утилиты OLEView (рис. 2) — редактор библиотеки типов Delphi тут, к сожалению, бесполезен.

Начнем с простейшей задачи — обновления данных в уже имеющемся кубе.

В начало В начало

Обновление ранее созданных кубов

Обновление данных в готовых кубах, созданных с помощью Analysis Manager, — наиболее типичная задача, решаемая с помощью SQL DSO. Такая задача может быть частью аналитического приложения, предназначенного для просмотра OLAP-данных и требующего, чтобы куб содержал агрегатные данные, актуальные в момент просмотра.

Пересчет куба, содержащего только частные измерения, очень прост — обновление данных куба автоматически предваряется обновлением всех частных измерений. Фрагмент кода, приведенный ниже, иллюстрирует, как это можно сделать:

const   
      //обновлять данные куба полностью     
      ProcessFull = 1;    
      //блокировать куб во время обновления  
      olapLockProcess = 4;     
var   Srv,dsoDB,dsoCube,dsoDim: variant;  
      I         : Integer;  
      OldCursor : TCursor;  
      dimName   : String;  
begin  
   Srv := CreateOleObject('DSO.Server');  
   // соединяемся с сервером  
   Srv.Connect(Edit1.Text);                   
   // указываем имя базы данных  
   dsoDB := srv.MDStores.Item(Edit2.Text);    
   // и имя куба   
   dsoCube := dsoDB.Cubes.Item(Edit3.Text);    
   OldCursor := Form1.Cursor;  
   Form1.Cursor := crHourGlass;     
   // обновляем данные куба     
   dsoCube.Process (ProcessFull);         
   // снимаем блокировку  
   dsoCube.UnlockObject;                  
   Form1.Cursor := OldCursor;               
   // возвращаем курсор в первоначальное состояние   
   dsoCube := Unassigned;  
   dsoDb := Unassigned;  
   Srv := Unassigned;  
 end;  

В этом фрагменте кода мы обновляем данные уже имеющегося куба. Обратите внимание на то, что мы блокируем куб, чтобы предотвратить попытку одновременного обновления его несколькими пользователями.

Если OLAP-куб использует не только частные, но и коллективные измерения, последние должны быть обновлены до того, как начнется обновление самого куба. Дело в том, что коллективные измерения принадлежат самой базе данных, а не кубу. Если набор членов измерения изменился, но это еще не отражено в самом измерении из-за того, что его данные не обновлялись, то во время обновления куба произойдет исключение, связанное с несовпадением ожидаемого и реально имеющегося набора членов в измерении.

Ниже приведен фрагмент кода, иллюстрирующего сказанное выше:

procedure TForm1.Button1Click(Sender: TObject);  
const   
      //обновлять данные куба полностью     
      ProcessFull = 1;    
      //блокировать куб во время обновления  
      olapLockProcess = 4;     
var   Srv,dsoDB,dsoCube,dsoDim: variant;  
      I         : Integer;  
      OldCursor : TCursor;  
      dimName   : String;  
begin  
   Srv := CreateOleObject('DSO.Server');  
   // соединяемся с сервером  
   Srv.Connect(Edit1.Text);                   
   // указываем имя базы данных  
   dsoDB := srv.MDStores.Item(Edit2.Text);    
   // и имя куба   
   dsoCube := dsoDB.Cubes.Item(Edit3.Text);    
   OldCursor := Form1.Cursor;  
   Form1.Cursor := crHourGlass;     
   for I := 1 to dsoCube.Dimensions.Count do  
   begin  
    dsoDim := dsoCube.Dimensions.Item(I);  
    dimName := dsoCube.Dimensions.Item(I).Name;  
    //если измерение коллективное, оно принадлежит базе данных, а не кубу  
    if dsoDim.IsShared then begin    
    //блокируем измерение   
    dsoDB.Dimensions.Item(dimName).LockObject(olapLockProcess,'Dimension is processed');   
    //обновляем измерение  
    dsoDB.Dimensions.Item(dimName).Process(ProcessFull);         
    //снимаем блокировку с измерения  
    dsoDB.Dimensions.Item(dimName).UnlockObject;    
   end;  
  end;  
  // блокируем куб  
  dsoCube.LockObject(olapLockProcess,'Cube is processed');    
  // обновляем данные куба     
  dsoCube.Process (ProcessFull);         
 // снимаем блокировку  
 dsoCube.UnlockObject;                  
 Form1.Cursor := OldCursor;               
 // возвращаем курсор в первоначальное состояние   
 dsoCube := Unassigned;  
 dsoDb := Unassigned;  
 Srv := Unassigned;  
end;  

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

В начало В начало

Работа с коллективными объектами

Еще одной задачей является создание объектов многомерных баз данных — самих баз данных, принадлежащих им описаний источников данных, коллективных измерений, кубов.

В начало В начало

Создание и удаление многомерных баз данных

Чтобы создать новую базу данных, следует применять метод AddNew коллекции MDStores объекта DSO Server, например:

Var   
 dsoServer, dsoDB: Variant ;  
 DbName: string;  
   
...   
   
InputQuery('New Database','Input Database Name',dbname);  
DsoDB := dsoServer.MDStores.AddNew(dbName);  

Для удаления базы данных применяется метод Remove коллекции MDStores объекта Server:

dsoServer.MDStores.Remove(dbName);

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

В начало В начало

Создание и удаление источников данных

Analysis Services для доступа к данным используют уже знакомый нам механизм ADO. Именно поэтому основной характеристикой источника данных является ADO Connection String.

Для создания описания источника данных следует использовать метод Add коллекции DataSources объекта Database:

var   
 CS,DSname, DBname: string;  
 DS, dsoDB: variant;  
   
...  
   
  dsoDB := dsoServer.MDStores.Item(DBname);  
  // Cтандартный диалог для получения ADO Connection string  
  CS := PromptDataSource(Form1.Handle, '');    
  InputQuery('New Datasource','Input Datasource Name',DSname);  
  // создаем объект  DataSource   
  DS := CreateOleObject('DSO.DataSource');  
  // указываем его имя  
  DS.Name := DSname;  
  // устанавливаем его свойство ConnectionString   
  DS.ConnectionString := CS;  
  // добавляем описание источника данных   
  dsoDB.DataSources.Add(DS);  

Обратите внимание: прежде чем добавлять объект DataSource в коллекцию DataSources объекта Database, следует определить его свойство ConnectionString.

Для удаления описания источника данных следует использовать метод Remove коллекции DataSources объекта DSO Database.

dsoDB.DataSources.Remove(DS);

Для соединения с источником данных следует использовать метод IsConnected объекта DSO DataSource. Если же соединение уже установлено, этот метод вернет True. Если же соединение не установлено, этот метод попытается осуществить соединение и вернет True в случае удачи и False в случае неудачи. При необходимости DSO автоматически устанавливает соединение с источником данных (например, когда требуется получить данные из него).

В начало В начало

Создание коллективных измерений

Коллективные измерения принадлежат многомерной базе данных, и каждое такое измерение в общем случае может быть использовано несколькими кубами. В объектной модели SQL DSO им соответствует коллекция Dimensions объекта Database. Для создания коллективного измерения следует использовать Add коллекции Dimensions объекта Database. Во фрагменте кода, приведенном ниже, предполагается, что список таблиц исходной реляционной базы данных, на основе которой формируется измерение, содержится в компоненте TableListBox, а источник данных, соответствующий этой базе данных, является I-м элементом в коллекции DataSources:

Var dimName : string;  
    DsoDim  : Variant;


    I       : Integer;  
...  
DS := CreateOleObject('DSO.DataSource');  
...  
dsoDim := CreateOleObject('DSO.Dimension');  
dimName := InputBox('New Shared Dimension','Input Dimension Name','Dimension1');  
dsoDim.Name := dimName;  
//устанавливаем свойство DataSource   
dsoDim.DataSource := dsoDB.DataSources.Item(I+1);  
//указываем размерную таблицу  
dsoDim.FromClause := TableListBox.Items[TableListBox.ItemIndex];  
//устанавливаем свойство JoinClause   
dsoDim.JoinClause:= InputBox('Join clause','Input Join clause','');  
//добавляем измерение в базу данных  
dsoDB.Dimensions.AddNew(dimname);  

Прежде чем создать измерение, необходимо определить следующие свойства объекта Dimension:

DataSource — один из элементов коллекции DataSources объекта Database;

FromClause — имя размерной таблицы;

JoinClause — это свойство важно, если размерная таблица не совпадает с таблицей фактов, которая будет использована для создания куба. В этом случае нужно указать, как эти таблицы связаны друг с другом. В общем случае это свойство указывается в следующей форме:

<fact_table_name>.<field_name> =
<dimension_table_name>.<linked_field_name>

Иными словами, свойство JoinClause должно содержать описание связи между таблицами так, как описывается связь типа INNER JOIN в диалекте SQL, поддерживаемом данным OLE DB-провайдером.

В общем случае могут потребоваться значения и других свойств, например, при создании измерения с несбалансированной иерархией.

Любое измерение содержит как минимум один уровень. Соответственно объект Dimension обладает коллекцией Levels. Для добавления уровня к измерению следует применять метод AddNew этой коллекции. В приведенном ниже фрагменте кода предполагается, что компонент FieldListBox содержит список полей размерной таблицы:

dsoLev := dsoDim.Levels.AddNew(FieldListBox.
Items[FieldListBox.ItemIndex]);
dsoLev.MemberKeyColumn :=
TableListBox.Items[TableListBox.ItemIndex]+’.’+
//указываем поле, содержащее члены будущего 
//измерения
FieldListBox.Items[FieldListBox.ItemIndex];
dsoLev.ColumnSize := 255;
dsoLev.ColumnType := adWChar;
dsoLev.EstimatedSize := 1;

Константа adWСhar определена в файле ADODB_TLB.pas, который можно получить, импортировав библиотеку типов msado15.dll.

Для создания уровня иерархии нам нужно определить следующие свойства объекта Level:

  • MemberKeyColumn — имя поля размерной таблицы, которое содержит члены данного измерения;
  • ColumnSize и ColumnType — размер и тип данных членов измерения;
  • EstimatedSize — свойство, используемое DSO при создании агрегатов, в которых хранится данное измерение.

Если для создания измерения использовалось несколько таблиц, для объекта Level следует также определить свойство JoinClause в той же форме, в которой оно было определено для объекта Dimension.

После того как все уровни измерения определены, можно произвести заполнение его данными:

DsoDim.Process;

При изменении структуры измерения (например, при добавлении или удалении уровней) следует вызвать метод Update объекта Dimension для сохранения изменений, а затем — метод Process для обновления членов измерения.

В начало В начало

Создание кубов

Чтобы добавить к многомерной базе данных новый OLAP-куб, следует использовать метод Add коллекции Cubes объекта Database:

dsoDB.Cubes.AddNew(cubename);

Далее необходимо определить все его частные измерения и их уровни так, как это было описано в предыдущем разделе, и добавить эти измерения к кубу с помощью метода AddNew коллекции Dimensions объекта Cube например:

Var dsoCube: Variant;
NewCube.Dimensions.AddNew(SharedDimListBox.
Items[SharedDimListBox.ItemIndex]);

Создание частных измерений практически ничем не отличается от создания коллективных измерений. Единственное различие заключается в том, что в случае коллективного измерения соответствующий объект Dimension добавляется в коллекцию Dimensions объекта Database, а в случае частного измерения — в коллекцию Dimensions объекта Cube.

Наконец, следует определить меры куба. Для этой цели используется коллекция Measures объекта Cube:

NewMeasure:=CreateOleObject(‘DSO.Measure’);
NewMeasure.SourceColumn :=
FieldListBox.Items[FieldListBox.ItemIndex];
Mname := InputBox(‘New Measure’,
’Input Measure Name’,NewMeasure.SourceColumn);
NewMeasure.Name := Mname;
dsoCube.Measures.AddNew(Mname);

Прежде чем добавить измерение, следует определить свойство SourceColumn объекта Measure. Это свойство должно указывать на числовое поле, на основании значений которого вычисляются агрегатные данные.

Определив метаданные куба, мы можем вычислить его данные с помощью уже знакомого нам метода Process объекта Cube.

Напомним, что при первоначальном вычислении или обновлении данных куба, использующего коллективные измерения, следует предварительно произвести ту же операцию с этими измерениями.

При изменении структуры куба (например, при добавлении или удалении измерений) необходимо вызвать метод Update объекта Cube для сохранения изменений, а затем — метод Process для обновления данных куба.

В начало В начало

Поставка приложений, использующих SQL DSO

Файлы библиотек DSO могут поставляться с использующими их приложениями. Ниже приведен их список:

  • Msmddo80.dll — библиотека DSO;
  • Msmdso.rll — файл ресурсов DSO;
  • Msmdnet.dll — сетевой интерфейс Analysis Services;
  • Msmdlock.dll — менеджер блокировок Analysis Services;
  • Msmddo.dll — файл, требующийся для совместимости с Microsoft SQL Server version 7.0 OLAP Services.

Все файлы, за исключением Msmdso.rll, следует поместить в каталог

C:\Program Files\Common Files\Microsoft Shared\DSO

Все библиотеки должны быть зарегистрированы в реестре с помощью утилиты Regsvr32. Кроме того, каждый из файлов должен быть описан в ключе реестра:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs

Перед установкой DSO следует также установить Microsoft Data Access Components и PivotTable Services. Для этой цели на диске с дистрибутивом Microsoft SQL Server Analysis Services в каталоге \Msolap\Install\Pts имеются две программы установки. Одна из них, Ptslite.exe, предназначена для установки только PivotTable Service, а другая, Ptsfull.exe, — для установки PivotTable Service и Microsoft Data Access Components.

В начало В начало

Заключение

Итак, мы рассмотрели создание серверных OLAP-кубов с помощью Decision Support Objects. Мы обсудили наиболее часто встречающиеся задачи, такие как обновление данных в уже существующих OLAP-кубах, создание и удаление многомерных баз данных и содержащихся в них объектов — кубов, коллективных измерений, источников данных, а также поставку приложений, использующих SQL DSO.

На этом мы заканчиваем цикл, посвященный основам OLAP. Однако мы еще не раз вернемся к этой теме — впереди вас ожидают обзоры клиентских OLAP-средств (один из них, посвященный Microsoft Data Analyzer, вы найдете уже в этом номере журнала), а также статьи о Data Mining — средстве поиска закономерностей в базах данных и OLAP-кубах, широко применяемом в таких важных областях современного бизнеса, как анализ кредитных рисков и стратегическое планирование.

Пример утилиты, использующей SQL DSO для отображения метаданных и обновления содержимого кубов, а также ее исходные тексты вы сможете найти в статье «Пример применения SQL DSO» на нашем CD-ROM.

КомпьютерПресс 2'2002

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует