Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Déploiement du projet SSIS (SQL Server 2012) hors réseau

Vous disposez de 3 outils pour déployer des fichiers .ispac dans le catalogue SSISDB.

  1. ISDeploymentWizard.exe
  2. ManagedObjectModel
  3. TSQL

Vous utilisez déjà l'assistant et il ne fonctionne pas en raison de problèmes d'authentification. Je pense que même avec votre approche MOM, vous rencontrerez toujours des problèmes d'authentification. Cela laisse l'approche TSQL et puisque vous avez une connexion valide, j'espère que cela fonctionnera.

Le code suivant va sérialiser votre .ispac, créer le dossier de déploiement s'il n'existe pas déjà, déployer le projet, puis attribuer une valeur de paramètre.

Dans SSMS, vous devrez changer votre mode en mode SQLCMD qui est disponible dans le menu Requête. Après cela, appuyez sur Ctrl-Maj-M pour faire apparaître la macro-chose et cela vous permettra de spécifier où le fichier .ispac peut être trouvé.

USE SSISDB
GO

IF ('$(isPacPath)' = '$' + '(isPacPath)')
BEGIN
    THROW 50000, N'This script must be run in SQLCMD mode.', 1;
END
GO

-- You must be in SQLCMD mode
-- setvar isPacPath "C:\sandbox\SSDTDeploy\TSQLDeploy\bin\Development\TSQLDeploy.ispac"
:setvar isPacPath "<isPacFilePath, nvarchar(4000), C:\sandbox\SSDTDeploy\TSQLDeploy\bin\Development\TSQLDeploy.ispac>"



DECLARE
    @folder_name nvarchar(128) = 'TSQLDeploy'
,   @folder_id bigint = NULL
    -- this must match the ispac
,   @project_name nvarchar(128) = 'TSQLDeploy'
,   @project_stream varbinary(max)
,   @operation_id bigint = NULL;

-- Read the zip (ispac) data in from the source file
SELECT
    @project_stream = T.stream
FROM
(
    SELECT 
        *
    FROM 
        OPENROWSET(BULK N'$(isPacPath)', SINGLE_BLOB ) AS B
) AS T (stream);

-- Test for catalog existences
IF NOT EXISTS
(
    SELECT
        CF.name
    FROM
        catalog.folders AS CF
    WHERE
        CF.name = @folder_name
)
BEGIN
    -- Create the folder for our project
    EXECUTE [catalog].[create_folder] 
        @folder_name
    ,   @folder_id OUTPUT;
END

-- Actually deploy the project
EXECUTE [catalog].[deploy_project] 
    @folder_name
,   @project_name
,   @project_stream
,   @operation_id OUTPUT;

-- Check to see if something went awry
SELECT
    OM.* 
FROM
    catalog.operation_messages AS OM;

-- Use this to set parameters
-- http://msdn.microsoft.com/en-us/library/ff878162.aspx
EXECUTE catalog.set_object_parameter_value 
    -- Use the value 20 to indicate a project parameter 
    -- or the value 30 to indicate a package parameter
    @object_type = 20 
,   @folder_name = @folder_name
,   @project_name = @project_name
,   @parameter_name = N'' -- nvarchar(128)
,   @parameter_value = NULL -- sql_variant
,   @object_name = N'' -- nvarchar(260)
,   @value_type = '' -- char(1)
--  Use the character V to indicate that parameter_value is a literal value 
-- that will be used by default if no other values are assigned prior 
-- to execution. 
-- Use the character R to indicate that parameter_value is a referenced value 
-- and has been set to the name of an environment variable. 
-- This argument is optional, the character V is used by default

Si vous avez assisté à la conférence SQL Pass Summit 2012, j'en ai fait la démonstration dans mon exposé sur Modèle de déploiement 2012 mais je n'ai pas couvert le paramètre paramètre partie. Je crois que le dernier appel est correct mais je ne l'ai pas vérifié. J'ai lié à la documentation de l'appel de procédure afin que vous puissiez l'adapter à vos besoins spécifiques.

Exemple d'implémentation de PowerShell

Mise à jour août 2013

J'ai appris quelque chose chez mon client actuel. Nous avons nos ordinateurs portables qui sont joints au domaine domestique. Nous avons des comptes sur le réseau AD du client. Chaque fois que j'ai besoin de "faire" quelque chose dans le monde du client, je dois lancer mon processus et lui demander de présenter mes informations d'identification "étrangères". Ce qui rend cela possible est RunAs . Autre référence

J'ai créé une suite de fichiers batch qui lancent tous les processus dont j'ai besoin. Ils prennent la forme de

runas /netonly:ForeignDomain\Doppelganger "C:\windows\system32\cmd.exe"

J'en ai un pour une invite de commande (ci-dessus), Visual Studio, SSMS, PowerShell, PowerShell ISE et quelques autres applications spécialisées qui doivent fonctionner avec leur domaine.

En utilisant l'approche runas, j'ai pu déployer des packages en utilisant toutes les méthodes ci-dessus (ainsi que le déploiement directement à partir d'une instance de Visual Studio exécutée avec des informations d'identification étrangères).