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!
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.IntegrationServicesnévtérben (.Net, PowerShell) kell kutakodnunk. A
T-SQL megoldás nagyjából így néz ki:
use SSISDB
go
select
pack.nameas [PackageName]
,pack.[description] as [Description]
,fold.nameas [Folder Name]
,proj.nameas [Project Name]
,fold.created_by_name as [OwnerName]
,proj.created_time as [Project Created Time]
,proj.last_deployed_time as [Project Last Deployed Time]
,cast (pack.version_major asvarchar(10))
+ '.' + cast (pack.version_minor asvarchar(10))
+ '.' + cast (pack.version_build asvarchar(10))
as [Version]
,pack.version_comments
,proj.object_version_lsn as [Project Version]
from
catalog.packages pack
innerjoin catalog.projects proj on pack.project_id = proj.project_id
innerjoin 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:
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ógusPeriodically 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,
(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)).
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:
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.
(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:
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
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! ;)