{"id":2667,"date":"2016-12-01T10:00:12","date_gmt":"2016-12-01T09:00:12","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=2667"},"modified":"2025-05-07T11:25:09","modified_gmt":"2025-05-07T09:25:09","slug":"sql-server-management-objects-smo-oraz-analysis-management-objects-amo","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/sql-server-management-objects-smo-oraz-analysis-management-objects-amo\/","title":{"rendered":"SQL Server Management Objects (SMO) oraz Analysis Management Objects (AMO)"},"content":{"rendered":"\n<p><a href=\"http:\/\/sii.pl\/uslugi-zarzadzane\/\">SQL Server<\/a> Management Objects (SMO) to zbi\u00f3r obiekt\u00f3w .NET, kt\u00f3re zosta\u0142y stworzone w celu programistycznego zarz\u0105dzania SQL Serwerem. Pierwszy raz wprowadzone zosta\u0142y w SQL Server 2005 jako cze\u015b\u0107 SQL Server Feature Pack i obecnie dost\u0119pne s\u0105 we wszystkich wersjach SQL Server \u0142\u0105cznie z Express Edition.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>SMO<\/strong><\/h2>\n\n\n\n<p>Za pomoc\u0105 SMO, jeste\u015bmy w stanie zaprojektowa\u0107 aplikacj\u0105 zbli\u017con\u0105 w funkcjonalno\u015bci do Microsoft SQL Server Management Studio. Aby korzysta\u0107 z SMO musimy zainstalowa\u0107 Client Tools SDK, kt\u00f3ry jest dost\u0119pny przy instalacji SQL Servera lub Shared Management Objects z SQL Server Feature Pack. Domy\u015blnie SMO assembly jest instalowane w folderze (w przypadku SQL Server 2014) :<\/p>\n\n\n\n<p>C:\\Program Files\\Microsoft SQL Server\\120\\SDK\\Assemblies\\<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">WYKORZYSTANIE SMO ZA POMOCA POWERSHELL<\/h2>\n\n\n\n<p>Za\u0142adowanie odpowiedniego assembly i pod\u0142\u0105czenie si\u0119 do instancji SQL Server<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n&#x5B;System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')\n$ServerName =\n$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName\n<\/pre><\/div>\n\n\n<p>Wy\u015bwietlenie informacji o wersji i statusie instancji SQL Server.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$serverInstance |select Product,Edition,Version,Status\n<\/pre><\/div>\n\n\n<p>Wy\u015bwietlenie listy wszystkich baz na serwerze i informacja o ostatniej dacie backup\u00f3w i rozmiarze.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$serverInstance.Databases | select Name,LastBackupDate,LastDifferentialBackupDate,Size\n<\/pre><\/div>\n\n\n<p>Dzi\u0119ki <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms162169.aspx\" rel=\"nofollow\" >SMO<\/a> mo\u017cemy r\u00f3wnie\u017c wy\u015bwietla\u0107 obiekty i definicje obiekt\u00f3w w poszczeg\u00f3lnych bazach.<br>Poni\u017cej wy\u015bwietlamy list\u0119 widok\u00f3w w bazie SiiBI z datami ich utworzenia, ostatniej modyfikacji oraz definicj\u0105.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$db = $serverInstance.Databases&#x5B;'SiiBI']\n$db.Views | Select Name,CreateDate,DateLastModified,TextBody\n<\/pre><\/div>\n\n\n<p>Wy\u015bwietlenie wszystkich tabel z ilo\u015bci\u0105 wierszy jeste\u015bmy w stanie zrealizowa\u0107 za pomoc\u0105 jednej linijki kodu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\t$db.Tables | select Name, RowCount\n<\/pre><\/div>\n\n\n<p>Za pomoc\u0105 SMO mo\u017cemy r\u00f3wnie\u017c tworzy\u0107 nowe obiekty jak bazy, tabele, widoki czy procedury sk\u0142adowane.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$dtint = &#x5B;Microsoft.SqlServer.Management.Smo.Datatype]::Int\n \n$NewTable = New-Object Microsoft.SqlServer.Management.Smo.Table ($db,\"NewTable\",\"dbo\")\n$NewColumn = New-Object Microsoft.SqlServer.Management.Smo.Column ($NewTable, \"NewColumn\", $dtbigint)\n$NewTable.Columns.Add($NewColumn)\n \n$NewTable.Create()\n<\/pre><\/div>\n\n\n<p>Dzi\u0119ki SMO mo\u017cemy automatyzowa\u0107 zadania, kt\u00f3re np. w SSMS wymaga\u0142y by od nas r\u0119cznego wyklikania. Poni\u017cszy skrypt zapisuje do plik\u00f3w definicje wszystkich tabel w bazie.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$location = 'D:\\TEMP'\n$mydate=get-date -format yyyy_MM_dd_hh_mm\n \n$ScriptingOptions = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions\n$ScriptingOptions.IncludeDatabaseContext = 1\n$ScriptingOptions.ToFileOnly = 1\n \nforeach($t in $db.Tables)\n{\n$ScriptingOptions.FileName = join-path -path $location $($t.Name+\"_\"+$mydate+\".sql\")\n$t.Script($ScriptingOptions)\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>AMO<\/strong><\/h2>\n\n\n\n<p>Analysis Management Objects (AMO) podobnie jak SMO to biblioteka obiekt\u00f3w .NET to programistycznego zarz\u0105dzania instancj\u0105 Microsoft SQL Server Analysis Services. Domy\u015blnie AMO assembly jest instalowane w tym samym folderze co SMO (w przypadku SQL Server 2014) :<\/p>\n\n\n\n<p>C:\\Program Files\\Microsoft SQL Server\\120\\SDK\\Assemblies\\<\/p>\n\n\n\n<p>Dzi\u0119ki AMO mo\u017cemy tworzy\u0107 modyfikowa\u0107 , usuwa\u0107 I przegl\u0105da\u0107 obiekty jak wymiary, kostki, bazy OLAP itd. Mo\u017cemy r\u00f3wnie\u017c procesowa\u0107 i skryptowa\u0107 obiekty. Warto zaznaczy\u0107, \u017ce za pomoc\u0105 AMO nie jeste\u015bmy w stanie wysy\u0142a\u0107 zapyta\u0144 MDX do kostek (w odr\u00f3\u017cnieniu do SMO i zapyta\u0144 T-SQL), do tego potrzebujemy ADOMD.NET.<br>Podobnie jak w przypadku SMO r\u00f3wnie\u017c mo\u017cemy wy\u015bwietla\u0107 metadane r\u00f3\u017cnych obiekt\u00f3w w instancji SSAS, tzw. Major Objects. Major objects s\u0105 to klasy kt\u00f3re reprezentuj\u0105 kompletny obiekt jako ca\u0142a encja a nie cze\u015b\u0107 jakiego\u015b innego obiektu. Do Major objects wliczamy Server, Cube, Dimension, MiningStructure poniewa\u017c s\u0105 to samodzielne encje. Obiekt typu Level na przyk\u0142ad nie jest major object gdy\u017c jest cz\u0119\u015bci\u0105 Dimension.<\/p>\n\n\n\n<p>Poni\u017cszy rysunek przedstawia major objects do kt\u00f3rych mamy dost\u0119p dzi\u0119ki AMO.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"320\" height=\"783\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/08\/1.gif\" alt=\"\" class=\"wp-image-23625\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"317\" height=\"532\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/08\/2.gif\" alt=\"\" class=\"wp-image-23627\"\/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">WYKORZYSTANIE AMO ZA POMOCA POWERSHELL<\/h2>\n\n\n\n<p>Za\u0142adowanie odpowiedniego assembly i pod\u0142\u0105czenie si\u0119 do instancji SQL Server Analysis Services.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n&#x5B;System.Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices')\n$serverName =\n$server = New-Object Microsoft.AnalysisServices.Server\n$server.connect($serverName)\n<\/pre><\/div>\n\n\n<p>Wy\u015bwietlenie informacji o wersji instancji SSAS.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$server |select ProductName, version, Edition, ServerMode\n<\/pre><\/div>\n\n\n<p>Wy\u015bwietlenie informacji o wersji instancji SSAS.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$server.Databases |select name, LastSchemaUpdate, LastUpdate, LastProcessed\n<\/pre><\/div>\n\n\n<p>Bardzo praktycznym zastosowaniem AMO mo\u017ce by\u0107 tworzenie backup\u00f3w definicji baz OLAP, w przypadku korzystania z SSMS zmuszeni byliby\u015bmy tworzy\u0107 skrypty r\u0119cznie dla ka\u017cdej bazy. Poni\u017cej przyk\u0142ad prostego skryptu kt\u00f3ry zapisuje definicje baz jako skrypty xmla.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n$location = 'D:\\Temp\\'\n$serverName =\n$mydate=get-date -format yyyy_MM_dd_hh_mm\n \n&#x5B;System.Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices')\n \n$server = New-Object Microsoft.AnalysisServices.Server\n$server.connect($serverName)\n \nforeach ($d in $server.Databases )\n{\n$stringbuilder = New-Object System.Text.StringBuilder\n$stringwriter = New-Object System.IO.StringWriter($stringbuilder)\n$xmlOut = New-Object System.Xml.XmlTextWriter($stringwriter)\n$xmlOut.Formatting = &#x5B;System.Xml.Formatting]::Indented\n$scriptObject = New-Object Microsoft.AnalysisServices.Scripter\n \n$MSASObject=&#x5B;Microsoft.AnalysisServices.MajorObject&#x5B;]] @($d)\n \n$ScriptObject.ScriptCreate($MSASObject,$xmlOut,$false)\n$filename= join-path -path $location $($d.Name+\"_\"+$mydate+\".xmla\")\n$stringbuilder.ToString() |out-file -filepath $filename\n}\n<\/pre><\/div>\n\n\n<p>Przedstawione proste przyk\u0142ady to tylko wierzcho\u0142ek g\u00f3ry lodowej je\u015bli chodzi o mo\u017cliwo\u015bci SMO i AMO. Dzi\u0119ki tym 2 bibliotekom zyskujemy narz\u0119dzia, daj\u0105ce nam jeszcze wi\u0119cej mo\u017cliwo\u015b\u0107 w realizacji zada\u0144 i zarz\u0105dzaniu SQL Serverem.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;2667&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 ( votes: 0)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;SQL Server Management Objects (SMO) oraz Analysis Management Objects (AMO)&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>SQL Server Management Objects (SMO) to zbi\u00f3r obiekt\u00f3w .NET, kt\u00f3re zosta\u0142y stworzone w celu programistycznego zarz\u0105dzania SQL Serwerem. Pierwszy raz &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/sql-server-management-objects-smo-oraz-analysis-management-objects-amo\/\">Continued<\/a><\/p>\n","protected":false},"author":97,"featured_media":15173,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[443,421,440,442,441],"class_list":["post-2667","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-amo","tag-bi","tag-powershell","tag-smo","tag-sql-server"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Collection-interface-co-warto-wiedziec.png","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2667"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/97"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=2667"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2667\/revisions"}],"predecessor-version":[{"id":23629,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2667\/revisions\/23629"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/15173"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=2667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=2667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=2667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}