BI

SQL Server Management Objects (SMO) oraz Analysis Management Objects (AMO)

Grudzień 1, 2016 0
Podziel się:

SQL Server Management Objects (SMO) to zbiór obiektów .NET, które zostały stworzone w celu programistycznego zarządzania SQL Serwerem. Pierwszy raz wprowadzone zostały w SQL Server 2005 jako cześć SQL Server Feature Pack i obecnie dostępne są we wszystkich wersjach SQL Server łącznie z Express Edition.

SMO

Za pomocą SMO, jesteśmy w stanie zaprojektować aplikacją zbliżoną w funkcjonalności do Microsoft SQL Server Management Studio. Aby korzystać z SMO musimy zainstalować Client Tools SDK, który jest dostępny przy instalacji SQL Servera lub Shared Management Objects z SQL Server Feature Pack. Domyślnie SMO assembly jest instalowane w folderze (w przypadku SQL Server 2014) :

C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\

WYKORZYSTANIE SMO ZA POMOCA POWERSHELL

Załadowanie odpowiedniego assembly i podłączenie się do instancji SQL Server

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
$ServerName = 
$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName

Wyświetlenie informacji o wersji i statusie instancji SQL Server.

$serverInstance |select Product,Edition,Version,Status

Wyświetlenie listy wszystkich baz na serwerze i informacja o ostatniej dacie backupów i rozmiarze.

$serverInstance.Databases | select Name,LastBackupDate,LastDifferentialBackupDate,Size

Dzięki SMO możemy również wyświetlać obiekty i definicje obiektów w poszczególnych bazach.
Poniżej wyświetlamy listę widoków w bazie SiiBI z datami ich utworzenia, ostatniej modyfikacji oraz definicją.

$db = $serverInstance.Databases['SiiBI']
$db.Views | Select Name,CreateDate,DateLastModified,TextBody

Wyświetlenie wszystkich tabel z ilością wierszy jesteśmy w stanie zrealizować za pomocą jednej linijki kodu.

$db.Tables | select Name, RowCount

Za pomocą SMO możemy również tworzyć nowe obiekty jak bazy, tabele, widoki czy procedury składowane.

$dtint = [Microsoft.SqlServer.Management.Smo.Datatype]::Int

$NewTable = New-Object Microsoft.SqlServer.Management.Smo.Table ($db,"NewTable","dbo")
$NewColumn = New-Object Microsoft.SqlServer.Management.Smo.Column ($NewTable, "NewColumn", $dtbigint)
$NewTable.Columns.Add($NewColumn)

$NewTable.Create()

Dzięki SMO możemy automatyzować zadania, które np. w SSMS wymagały by od nas ręcznego wyklikania. Poniższy skrypt zapisuje do plików definicje wszystkich tabel w bazie.

$location = 'D:\TEMP'
$mydate=get-date -format yyyy_MM_dd_hh_mm

$ScriptingOptions = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions
$ScriptingOptions.IncludeDatabaseContext = 1
$ScriptingOptions.ToFileOnly = 1

foreach($t in $db.Tables)
{
$ScriptingOptions.FileName = join-path -path $location $($t.Name+"_"+$mydate+".sql")
$t.Script($ScriptingOptions)
}

AMO

Analysis Management Objects (AMO) podobnie jak SMO to biblioteka obiektów .NET to programistycznego zarządzania instancją Microsoft SQL Server Analysis Services. Domyślnie AMO assembly jest instalowane w tym samym folderze co SMO (w przypadku SQL Server 2014) :

C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\

Dzięki AMO możemy tworzyć modyfikować , usuwać I przeglądać obiekty jak wymiary, kostki, bazy OLAP itd. Możemy również procesować i skryptować obiekty. Warto zaznaczyć, że za pomocą AMO nie jesteśmy w stanie wysyłać zapytań MDX do kostek (w odróżnieniu do SMO i zapytań T-SQL), do tego potrzebujemy ADOMD.NET.
Podobnie jak w przypadku SMO również możemy wyświetlać metadane różnych obiektów w instancji SSAS, tzw. Major Objects. Major objects są to klasy które reprezentują kompletny obiekt jako cała encja a nie cześć jakiegoś innego obiektu. Do Major objects wliczamy Server, Cube, Dimension, MiningStructure ponieważ są to samodzielne encje. Obiekt typu Level na przykład nie jest major object gdyż jest częścią Dimension.

Poniższy rysunek przedstawia major objects do których mamy dostęp dzięki AMO.

12

WYKORZYSTANIE AMO ZA POMOCA POWERSHELL

Załadowanie odpowiedniego assembly i podłączenie się do instancji SQL Server Analysis Services.

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices')
 $serverName =
 $server = New-Object Microsoft.AnalysisServices.Server
 $server.connect($serverName)

Wyświetlenie informacji o wersji instancji SSAS.

$server |select ProductName, version, Edition, ServerMode

Wyświetlenie informacji o wersji instancji SSAS.

$server.Databases |select name, LastSchemaUpdate, LastUpdate, LastProcessed

Bardzo praktycznym zastosowaniem AMO może być tworzenie backupów definicji baz OLAP, w przypadku korzystania z SSMS zmuszeni bylibyśmy tworzyć skrypty ręcznie dla każdej bazy. Poniżej przykład prostego skryptu który zapisuje definicje baz jako skrypty xmla.

$location = 'D:\Temp\'
$serverName = 
$mydate=get-date -format yyyy_MM_dd_hh_mm

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices')

$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($serverName)

foreach ($d in $server.Databases )
{
$stringbuilder = New-Object System.Text.StringBuilder
$stringwriter = New-Object System.IO.StringWriter($stringbuilder)
$xmlOut = New-Object System.Xml.XmlTextWriter($stringwriter)
$xmlOut.Formatting = [System.Xml.Formatting]::Indented
$scriptObject = New-Object Microsoft.AnalysisServices.Scripter

$MSASObject=[Microsoft.AnalysisServices.MajorObject[]] @($d)

$ScriptObject.ScriptCreate($MSASObject,$xmlOut,$false)
$filename= join-path -path $location $($d.Name+"_"+$mydate+".xmla")
$stringbuilder.ToString() |out-file -filepath $filename
}

Przedstawione proste przykłady to tylko wierzchołek góry lodowej jeśli chodzi o możliwości SMO i AMO. Dzięki tym 2 bibliotekom zyskujemy narzędzia, dające nam jeszcze więcej możliwość w realizacji zadań i zarządzaniu SQL Serverem.

Oceń ten post
Kategorie: BI
Khalil Kamil Al Naal
Autor: Khalil Kamil Al Naal
Developer rozwiązań Business Intelligence. Od 5 lat związany głównie z technologiami Microsoft, starający się zgłębić tajniki SQL Server oraz nowych technologii związanych z Big Data. W Sii wspiera rozwijanie wewnętrznego systemu raportowego oraz bierze udział w projektach dla klientów zewnętrznych.

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

Zostaw komentarz