SSIS Execution Best Practices: File System vs SSISDB Catalog with Complete Workshop

SSIS Execution Best Practices: File System vs SSISDB Catalog with Complete Workshop – SQLYARD

SSIS Execution Best Practices: File System vs SSISDB Catalog with Complete Workshop


Compatibility: SSISDB (the SSIS Catalog) has been available since SQL Server 2012. All content in this article applies to SQL Server 2012 through SQL Server 2025. SQL Server 2025-specific changes are called out with badges where relevant.

When testing or running SSIS packages, one of the most common points of confusion is where the package executes, where it should be stored, and why Microsoft recommends the SSIS Catalog (SSISDB) over file system execution for most production workloads. This guide walks through both models, explains why each exists, what changed in SQL Server 2025, and gives you a full end-to-end workshop you can follow step by step.

What Runs Where

Option B — File System (.dtsx on a share)

  • Packages stored on disk or a network share
  • Run using DTExec, a scheduled task, or an orchestrator
  • Requires SSIS runtime on the machine doing the execution
  • Logging, consistency, and repeatability are your responsibility
  • Legacy SSIS Service (MSDB model) deprecated in SQL Server 2025

Key execution rule: If your jump box only has SSMS installed, you are not executing SSIS packages locally. You are only triggering execution on another server — either SQL Agent or SSISDB. The package always runs where the SSIS runtime is installed.

Why SSISDB Is Best Practice

If you are running anything beyond quick one-off jobs, SSISDB should be your default choice. It gives you everything the file system model requires you to build yourself:

  • Central deployment model for projects and packages via .ispac files
  • Parameter and environment management — clean Dev, Test, and Prod separation without touching packages
  • Built-in execution history and detailed logging via catalog.operation_messages and catalog.executions
  • Standard monitoring workflows in SSMS or via catalog views
  • Easier troubleshooting and auditing — every execution is recorded with start time, end time, status, and error messages
  • Consistent execution behavior across environments via environment variables
  • Version rollback — SSISDB retains previous project versions and lets you restore to an older deployment

SQL Server 2025 Changes That Affect This Decision Updated 2025

SQL Server 2025 made several changes to SSIS that reinforce the SSISDB recommendation and deprecate parts of the file system model:

ChangeImpactStatus
Legacy SSIS Service (MSDB package deployment model) The service that managed packages stored in MSDB is deprecated. No impact on SSISDB deployments. Deprecated
32-bit execution mode Deprecated. SSMS and Visual Studio now only support 64-bit. Packages running in 32-bit mode must be updated. Deprecated
SSIS Package Store Deprecated. SSISDB is now the only fully supported deployment target for new work. Deprecated
CDC components for Oracle by Attunity + Microsoft Connector for Oracle Discontinued. Migrate to Azure Data Factory or third-party connectors. Discontinued
SQLClient Data Provider (SDS) connection type Deprecated. Replace with ADO.NET connection using the Microsoft SqlClient Data Provider. Deprecated
ADO.NET connection manager — Microsoft SqlClient Now supports TLS 1.3, Strict Encryption, and Microsoft Entra ID authentication. New in 2025
SSISDB catalog and project deployment model Unchanged. Fully supported and recommended. SSISDB remains the production standard. Supported

If you are still using the MSDB package deployment model (packages stored in MSDB, Legacy SSIS Service), now is the time to migrate to the SSISDB project deployment model. The Legacy SSIS Service is deprecated in SQL Server 2025. You can disable it safely — it has no impact on SSISDB-based deployments.

When File System Execution Is Still Acceptable

File system execution is reasonable when:

  • You have simple utility packages that do not need central logging
  • You are supporting legacy deployments and migrating in phases
  • You have a dedicated SSIS runner server with strong operational discipline
  • You are running DTExec as part of an orchestrated pipeline that provides its own logging

The risk is that logging, consistency, and repeatability are entirely on you — not the platform. When something fails overnight, diagnosing it is significantly harder without the SSISDB execution history.

Side-by-Side Comparison

FactorSSISDB (Catalog)File System
Execution loggingBuilt in — catalog.executions and catalog.operation_messagesManual — you build your own logging
Error detailsFull message, task, component detail stored automaticallyDTExec output only unless custom logging added
Environment managementBuilt in — environments map variables to parameters per envManual — config files or external configuration
Version controlPrevious project versions retained and restorableFile system only — manual version management
Security modelRole-based — ssis_admin, ssis_logreader, db_ssisoperatorFile system ACLs only
SQL Server 2025 supportFully supported — only recommended modelLegacy SSIS Service deprecated, Package Store deprecated
Setup complexityMore steps to configure initiallySimpler to start
Production reliabilityHigh — platform-managed logging and execution trackingDepends entirely on operational discipline

SSISDB Default Settings to Change After Creation

SSISDB ships with defaults that work fine for small, new environments but cause serious problems at scale. Two settings in particular should be changed immediately after creating the catalog:

SSISDB can grow to unexpectedly large sizes if these defaults are left unchanged. In high-execution environments, the SSISDB transaction log can grow to hundreds of gigabytes. Changing these settings immediately after creation avoids the problem entirely.

SettingDefaultRecommendedWhy
Maximum Number of Versions per Project103Unless you deploy multiple times a day, 10 versions is excessive. 3 versions provides adequate rollback capability for most teams.
Retention Period (days)36590–180A year of execution history accumulates quickly in active environments. 90–180 days is sufficient for most troubleshooting and auditing needs.
Server-wide Default Logging LevelBasicBasic (keep) or CustomBasic logs a useful amount. If SSISDB growth is a concern on SQL Server 2016+, create a custom logging level that captures errors and warnings only.
Clean Logs PeriodicallyTrueTrue (keep)The SSIS Server Maintenance Job runs cleanup. Keep this enabled.
Periodically Remove Old VersionsTrueTrue (keep)Keeps version count in check. Leave enabled.
-- Change SSISDB defaults immediately after catalog creation
-- Run in SSMS: right-click SSISDB catalog -> Properties, or use T-SQL:

USE SSISDB;
GO

-- Reduce max versions per project from 10 to 3
EXEC catalog.configure_catalog
    @property_name  = N'MAX_PROJECT_VERSIONS',
    @property_value = 3;

-- Reduce retention period from 365 to 90 days
EXEC catalog.configure_catalog
    @property_name  = N'RETENTION_WINDOW',
    @property_value = 90;

-- Verify current settings
SELECT property_name, property_value
FROM catalog.catalog_properties
ORDER BY property_name;

Ensure SSISDB Transaction Log Backups Are Running

SSISDB uses the Full recovery model by default. Without regular transaction log backups, the log file grows without bound. Add SSISDB to your standard log backup jobs or maintenance plan:

-- Confirm SSISDB recovery model
SELECT name, recovery_model_desc
FROM sys.databases
WHERE name = 'SSISDB';
-- Should show FULL

-- Add SSISDB to your existing log backup job, or create one:
BACKUP LOG SSISDB
TO DISK = N'\\backup-share\SSISDB\SSISDB_log.trn'
WITH COMPRESSION, STATS = 5;

Workshop: Run the Same Package Both Ways

Scenario: Export data from SQL Server to a CSV file on a network share, using an SSIS package that runs both ways — via SSISDB and via file system — so you can see the difference in practice.

Example environment used throughout this workshop: SQL Server: YOURSQL01  ·  Database: YourDB  ·  Source table: dbo.ExportDemo  ·  Output share: \\FileServer01\Exports\  ·  Package: ExportTableToCsv.dtsx  ·  Project: ExportProject  ·  SSISDB folder: OpsExports

Part 1 — Pre-Run Testing Checklist

Before running anything, confirm these four points. Most failures trace back to missing one of them.

  • Where does the package live — SSISDB or file system? SSISDB packages can be triggered from SSMS. File system packages require SSIS runtime on the execution machine.
  • What is the execution identity? SQL Agent job owner or proxy, or SSISDB execution context? Does that account have database and file share permissions?
  • Does the execution account have write access to \\FileServer01\Exports\? Never use mapped drives — always use UNC paths.
  • How will you troubleshoot a failure? SSISDB uses built-in catalog views. File system requires custom logging you build yourself.
Part 2 — Build the Example SSIS Package

In SSDT (Visual Studio with SSIS extensions), create the package that both deployment methods will use:

1

Create the Project and Package

  • Create an Integration Services Project named ExportProject
  • Add a package named ExportTableToCsv.dtsx
  • Add three project parameters: p_ConnectionString, p_OutputFolder, p_FileName
2

Add the Data Flow

  • Add a Data Flow Task named: DFT Export ExportDemo
  • OLE DB SourceSELECT * FROM dbo.ExportDemo;
  • Flat File Destination — Path = @[User::p_OutputFolder] + @[User::p_FileName]
  • Flat File Connection Manager — Delimited, UTF-8 encoding, column headers optional

The package is now complete. The same .ispac will be deployed to SSISDB (Part 3) and used from the file system (Part 4).

Part 3 — Best Practice: Deploy and Run via SSISDB
A

Create the SSIS Catalog

In SSMS, right-click Integration Services Catalogs and select Create Catalog. This creates SSISDB and enables CLR integration. You can only create one catalog per SQL Server instance.

Save the catalog encryption password in a secure location immediately — it is required for disaster recovery and cannot be retrieved later.

B

Tune SSISDB Defaults Before Deploying

Change the retention and version defaults immediately — before any packages are deployed or executed. See the SSISDB Default Settings section above for the full rationale.

USE SSISDB;
GO
EXEC catalog.configure_catalog @property_name = N'MAX_PROJECT_VERSIONS', @property_value = 3;
EXEC catalog.configure_catalog @property_name = N'RETENTION_WINDOW',     @property_value = 90;
C

Deploy the Project

Deploy the .ispac using the SSMS Deployment Wizard (right-click the project in SSDT → Deploy) or via T-SQL:

-- Automated deployment via T-SQL
DECLARE @ispac VARBINARY(MAX);
SELECT @ispac = BulkColumn
FROM OPENROWSET(BULK N'C:\Builds\ExportProject.ispac', SINGLE_BLOB) AS ispac;

EXEC catalog.deploy_project
    @folder_name   = N'OpsExports',
    @project_name  = N'ExportProject',
    @project_stream = @ispac;
D

Create Folder and Environment

USE SSISDB;
GO

-- Create the folder
EXEC catalog.create_folder
    @folder_name = N'OpsExports';

-- Create a Prod environment
EXEC catalog.create_environment
    @folder_name       = N'OpsExports',
    @environment_name  = N'Prod';
E

Create Environment Variables

USE SSISDB;
GO

EXEC catalog.create_environment_variable
    @folder_name       = N'OpsExports',
    @environment_name  = N'Prod',
    @variable_name     = N'OutputFolder',
    @data_type         = N'String',
    @sensitive         = 0,
    @value             = N'\\FileServer01\Exports\';

EXEC catalog.create_environment_variable
    @folder_name       = N'OpsExports',
    @environment_name  = N'Prod',
    @variable_name     = N'ConnStr',
    @data_type         = N'String',
    @sensitive         = 0,
    @value             = N'Data Source=YOURSQL01;Initial Catalog=YourDB;Integrated Security=SSPI;';

This is why SSISDB scales cleanly across environments — swap the environment reference from Prod to Dev and the package uses a completely different connection string and output path without touching the package.

F

Map Environment Variables to Parameters

In SSMS, configure the project so p_OutputFolder maps to OutputFolder and p_ConnectionString maps to ConnStr. This can also be done via T-SQL:

USE SSISDB;
GO

-- Get the environment reference ID first
DECLARE @ref_id BIGINT;
EXEC catalog.create_environment_reference
    @folder_name       = N'OpsExports',
    @project_name      = N'ExportProject',
    @environment_name  = N'Prod',
    @reference_type    = R,
    @reference_id      = @ref_id OUTPUT;

-- Map OutputFolder variable to p_OutputFolder parameter
EXEC catalog.set_object_parameter_value
    @object_type       = 20,  -- 20 = project parameter
    @folder_name       = N'OpsExports',
    @project_name      = N'ExportProject',
    @parameter_name    = N'p_OutputFolder',
    @parameter_value   = N'OutputFolder',
    @value_type        = R;   -- R = reference to environment variable
G

Execute and Monitor

Right-click the package in SSMS → Execute. Execution happens on the SQL Server hosting SSISDB. Monitor with catalog views:

-- Recent executions with status
SELECT TOP 20
    e.execution_id,
    e.folder_name,
    e.project_name,
    e.package_name,
    e.status,           -- 1=Created, 2=Running, 3=Cancelled, 4=Failed, 5=Pending, 6=Ended Unexpectedly, 7=Success, 8=Stopped, 9=Completed
    e.start_time,
    e.end_time
FROM catalog.executions e
ORDER BY e.execution_id DESC;

-- Error messages for a specific execution
DECLARE @execution_id BIGINT = 123456;  -- Replace with actual execution_id
SELECT
    message_time,
    message_type,
    message_source_name,
    message
FROM catalog.operation_messages
WHERE operation_id = @execution_id
ORDER BY message_time;
Part 4 — File System Execution (Alternative)

Use this when you have a dedicated SSIS runner server with the SSIS runtime installed, or for controlled legacy deployments.

Run Directly from the File System

-- Run a .dtsx file directly using DTExec
-- Must run on a server with SSIS runtime installed
dtexec /F "\\FileServer01\SSIS\ExportProject\ExportTableToCsv.dtsx"

Run an SSISDB Package Using DTExec

-- Run an SSISDB-deployed package from the command line
dtexec /ISSERVER "\SSISDB\OpsExports\ExportProject\ExportTableToCsv.dtsx" /SERVER "YOURSQL01"

Even when calling dtexec /ISSERVER, the package executes on the SQL Server hosting SSISDB — not on the machine running the DTExec command. You still benefit from SSISDB logging.

The Jump Box Rule

This trips up DBAs regularly. If your jump box (the workstation or remote desktop you use to connect) only has SSMS installed:

  • You cannot run SSIS packages locally on that jump box
  • You can trigger execution on a server that has SSIS installed
  • Execution always happens where the SSIS runtime lives — not where you clicked

Best options when working from a jump box:

  • Deploy to SSISDB and execute from SSMS — execution runs on the SQL Server
  • Create a SQL Agent job and run it remotely from SSMS — execution runs on the Agent server
  • Do not attempt file system package execution from a jump box unless SSIS runtime is installed on that machine

Quick Decision Guide

ScenarioRecommended Approach
New production ETL pipelineSSISDB — always
Multi-environment deployment (Dev, Test, Prod)SSISDB with environments
Need detailed execution history and error logsSSISDB catalog views
Simple utility package, lightweight useFile system with DTExec
Legacy MSDB package deployment modelMigrate to SSISDB — Legacy SSIS Service deprecated in 2025
Cloud or hybrid environmentConsider Azure Data Factory with Azure-SSIS IR
Executing from a jump box with SSMS onlySSISDB via SSMS or SQL Agent job
Need version rollback on a deployed projectSSISDB — right-click project → Versions → Restore

SSISDB is not just a storage location — it is a runtime management platform. If you are still running packages from file shares or MSDB, migrating to SSISDB will dramatically improve monitoring, troubleshooting, and operational confidence. In SQL Server 2025, it is also the only fully supported deployment model going forward.

References


Discover more from SQLYARD

Subscribe to get the latest posts sent to your email.

Leave a Reply

Discover more from SQLYARD

Subscribe now to keep reading and get access to the full archive.

Continue reading