SQL 为 SSIS 项目创建 SSISDB 的脚本

SQL Script to create SSISDB for SSIS Projects

我想知道我们是否可以通过 T-SQL 脚本在 SQL Management Studio 中为 SSIS 创建 SSISDB 而不是手动创建它?

谢谢

不要认为它可以从 T-SQL 完成,但基于 this MSDN page,您可以通过 Powershell 以编程方式完成:

# 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=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  

# Provision a new SSIS Catalog  
$catalog = New-Object $ISNamespace".Catalog" ($integrationServices, "SSISDB", "P@assword1")  
$catalog.Create()

您需要更改定义 $sqlConnectionString 的行以匹配您的目标环境,并将倒数第二行的 P@ssword1 替换为您自己的密码。

USE [master];
GO

/* ************************************************************************************************* */
/* 1. - Check if you are sysadmin member: */
/* ************************************************************************************************* */
DECLARE @is_sysadmin BIT;
SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER('sysadmin'), 0);
IF (@is_sysadmin <> 1)
BEGIN
    RAISERROR(21089, 16, 1) WITH NOWAIT;
END;

/* ************************************************************************************************* */
/* 2. - Check if SQL you are running the right SQL Version: */
/* ************************************************************************************************* */
IF CAST(SUBSTRING(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR(20)), 1, 2) AS INT) < 11
    RAISERROR(27193, 16, 1, 'Denali or later') WITH NOWAIT;

EXEC sys.sp_configure N'clr enabled', N'1';
RECONFIGURE;
GO

/* ************************************************************************************************* */
/* 3. - Verify that Common Language Runtime(CLR) is enabled on this instance: */
/* ************************************************************************************************* */
DECLARE @ErrorMsg NVARCHAR(1024);
IF (
   (
       SELECT TOP 1
              [value_in_use]
       FROM sys.configurations
       WHERE [name] = 'clr enabled'
   ) <> 1
   )
BEGIN
    SELECT @ErrorMsg = N'Common Language Runtime(CLR) is not enabled on this instance ';
    RAISERROR(@ErrorMsg, 16, 1) WITH NOWAIT;
END;

DECLARE @ssis_path_from_reg NVARCHAR(1024);
DECLARE @product_version VARCHAR(20);
SELECT @product_version = SUBSTRING(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR(20)), 1, 2) + '0';

/* ************************************************************************************************* */
/* 4. - Save the SSIS Path read from from registry: */
/* ************************************************************************************************* */
DECLARE @regkey NVARCHAR(1024);
SELECT @regkey = N'SOFTWARE\Microsoft\Microsoft SQL Server\' + @product_version + N'\SSIS\Setup\DTSPath';
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',
                           @regkey,
                           N'',
                           @ssis_path_from_reg OUTPUT;

DECLARE @SSISDBBackupFilePath NVARCHAR(1024);
DECLARE @MDFpath NVARCHAR(1024);
DECLARE @LDFpath NVARCHAR(1024);
DECLARE @CatalogFileExists BIT;

IF OBJECT_ID(N'tempdb..#t') IS NOT NULL
BEGIN
    DROP TABLE #t;
    PRINT ('Dropped Temp Table #t');
END;
CREATE TABLE #t
(
    file_exists INT,
    is_directory INT,
    parent_directory_exists INT
);

BEGIN
    SELECT @SSISDBBackupFilePath = @ssis_path_from_reg + N'Binn\SSISDBBackup.bak';
    INSERT #t
    EXEC xp_fileexist @SSISDBBackupFilePath;
    SELECT TOP 1
           @CatalogFileExists = file_exists
    FROM #t;
    TRUNCATE TABLE #t;
END;

IF (@CatalogFileExists <> 1)
BEGIN
    SELECT @ErrorMsg = N'Could not find the SSISDBBackup.bak file in the path: ' + @ssis_path_from_reg + N'\Binn\';
    RAISERROR(@ErrorMsg, 16, 1) WITH NOWAIT;
END;

SET NOCOUNT ON;

/* ************************************************************************************************* */
/* 5. - Check if SSISDB already exists: */
/* ************************************************************************************************* */
IF DB_ID('SSISDB') IS NOT NULL
    RAISERROR(27135, 16, 1, 'SSISDB');


/* Save master.mdf file path (to use it later when creating SSISDB): */
DECLARE @master_file_path NVARCHAR(1024) = CONVERT(NVARCHAR(1024), SERVERPROPERTY('MasterFile'));
SELECT @master_file_path = SUBSTRING(@master_file_path, 1, CHARINDEX(N'master.mdf', LOWER(@master_file_path)) - 1);

/* ************************************************************************************************* */
/* 6. - Check if SSISDB.mdf file already exists: */
/* ************************************************************************************************* */
BEGIN
    SELECT @MDFpath = @master_file_path + N'SSISDB.mdf';
    INSERT #t
    EXEC xp_fileexist @MDFpath;
    SELECT TOP 1
           @CatalogFileExists = file_exists
    FROM #t;
    TRUNCATE TABLE #t;
END;

IF (@CatalogFileExists <> 0)
BEGIN
    SELECT @ErrorMsg = N'File: ' + @MDFpath + N' already exists';
    RAISERROR(@ErrorMsg, 16, 1) WITH NOWAIT;
END;

/* ************************************************************************************************* */
/* 7. - Check if SSISDB.ldf file already exists: */
/* ************************************************************************************************* */
BEGIN
    SELECT @LDFpath = @master_file_path + N'SSISDB.ldf';
    INSERT #t
    EXEC xp_fileexist @LDFpath;
    SELECT TOP 1
           @CatalogFileExists = file_exists
    FROM #t;
    TRUNCATE TABLE #t;
END;

IF (@CatalogFileExists <> 0)
BEGIN
    SELECT @ErrorMsg = N'File: ' + @LDFpath + N' already exists';
    RAISERROR(@ErrorMsg, 16, 1) WITH NOWAIT;
END;

/* ************************************************************************************************* */
/* 8. - Restore SSISDB: */
/* ************************************************************************************************* */
/*
EXEC sp_executesql N'RESTORE FILELISTONLY FROM DISK = @backupfile',
                   N'@backupfile nvarchar(67)',
                   @backupfile = @SSISDBBackupFilePath;
*/


EXEC sp_executesql N'RESTORE DATABASE @databaseName FROM DISK = @backupFile  WITH REPLACE, MOVE @dataName TO @dataFilePath, MOVE @logName TO @logFilePath',
                   N'@databaseName nvarchar(6),@dataName nvarchar(4),@dataFilePath nvarchar(75),@logName nvarchar(3),@logFilePath nvarchar(75),@backupFile nvarchar(67)',
                   @databaseName = N'SSISDB',
                   @dataName = N'data',
                   @dataFilePath = @MDFpath,
                   @logName = N'log',
                   @logFilePath = @LDFpath,
                   @backupfile = @SSISDBBackupFilePath;

IF ((SELECT @@ERROR) = 0)
BEGIN
    PRINT ('Database SSISDB Restored successfully');
END;
ELSE
BEGIN
    SELECT @ErrorMsg
        = N'Could not restore SSISDB from backup file: ' + @SSISDBBackupFilePath + N' into: ' + @MDFpath + N' and '
          + @LDFpath;
    RAISERROR(@ErrorMsg, 16, 1) WITH NOWAIT;
END;
GO

/* ************************************************************************************************* */
/* 9. - Set SSIDB to READ_WRITE: */
/* ************************************************************************************************* */
USE [master];
GO

IF EXISTS
(
    SELECT [name]
    FROM sys.databases
    WHERE [name] = 'SSISDB'
          AND [is_read_only] = 1
)
    ALTER DATABASE [SSISDB] SET READ_WRITE WITH ROLLBACK IMMEDIATE;
GO


/* ************************************************************************************************* */
/* 10. - Create Master Key in SSISDB encrypted by your password: */
/* ************************************************************************************************* */
USE [SSISDB];
GO

DECLARE @_SSISDB_Password NVARCHAR(256) = N'YourP@ssw0rdHere'; /* choose your password here that meets the operating system policy requirements and is complex enough */

IF EXISTS
(
    SELECT [name]
    FROM sys.symmetric_keys
    WHERE [name] = '##MS_DatabaseMasterKey##'
)
    DROP MASTER KEY;

EXEC sp_executesql N'USE [SSISDB];
                   DECLARE @pwd nvarchar(4000) = REPLACE(@password, N'''''''', N'''''''''''');
                   EXEC(''CREATE MASTER KEY ENCRYPTION BY PASSWORD = '''''' + @pwd + '''''''');',
N'@password nvarchar(13)',
@password = @_SSISDB_Password;


/* ************************************************************************************************* */
/* 11. - Add Microsoft.SqlServer.IntegrationServices.Server.dll assembly: */
/*     - without this step you won't be able to create any objects under SSIDB Catalog  */
/* ************************************************************************************************* */
USE [master];
GO
DECLARE @productVersion NVARCHAR(128);
DECLARE @majorVersion INT;
DECLARE @minorVersion INT;
DECLARE @buildVersion INT;
DECLARE @revisionVersion INT;
DECLARE @product_version VARCHAR(20);
DECLARE @ssis_path_from_reg NVARCHAR(1024);
DECLARE @ssis_assembly_path NVARCHAR(1024);
DECLARE @sql NVARCHAR(2048);

SET @productVersion = CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128));
SET @majorVersion = CONVERT(INT, PARSENAME(@productVersion, 4));
SET @minorVersion = CONVERT(INT, PARSENAME(@productVersion, 3));
SET @buildVersion = CONVERT(INT, PARSENAME(@productVersion, 2));
SET @revisionVersion = CONVERT(INT, PARSENAME(@productVersion, 1));
SET @product_version = SUBSTRING(CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR(20)), 1, 2) + '0';

DECLARE @regkey NVARCHAR(1024);
SELECT @regkey = N'SOFTWARE\Microsoft\Microsoft SQL Server\' + @product_version + N'\SSIS\Setup\DTSPath';
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',
                           @regkey,
                           N'',
                           @ssis_path_from_reg OUTPUT;
SELECT @ssis_assembly_path = @ssis_path_from_reg + N'Binn\Microsoft.SqlServer.IntegrationServices.Server.dll';

/* All versions before SQL 14 RC1 use asymmetric key and login */
/* 14.0.800.11 is an intermediate version between RC0 and RC1. This feature should be enabled in RC1 */
/* All versions from SQL 14 RC1 use trusted assembly */
IF NOT (
           @majorVersion > 14
           OR
           (
               @majorVersion = 14
               AND
               (
                   @minorVersion > 0
                   OR
                   (
                       @minorVersion = 0
                       AND
                       (
                           @buildVersion > 800
                           OR
                           (
                               @buildVersion = 800
                               AND @revisionVersion > 11
                           )
                       )
                   )
               )
           )
       )
BEGIN
    IF EXISTS
    (
        SELECT [name]
        FROM sys.server_principals
        WHERE name = '##MS_SQLEnableSystemAssemblyLoadingUser##'
    )
        DROP LOGIN ##MS_SQLEnableSystemAssemblyLoadingUser##;

    IF EXISTS
    (
        SELECT *
        FROM sys.asymmetric_keys
        WHERE name = 'MS_SQLEnableSystemAssemblyLoadingKey'
    )
        DROP ASYMMETRIC KEY MS_SQLEnableSystemAssemblyLoadingKey;

    SET @sql = N'CREATE ASYMMETRIC KEY MS_SQLEnableSystemAssemblyLoadingKey
    FROM EXECUTABLE FILE = ''' + @ssis_path_from_reg + N'Binn\Microsoft.SqlServer.IntegrationServices.Server.dll'';';
    --PRINT @sql
    EXEC sp_executesql @sql;

    CREATE LOGIN ##MS_SQLEnableSystemAssemblyLoadingUser## FROM ASYMMETRIC KEY MS_SQLEnableSystemAssemblyLoadingKey;
    GRANT UNSAFE ASSEMBLY TO ##MS_SQLEnableSystemAssemblyLoadingUser##;

END;
ELSE
BEGIN
    DECLARE @asm_bin VARBINARY(MAX);
    DECLARE @isServerHashCode VARBINARY(64);

    SELECT @sql
        = N'
        SELECT @asm_bin = BulkColumn
        FROM
        OPENROWSET(BULK
                      ''' + @ssis_assembly_path
          + N''',
                      SINGLE_BLOB
                  )
        AS dll;
        ';
    EXEC sp_executesql @sql,
                       N'@asm_bin VARBINARY(MAX) OUTPUT',
                       @asm_bin OUTPUT;

    SELECT @isServerHashCode = HASHBYTES('SHA2_512', @asm_bin);
    IF NOT EXISTS
    (
        SELECT *
        FROM sys.trusted_assemblies
        WHERE hash = @isServerHashCode
    )
        EXEC sys.sp_add_trusted_assembly @isServerHashCode, @ssis_assembly_path;

END;

/* ************************************************************************************************* */
/* 12. - Create startup stored procedure: */
/* ************************************************************************************************* */

IF EXISTS (SELECT name FROM sys.procedures WHERE name = N'sp_ssis_startup')
BEGIN
    EXEC sp_procoption N'sp_ssis_startup', 'startup', 'off';
    DROP PROCEDURE [sp_ssis_startup];
END;
GO

CREATE PROCEDURE [dbo].[sp_ssis_startup]
AS
SET NOCOUNT ON;
/* Currently, the IS Store name is 'SSISDB' */
IF DB_ID('SSISDB') IS NULL
    RETURN;

IF NOT EXISTS
(
    SELECT name
    FROM [SSISDB].sys.procedures
    WHERE name = N'startup'
)
    RETURN;

/*Invoke the procedure in SSISDB  */
/* Use dynamic sql to handle AlwaysOn non-readable mode*/
DECLARE @script NVARCHAR(500);
SET @script = N'EXEC [SSISDB].[catalog].[startup]';
EXECUTE sp_executesql @script;
GO

/* set the sp_ssis_startup procedure for autoexecution: */
IF (1 = 1)
BEGIN
    EXEC sp_procoption N'sp_ssis_startup', 'startup', 'on';
END;

/* ************************************************************************************************* */
/* 13. - Create and map ##MS_SSISServerCleanupJobUser## */
/* ************************************************************************************************* */

USE [master]
GO

IF EXISTS
(
    SELECT *
    FROM sys.server_principals
    WHERE name = '##MS_SSISServerCleanupJobLogin##'
)
    DROP LOGIN ##MS_SSISServerCleanupJobLogin##;

DECLARE @loginPassword NVARCHAR(256);
SELECT @loginPassword = REPLACE(CONVERT(NVARCHAR(256), CRYPT_GEN_RANDOM(64)), N'''', N'''''');
EXEC ('CREATE LOGIN ##MS_SSISServerCleanupJobLogin## WITH PASSWORD =''' + @loginPassword + ''', CHECK_POLICY = OFF');

ALTER LOGIN ##MS_SSISServerCleanupJobLogin## DISABLE;

USE [SSISDB];
GO

IF EXISTS
(
    SELECT name
    FROM sys.database_principals
    WHERE name = '##MS_SSISServerCleanupJobUser##'
)
    DROP USER ##MS_SSISServerCleanupJobUser##;


CREATE USER ##MS_SSISServerCleanupJobUser## FOR LOGIN ##MS_SSISServerCleanupJobLogin##;
GRANT EXECUTE
ON [internal].[cleanup_server_retention_window]
TO  ##MS_SSISServerCleanupJobUser##;

GRANT EXECUTE
ON [internal].[cleanup_server_project_version]
TO  ##MS_SSISServerCleanupJobUser##;

USE [master];
GO

GRANT VIEW SERVER STATE TO ##MS_SSISServerCleanupJobLogin##;

USE [msdb];
GO

IF NOT EXISTS
(
    SELECT *
    FROM [sys].[server_principals]
    WHERE [name] = '##MS_SSISServerCleanupJobLogin##'
)
    RAISERROR(27229, 16, 1, '##MS_SSISServerCleanupJobLogin##') WITH NOWAIT;

/* ************************************************************************************************* */
/* 13. - Create Maintenance Jobs and Map ##MS_SSISServerCleanupJobLogin## login */
/* ************************************************************************************************* */

USE [msdb];
GO

IF EXISTS
(
    SELECT name
    FROM sysjobs
    WHERE name = N'SSIS Server Maintenance Job'
)
    EXEC sp_delete_job @job_name = N'SSIS Server Maintenance Job';



IF EXISTS
(
    SELECT [name]
    FROM [sysjobs]
    WHERE [name] = N'SSIS Failover Monitor Job'
)
    EXEC sp_delete_job @job_name = N'SSIS Failover Monitor Job';


EXEC dbo.sp_add_job @job_name = N'SSIS Server Maintenance Job',
                    @enabled = 1,
                    @owner_login_name = '##MS_SSISServerCleanupJobLogin##',
                    @description = N'Runs every day. The job removes operation records from the database that are outside the retention window and maintains a maximum number of versions per project.';


DECLARE @IS_server_name NVARCHAR(30);
SELECT @IS_server_name = CONVERT(NVARCHAR, SERVERPROPERTY('ServerName'));

EXEC sp_add_jobserver @job_name = N'SSIS Server Maintenance Job',
                      @server_name = @IS_server_name;

EXEC sp_add_jobstep @job_name = N'SSIS Server Maintenance Job',
                    @step_name = N'SSIS Server Operation Records Maintenance',
                    @subsystem = N'TSQL',
                    @command = N'
                               DECLARE @role int
                               SET @role = (SELECT [role] FROM [sys].[dm_hadr_availability_replica_states] hars INNER JOIN [sys].[availability_databases_cluster] adc ON hars.[group_id] = adc.[group_id] WHERE hars.[is_local] = 1 AND adc.[database_name] =''SSISDB'')
                               IF DB_ID(''SSISDB'') IS NOT NULL AND (@role IS NULL OR @role = 1)
                               EXEC [SSISDB].[internal].[cleanup_server_retention_window]',
                    @database_name = N'msdb',
                    @on_success_action = 3,
                    @retry_attempts = 3,
                    @retry_interval = 3;


EXEC sp_add_jobstep @job_name = N'SSIS Server Maintenance Job',
                    @step_name = N'SSIS Server Max Version Per Project Maintenance',
                    @subsystem = N'TSQL',
                    @command = N'
                               DECLARE @role int
                               SET @role = (SELECT [role] FROM [sys].[dm_hadr_availability_replica_states] hars INNER JOIN [sys].[availability_databases_cluster] adc ON hars.[group_id] = adc.[group_id] WHERE hars.[is_local] = 1 AND adc.[database_name] =''SSISDB'')
                               IF DB_ID(''SSISDB'') IS NOT NULL AND (@role IS NULL OR @role = 1)
                               EXEC [SSISDB].[internal].[cleanup_server_project_version]',
                    @database_name = N'msdb',
                    @retry_attempts = 3,
                    @retry_interval = 3;


EXEC sp_add_jobschedule @job_name = N'SSIS Server Maintenance Job',
                        @name = 'SSISDB Scheduler',
                        @enabled = 1,
                        @freq_type = 4,     /*daily*/
                        @freq_interval = 1, /*every day*/
                        @freq_subday_type = 0x1,
                        @active_start_date = 20001231,
                        @active_end_date = 99991231,
                        @active_start_time = 0,
                        @active_end_time = 120000;
GO