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