SSAS создает программные резервные копии только метаданных - PullRequest
1 голос
/ 05 марта 2011

У нас есть набор баз данных SSAS 2005, которые обслуживаются разными сотрудниками.Метаданные / схема, включая строки формата и т. Д., Эволюционировали для представления значительного объема работы и периодически меняются.Мы пытались держать проекты бизнес-аналитики под контролем исходного кода, но было бы также неплохо иметь ночное резервное копирование всех метаданных SSAS без самих данных.(Данные, конечно, огромны и воспроизводимы, в то время как схема крошечная.)

Я могу программно (C #) легко пройти через все базы данных SSAS с помощью коллекции Microsoft.AnalysisServices.Server.Databases, но у меня нетне нашел простой способ резервного копирования схемы без данных.Используя SSMS, я могу щелкнуть правой кнопкой мыши по базе данных и выбрать, например, [База данных сценариев] -> [СОЗДАТЬ] -> [Файл ...] и получить XMLA, представляющий метаданные всей базы данных.Это ссылка здесь: http://msdn.microsoft.com/en-us/library/ms174589.aspx,, и я считаю, что здесь есть вся информация, которую мы хотели бы сохранить ... однако я не нашел методов, обеспечивающих аналогичную функциональность в сборке Microsoft.AnalysisServices, и не уверен, гдееще посмотреть.

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Я нашел решение:

void ScriptDb(string svrName, string dbName, string outFolderPath)
{
  using (var svr = new Server())
  {
    svr.Connect(svrName);

    // get a reference to the database
    var db = svr.Databases[dbName];

    // setup the scripter object
    var sw = new StringWriter();
    var xmlOut = new XmlTextWriter(sw);
    xmlOut.Formatting = Formatting.Indented;
    var scr = new Scripter();

    // create an array of MajorObjects to pass to the scripter
    var x = new MajorObject[] { db };
    scr.ScriptCreate(x, xmlOut, true);

    // todo: would be wise to replace illegal filesystem chars in dbName
    var outPath = Path.Combine(outFolderPath, dbName + ".xmla");
    File.WriteAllText(outPath, sw.ToString());

    // clean up any disposeable objects
    sw.Close();
    svr.Disconnect();
    svr.Dispose();
  }
}
2 голосов
/ 08 августа 2011

Я знаю, что, может быть, я немного опаздываю, но здесь все идет ..

Это PowerShell, но преобразование в C # очень просто:

$svrName = "localhost\sql08"
$sourceDB = "Adventure Works DW 2008"
$sourceCube = "Adventure Works"

# load the AMO library (redirect to null to 'eat' the output from assembly loading process)
[System.Reflection.Assembly]::LoadwithpartialName("Microsoft.AnalysisServices") > $null
# connect to the AS Server
$svr = New-Object Microsoft.AnalysisServices.Server
$svr.Connect($svrName)

# get a reference to the database
$db= $svr.Databases.Item($sourceDB)
# get a reference to the cube
$cub = $db.Cubes.FindByName($sourceCube)

# setup the scripter object
$sb = new-Object System.Text.StringBuilder
$sw = new-Object System.IO.StringWriter($sb)
$xmlOut = New-Object System.Xml.XmlTextWriter($sw) 
$xmlOut.Formatting = [System.Xml.Formatting]::Indented
$scr = New-Object Microsoft.AnalysisServices.Scripter

# create an array of MajorObjects to pass to the scripter
$x = [Microsoft.AnalysisServices.MajorObject[]] @($cub)

$scr.ScriptCreate($x,$xmlOut,$false)

$sb.ToString() > c:\data\tmpCube2.xmla

# clean up any disposeable objects
$sw.Close()
$svr.Disconnect()
$svr.Dispose()

Это не мое, я нашел это здесь где Даррен Госбелл опубликовал это.

...