Программирование дополнительных классов и методов объектов AMO
Этот раздел состоит из следующих подразделов.
Класс Assembly
Методы Backup и Restore
Класс Trace
Класс CaptureLog и атрибут CaptureXML
Класс Assembly
Сборки позволяют пользователю расширять функциональные возможности служб Microsoft SQL Server Службы Analysis Services путем добавления новых хранимых процедур или функций многомерных выражений. Дополнительные сведения см. в разделе Другие классы и методы объектов AMO.
Добавление и удаление сборок является простой операцией, и ее можно выполнить в режиме в сети. Чтобы добавить сборку в базу данных, пользователь должен быть либо администратором базы данных, либо администратором сервера (чтобы иметь возможность добавить сборку к объекту сервера).
В следующем образце сборка добавляется в указанную базу данных и задается учетная запись службы для ее выполнения. Если такая сборка уже существует в базе данных, то перед добавлением она будет удалена.
static public void CreateStoredProcedures(Database db)
{
ClrAssembly clrAssembly;
// Verify That assembly exist in database and drop it
if (db.Assemblies.ContainsName("StoredProcedures"))
{
clrAssembly = db.Assemblies.FindByName("StoredProcedures");
clrAssembly.Drop();
}
// Create the CLR assembly
clrAssembly = db.Assemblies.Add("StoredProcedures");
clrAssembly.ImpersonationInfo = new ImpersonationInfo(
ImpersonationMode.ImpersonateServiceAccount);
clrAssembly.PermissionSet = PermissionSet.Unrestricted;
// Load the assembly files
clrAssembly.LoadFiles(Environment.CurrentDirectory
+ @"\StoredProcedures2.dll", false);
clrAssembly.Update();
}
Методы Backup и Restore
Методы Backup и Restore позволяют администраторам создавать резервные копии базы данных и производить ее восстановление.
В следующем образце создаются резервные копии всех баз данных на указанном сервере. Если файл резервной копии уже существует, то он будет перезаписан. Файлы резервных копий сохраняются в папке BackUp, которая вложена в папку данных служб Службы Analysis Services.
static public void BackUpAllDatabases(Server svr)
{
string fileName;
if ((svr != null) && ( svr.Connected))
foreach (Database db in svr.Databases)
{
fileName = db.Name + "_" + ((Int64)(DateTime.Today.Year * 10000 + DateTime.Today.Month * 100 + DateTime.Today.Day)).ToString()+ ".abf";
db.Backup(fileName, true);
}
}
В следующем образце производится восстановление базы данных Adventure Works из резервной копии, созданной в предыдущем образце. Если база данных My Adventure WorksDW уже существует, то она будет перезаписана.
static public void RestoreAdventureWorks(Server svr)
{
svr.Restore("Adventure Works DW_20051025.abf", "My Adventure WorksDW", true);
}
Класс Trace
Для наблюдения за работой сервера необходимы два вида трассировок: трассировки сеанса и трассировки сервера. Трассировка сервера позволяет узнать ход выполнения текущей задачи на сервере (трассировки сеанса); трассировки также могут показать общую активность сервера в целом, при этом соединение с сервером даже не требуется (трассировки сервера).
При трассировке текущих действий (трассировки сеанса) сервер отправляет текущему приложению уведомления о происходящих на нем событиях, вызванных этим приложением. В текущем приложении события захватываются с помощью обработчиков событий. Сначала объекту SessionTrace назначаются процедуры обработки событий, а затем запускается трассировка сеанса.
В следующем образце показано, как настроить трассировку сеанса для отслеживания текущих действий. Процедуры обработки событий находятся в конце образца, они выведут все сведения трассировки в объект System.Console. Чтобы сформировать события трассировки, после начала трассировки будет выполнена полная обработка образца куба Adventure Works.
static public void TestSessionTraces(Server svr)
{
// Start the default trace
svr.SessionTrace.OnEvent
+= new TraceEventHandler(DefaultTrace_OnEvent);
svr.SessionTrace.Stopped
+= new TraceStoppedEventHandler(DefaultTrace_Stopped);
svr.SessionTrace.Start();
// Process the databases
// The trace handlers will output all progress notifications
// to the console
Database db = svr.Databases.FindByName("Adventure Works DW Multidimensional 2012");
Cube cube = db.Cubes.FindByName("Adventure Works");
cube.Process(ProcessType.ProcessFull);
// Stop the default trace
svr.SessionTrace.Stop();
}
static public void DefaultTrace_OnEvent(object sender, TraceEventArgs e)
{
Console.WriteLine("{0}", e.TextData);
}
static public void DefaultTrace_Stopped(ITrace sender, TraceStoppedEventArgs e)
{
switch (e.StopCause)
{
case TraceStopCause.StoppedByUser:
case TraceStopCause.Finished:
Console.WriteLine("Processing completed successfully");
break;
case TraceStopCause.StoppedByException:
Console.WriteLine("Processing failed: {0}",
e.Exception.Message);
break;
}
}
Трассировка сервера может быть настроена таким образом, чтобы она записывала все данные в файл трассировки и автоматически перезапускалась при перезагрузке сервера.
Чтобы настроить трассировку сервера, сначала необходимо определить события, за которыми необходимо наблюдение, а также данные событий, которые следует сохранять в файле трассировки. Для каждого события необходимо определить столбцы данных, которые будут сохраняться в файле трассировки.
Создание трассировки сервера состоит из четырех шагов.
Создайте объект трассировки сервера и заполните его основные атрибуты.
Атрибут LogFileSize определяет максимальный размер файла трассировки, его значение задается в мегабайтах. Атрибут LogFileRollOver позволяет создавать другой файл журнала по достижении ограничения, установленного атрибутом LogFileSize. Когда этот параметр включен, к имени нового файла добавляется порядковый номер. Атрибут AutoRestart позволяет трассировке снова запускаться в случае перезапуска службы.
Создайте события и соответствующие столбцы данных.
По необходимости запускайте и останавливайте трассировку.
Даже после остановки трассировка сохраняется на сервере. Она должна запуститься снова, если в ней задано AutoRestart=true.
Удалите трассировку, когда она больше не нужна.
Взгляните на следующий образец. Если трассировка уже существует, то она удаляется, а затем создается повторно. Файлы трассировки сохраняются в папке Log, расположенной в папке данных служб Службы Analysis Services.
static public void TestServerTraces(Server svr)
{
Trace trc;
TraceEvent te;
trc = svr.Traces.FindByName("TestServerTraces");
if (trc != null)
trc.Drop();
trc = svr.Traces.Add("TestServerTraces", "TestServerTraces");
trc.LogFileName = ("TestServerTraces_" +((Int64)(DateTime.Now.Year * 10000 + DateTime.Now.Month * 100 + DateTime.Now.Day)).ToString() + "_" +
((Int64)(DateTime.Now.Hour * 10000 + DateTime.Now.Minute * 100 + DateTime.Now.Second)).ToString() + ".trc");
trc.LogFileSize = 100;
trc.LogFileRollover = true;
trc.AutoRestart = false;
#region Define Events to trace & data columns per event
te = trc.Events.Add(TraceEventClass.ProgressReportBegin);
te.Columns.Add(TraceColumn.TextData);
te.Columns.Add(TraceColumn.StartTime);
te.Columns.Add(TraceColumn.ObjectName);
te.Columns.Add(TraceColumn.ObjectPath);
te.Columns.Add(TraceColumn.DatabaseName);
te.Columns.Add(TraceColumn.NTCanonicalUserName);
te = trc.Events.Add(TraceEventClass.ProgressReportCurrent);
te.Columns.Add(TraceColumn.TextData);
te.Columns.Add(TraceColumn.CurrentTime);
te.Columns.Add(TraceColumn.ObjectName);
te.Columns.Add(TraceColumn.ObjectPath);
te.Columns.Add(TraceColumn.DatabaseName);
te = trc.Events.Add(TraceEventClass.ProgressReportEnd);
te.Columns.Add(TraceColumn.TextData);
te.Columns.Add(TraceColumn.StartTime);
te.Columns.Add(TraceColumn.CurrentTime);
te.Columns.Add(TraceColumn.EndTime);
te.Columns.Add(TraceColumn.Success);
te.Columns.Add(TraceColumn.Error);
te.Columns.Add(TraceColumn.ObjectName);
te.Columns.Add(TraceColumn.ObjectPath);
te.Columns.Add(TraceColumn.DatabaseName);
te.Columns.Add(TraceColumn.NTCanonicalUserName);
#endregion
trc.Update();
trc.Start();
#region Process the Adventure Works Cube
// The trace settings will output all progress notifications
// to the trace file
Database db = svr.Databases.FindByName("Adventure Works DW Multidimensional 2012");
Cube cube = db.Cubes.FindByName("Adventure Works");
cube.Process(ProcessType.ProcessFull);
#endregion
trc.Stop();
trc.Drop();
}
Атрибуты CaptureLog и CaptureXml
Атрибут CaptureLog позволяет создавать пакетные файлы XML для аналитики, содержащие операции AMO. Атрибут CaptureLog позволяет описывать в скрипте объекты сервера как базы данных, кубов, измерений, структур интеллектуального анализа и др.
Создание атрибута CaptureLog включает следующие шаги.
Запустите регистрацию событий в журнал XML для аналитики, установив атрибут CaptureXml в значение true.
После установки этого параметра все операции AMO сохраняются в коллекции строк, а не отправляются на сервер.
Запустите работу объектов AMO как обычно, но помните, что ни одно действие на сервер отправлено не будет. Работа может состоять из любой операции: обработки, создания, удаления, обновления или любого другого действия с объектом.
Остановите запись событий в журнал XML для аналитики, установив атрибут CaptureXml в значение false.
Просмотрите записанные данные XML для аналитики либо в строках коллекции CaptureLog, либо сформировав полную строку с помощью метода ConcatenateCaptureLog. Метод ConcatenateCaptureLog позволяет формировать пакеты XMLA в форме одной транзакции, а также добавлять в пакет параметр параллельной обработки.
Следующий образец возвращает строку с пакетом команд для выполнения полной обработки всех измерений и всех кубов базы данных [Adventure Works DW Multidimensional 2012].
static public string TestCaptureLog(Server svr)
{
String capturedXmla = "";
if ((svr != null) && (svr.Connected))
{
svr.CaptureXml = true;
#region Actions to be captured to an XMLA file
//No action is executed during CaptureXml = true
Database db = svr.Databases.FindByName("Adventure Works DW Multidimensional 2012");
foreach (Dimension dim in db.Dimensions)
dim.Process(ProcessType.ProcessFull);
foreach (Cube cube in db.Cubes)
cube.Process(ProcessType.ProcessFull);
#endregion
svr.CaptureXml = false;
capturedXmla = svr.ConcatenateCaptureLog(true, true);
}
return capturedXmla;
}
См. также
Справочник
Основные понятия
Знакомство с классами объектов AMO
Другие классы и методы объектов AMO
Логическая архитектура (службы Analysis Services — многомерные данные)
Объекты баз данных (службы Analysis Services — многомерные данные)