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)).

Nincsenek megjegyzések:

Megjegyzés küldése