A következő címkéjű bejegyzések mutatása: powershell. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: powershell. Összes bejegyzés megjelenítése

2013. június 13., csütörtök

Launch PS from Windows Explorer

It's just peanuts but very useful.

  • If you type powershell in the addressbar of Windows Explorer (ALT + D), you will get a PS console with prompt of current directory.
  • If you type it ii . (Invoke-Item .) in a PS console, it will navigate you in the Windows Explorer to the current directory.
I stole these tricks from a stackoverflow topic.

2013. május 28., kedd

PowerShell és SQL Server prezentáció



Tegnap megtartottam életem első prezentációját a PowerShell és az SQL kapcsolatáról. És túléltem :) A helyszínt a LogMeIn biztosította, a rendezvényt pedig az SQLPASS local chapter HUG-MSSQL (Horvát Zoli) szervezte. Így az első előadásom egyben az első SQLPASS előadásom is!

PS and SQL
Az előadás diáit innen tudjátok letölteni.

2012. március 7., szerda

SSIS csomagok listája 2.

Első posztomban írtam arról, hogyan kérdezhetjük le az SSIS csomagok listáját PowerShell-el SQL Server 2008 alatt. Az új, 2012-es kiadásban azonban egy teljesen új módszert és környezetet kapunk csomagjaink telepítéséhez és kezeléséhez. (Ezzel párhuzamosan – a korábbi SQL Server-ekkel való kompatibilitás miatt – a korábbi struktúra is megmarad egyelőre.)

Ha a csomagok listájára van szükségünk, az SQL Server 2012 (RC0)-ban az SSISDB-ben (T-SQL) vagy a Microsoft.SqlServer.Management.IntegrationServices névtérben (.Net, PowerShell) kell kutakodnunk. A T-SQL megoldás nagyjából így néz ki:

  1. use SSISDB  
  2. go  
  3.   
  4. select  
  5.     pack.name as [PackageName]  
  6.     ,pack.[description] as [Description]  
  7.     ,fold.name as [Folder Name]  
  8.     ,proj.name as [Project Name]  
  9.     ,fold.created_by_name as [OwnerName]  
  10.     ,proj.created_time as [Project Created Time
  11.     ,proj.last_deployed_time as [Project Last Deployed Time]  
  12.     ,cast (pack.version_major as varchar(10))
  13.      + '.' + cast (pack.version_minor as varchar(10))  
  14.      + '.' + cast (pack.version_build as varchar(10))  
  15.      as [Version]  
  16.     ,pack.version_comments  
  17.     ,proj.object_version_lsn as [Project Version]  
  18. from  
  19.     catalog.packages pack  
  20.     inner join catalog.projects proj on pack.project_id = proj.project_id  
  21.     inner join catalog.folders fold on proj.folder_id = fold.folder_id;  
Érdemes azonban alaposabban végigbogarászni az SSISDB-t, mert olyan információkra bukkanhatunk, amikről korábban nem is álmodtunk (pl. catalog.executions).

PowerShell-el közelítve a dologhoz, hasonló listát kaphatunk, ha végigzongorázzuk a Catalogs.Folders.Projects.Packages matrjoskát:
  1. Add-type -path "C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Management.IntegrationServices\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Management.IntegrationServices.dll";  
  2.   
  3. $ssis = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices;  
  4. $constr = "Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;"                          
  5.   
  6. $con = New-Object System.Data.SqlClient.SqlConnection $constr  
  7. $ssis.Connection = $con;  
  8.   
  9. # Well, we can use here a foreach in the catalogs, but currently only the SSISDB catalog supported.  
  10. $folders = $ssis.Catalogs["SSISDB"].Folders;  
  11.   
  12. $regex = [regex]"(?i)[0-9]"  
  13.   
  14. foreach ($folder in $folders)  
  15.     {      
  16.     foreach ($project in $folder.Projects)  
  17.         {          
  18.         $project.Packages | ft name, `  
  19.             @{name="Folder name"; expression={$folder.name}}, `  
  20.             @{name="Project name"; expression={$project.name}}, `  
  21.             @{name="Actual Version"; expression={$project.objectversionLsn}; align="center"}, `  
  22.             @{name="All Version"; expression={$regex.matches($project.versions)}; align="center"}, `  
  23.             @{name="Last Deployed Time"; expression={$project.LastDeployedTime.LocalDateTime}; align="center"} `  
  24.             -autosize -wrap | out-string | sort -property name;  
  25.         }        
  26.     };  
Persze, az új struktúra előnyei nem a csomagok listázásánál csúcsosodnak ki. Az SSIS 2012 (RC0) egyik remek újdonsága például, hogy a már telepített project verziók között szabadon válthatunk (feltéve, hogy az SSISDB katalógus Periodically Remove Old Versions tulajdonsága False, mert ellenkező esetben a Maximum Number of Versions per Project-nél régebbi verzióinkat az SQL Server szanálja).

Erre – természetesen – nem csak a GUI-n keresztül van lehetőségünk. Az SSISDB tárolt eljárásai közt ott lapul a
catalog.restore_project,
  1. exec catalog.restore_project 'Sample Folder''Sample Project', 5;  
az IntegrationServices assembly-ben pedig az Restore() metódus.
  1. $ssis.Catalogs["SSISDB"].Folders["Version Rollback Sample"].Projects["Sample Project 3"].Versions[5].Restore();  
(Az $ssis változóból sejthető, de azért tisztázzuk: ez akkor működik, ha az adott session-ben már betöltöttük az assembly-t és csatlakoztunk a szerverhez (ő lenne az $ssis)).

2012. február 25., szombat

Hogyan nézhetem meg az Excel által generált MDX-et?

Például az OLAP PivotTable Extensions nevű bővítménnyel. És ha nincs ilyen a gépen? Akkor természetesen PowerShell-el :)
  1. add-type -assemblyname "Microsoft.Office.Interop.Excel";  
  2. $xls = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application");  
  3. $xls.workbooks.item(1).Worksheets.item(2).PivotTables(1).MDX;  
Ha változik a pivot, csak az utolsó sort kell újra meghívni. Viszont a kimenet típusa betűleves, ezzel még kezdeni kell valamit.

Egy egyszerű megoldás lehet az MDX Studio Online (by Mosha Pasumansky), vagy elcsenhetjük a fent említett add-in trükkjét, ami Nick Medveditskov webservice-ét használja. Ezzel öt sorosra bővül a szkript:
  1. add-type -assemblyname "Microsoft.Office.Interop.Excel";  
  2. $xls = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application");  
  3. $mdx = $xls.Workbooks.item(1).Worksheets.item(2).PivotTables(1).MDX;  
  4. $mdxformatter = new-WebServiceProxy -uri http://formatmdx.msftlabs.com/formatter.asmx;  
  5. $mdxformatter.FormatAsPlainText($mdx);  
Na, így mindjárt más.

Megjegyzés: a Workbooks és a Worksheets után nem lehet elhagyni az Item elemet, az indexek 1-től kezdődnek.

2012. február 19., vasárnap

SSIS csomagok listája 1.

Az Addictive Measures blogon találtam nemrég egy hasznos T-SQL szkriptet, ami kilistázza az MSDB alá telepített SSIS csomagokat. Hasznos cucc, rajtam viszont egyre jobban elharapózik a PowerShell mánia (bárcsak időm is lenne rá), ezért kicsit utánajártam, vajon nem lehet ezt összehozni PS-sel is? Hát persze hogy de :)

A GetDtsServerPackageInfos eljárásnak egy szerver és egy mappa nevét kell megadnunk, és már ontja is az információkat. A szerver azonosításánál pontos nevet, vagy ˝.˝-t használjunk, a ˝(local)˝ vagy ˝localhost˝ nem működik.

  1. param([string]$folder = "\", [string]$server = "."$drill = 0);  
  2.   
  3. # Get assembly (this version come with SQL Server 2012 RC0)  
  4. $dll = "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ManagedDTS\v4.0_11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ManagedDTS.dll"  
  5. add-type -path $dll;  
  6.   
  7. $ssisapp = new-object Microsoft.SqlServer.Dts.Runtime.Application;  
  8. $packages = $ssisapp.GetDtsServerPackageInfos($folder$server);  
  9.   
  10. # Get output  
  11. $packages `  
  12.     | select name, description, flags, folder, creationdate, packagedatasize, `  
  13.     @{name="version";expression={[string]$_.versionmajor + "." + [string]$_.versionminor + "." + [string]$_.versionbuild}}, `  
  14.     versioncomments `  
  15.     |sort name | format-table -autosize;  
  16.   
  17. # Drill down if it's needed  
  18. if ($drill -eq 1)  
  19.     {  
  20.     foreach ($pkg in $packages)  
  21.         {  
  22.         if ($pkg.flags -eq "Folder")  
  23.             {  
  24.             $subfolder = $folder + "\" + $pkg.name; 
  25.             $subfolder = $subfolder -replace "\\\\", "\";  
  26.               
  27.             .\pkg_list $subfolder $server 1;  
  28.             }  
  29.         }  
  30.     };  
(A syntax highlighter egy kicsit belezavarodott a backslash-ekbe. A kód helyes, csak a színezés nem. Sorry.)


update: a fenti szkript akkor fut hibátlanul, ha pkg_list.ps1 néven mentjük el, és abból a könyvtárból futtatjuk, ahová tettük. Ha a $folder mappa alatti almappák tartalma is kell, akkor $drill=1 paraméterrel hívjuk meg. Pl.: .\pkg_list "MSDB" "." 1. Ilyenkor saját magát hívja, pkg_list néven. Már a következő poszton járt az eszem. :)

A GetDtsServerPackageInfos meghívásához a Microsoft.SqlServer.ManagedDTS assembly-re van szükségünk. Csakhogy ennek a dll-nek az SQL Server 2012 RC0-val már a .NET 4-es verziója érkezik. Mivel a PowerShell a .NET 2-re van felkészítve, ez gondot jelent. Két lehetőségünk van:
  1. Ha a gépen fut SQL 2005/2008/2008R2, akkor előkereshetjük egy korábbi verzióját. Például: C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll
  2. Engedélyezzük a .NET 4-et a PowerShell környezetünkben egy config fájl segítségével. Erről bővebben pl. itt vagy itt lehet infót találni.

Az SSIS 2012-es kiadásával azonban egy teljesen új csomag-telepítő metódus (deploy mode) érkezik, ami átveszi a helyét a korábbi megoldásoknak. A kompatibilitás miatt ugyan továbbra is választható a korábbi módszer, és ugyanezért megmaradtak az msdb.dbo.sysssis... táblák is, de az új módszerhez egy teljesen új struktúra tartozik.


A következő poszt erről fog szólni. Maradjanak velünk, a szünet után folytatjuk! ;)