PowerShell script to provision and setup SSIS Catalogs.
# -----------------------------------------------------------------------------
# Example 1
# -----------------------------------------------------------------------------
# Publish to SSIS Catalog using PowerShell
#
# Here is a PowerShell script that I use to provision and setup SSIS Catalogs
# when I'm demoing SQL Server 2012. It does the following:
#
# - Connects to localhost (default instance)
# - Drops the existing SSIS Catalog
# - Creates a new SSIS Catalog
# - Creates a Folder
# - Deploys a Project
# - Creates an Environment
# - Creates three server varaibles
# - Creates an environment reference for the project
#
# References:
# - [Deploying Multiple SSIS Projects via PowerShell](https://www.simple-talk.com/sql/ssis/deploying-multiple-ssis-projects-via-powershell/)
# - [Publish to SSIS Catalog using PowerShell](https://www.simple-talk.com/sql/ssis/deploying-multiple-ssis-projects-via-powershell/)
# -----------------------------------------------------------------------------
# Variables
$ProjectFilePath = "C:\SSIS\MyCatalog\Project\bin\Development\MyCatalogProject.ispac"
$ProjectName = "MyCatalogProject"
$FolderName = "Demo"
$EnvironmentName = "CustomerA"
#
# Load the IntegrationServices Assembly and Store the IntegrationServices Assembly namespace to avoid typing it every time
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices") | Out-Null;
$ISNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
Write-Host "Connecting to server ..."
$sqlConnectionString = "Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
#
# Create the Integration Services object
$integrationServices = New-Object $ISNamespace".IntegrationServices" $sqlConnection
#
# Drop the existing catalog if it exists
Write-Host "Removing previous catalog ..."
if ($integrationServices.Catalogs.Count -gt 0) { $integrationServices.Catalogs["SSISDB"].Drop() }
#
# Provision a new SSIS Catalog
Write-Host "Creating new SSISDB Catalog ..."
$catalog = New-Object $ISNamespace".Catalog" ($integrationServices, "SSISDB", "SUPER#secret1")
$catalog.Create()
#
# Create a new folder
Write-Host "Creating Folder " $FolderName " ..."
$folder = New-Object $ISNamespace".CatalogFolder" ($catalog, $FolderName, "Folder description")
$folder.Create()
#
# Read the project file, and deploy it to the folder
Write-Host "Deploying " $ProjectName " project ..."
[byte[]] $projectFile = [System.IO.File]::ReadAllBytes($ProjectFilePath)
$folder.DeployProject($ProjectName, $projectFile)
Write-Host "Creating environment ..."
$environment = New-Object $ISNamespace".EnvironmentInfo" ($folder, $EnvironmentName, "Description")
$environment.Create()
#
# Adding variable to our environment
# Constructor args: variable name, type, default value, sensitivity, description
Write-Host "Adding server variables ..."
$environment.Variables.Add("CustomerID", [System.TypeCode]::String, "C111", "false", "Customer ID")
$environment.Variables.Add("FtpUser", [System.TypeCode]::String, $EnvironmentName, "false", "FTP user")
$environment.Variables.Add("FtpPassword", [System.TypeCode]::String, "SECRET1234!", "true", "FTP password")
$environment.Alter()
#
# making project refer to this environment
Write-Host "Adding environment reference to project ..."
$project = $folder.Projects[$ProjectName]
$project.References.Add($EnvironmentName, $folder.Name)
$project.Alter()
Write-Host "All done."
# -----------------------------------------------------------------------------
# Example 2
# -----------------------------------------------------------------------------
# SSIS Catalog and Project Deployment with PowerShell
#
# Overview
#
# A brief summary of the script below:
#
# 1. Check for the catalog and create it if it doesn't exist
# 2. Checks for a project folder in the catalog, creating it if it doesn't exist
# 3. Deploys the project from the ISPAC file
# 4. Creates an environment (again if it doesn't already exist) in the project
# folder and then adds a reference to the Project
# 5. Adds a variable programmatically to the Environment folder
# 6. Configures a package parameter within the project to use the environment
# variable
# 7. Without further ado, the script is provided below:
#
# Reference:
# - https://blogs.msdn.microsoft.com/bluewatersql/2014/12/19/ssis-catalog-and-project-deployment-with-powershell/
# -----------------------------------------------------------------------------
$ServerName = "localhost"
$SSISCatalog = "SSISDB"
$CatalogPwd = "P@ssw0rd1"
$ProjectFilePath = "C:\Dev\SSISDeploymentDemo\SSISDeploymentDemo\bin\Development\SSISDeploymentDemo.ispac"
$ProjectName = "SSISDeploymentDemo"
$FolderName = "Deployment Demo"
$EnvironmentName = "Microsoft"
# Load the IntegrationServices Assembly
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices")
# Store the IntegrationServices Assembly namespace to avoid typing it every time
$ISNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
Write-Host "Connecting to server ..."
# Create a connection to the server
$sqlConnectionString = "Data Source=$ServerName;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
$integrationServices = New-Object "$ISNamespace.IntegrationServices" $sqlConnection
$catalog = $integrationServices.Catalogs[$SSICatalog]
# Create the Integration Services object if it does not exist
if (!$catalog) {
# Provision a new SSIS Catalog
Write-Host "Creating SSIS Catalog ..."
$catalog = New-Object "$ISNamespace.Catalog" ($integrationServices, $SSISCatalog, $CatalogPwd)
$catalog.Create()
}
$folder = $catalog.Folders[$FolderName]
if (!$folder)
{
#Create a folder in SSISDB
Write-Host "Creating Folder ..."
$folder = New-Object "$ISNamespace.CatalogFolder" ($catalog, $FolderName, $FolderName)
$folder.Create()
}
# Read the project file, and deploy it to the folder
Write-Host "Deploying Project ..."
[byte[]] $projectFile = [System.IO.File]::ReadAllBytes($ProjectFilePath)
$folder.DeployProject($ProjectName, $projectFile)
$environment = $folder.Environments[$EnvironmentName]
if (!$environment)
{
Write-Host "Creating environment ..."
$environment = New-Object "$ISNamespace.EnvironmentInfo" ($folder, $EnvironmentName, $EnvironmentName)
$environment.Create()
}
$project = $folder.Projects[$ProjectName]
$ref = $project.References[$EnvironmentName, $folder.Name]
if (!$ref)
{
# making project refer to this environment
Write-Host "Adding environment reference to project ..."
$project.References.Add($EnvironmentName, $folder.Name)
$project.Alter()
}
# Adding variable to our environment
# Constructor args: variable name, type, default value, sensitivity, description
$customerID = $environment.Variables["CustomerID"];
if (!$customerID)
{
Write-Host "Adding environment variables ..."
$environment.Variables.Add(
"CustomerID",
[System.TypeCode]::String, "MSFT", $false, "Customer ID")
$environment.Alter()
$customerID = $environment.Variables["CustomerID"];
}
$package = $project.Packages["Package.dtsx"]
$package.Parameters["CustomerID"].Set(
[Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Referenced,
$customerID.Name)
$package.Alter()