Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Distribuzione del progetto SSIS (SQL Server 2012) all'esterno della rete

Hai 3 strumenti per distribuire i file .ispac nel catalogo SSISDB.

  1. ISDeploymentWizard.exe
  2. ManagedObjectModel
  3. TSQL

Stai già utilizzando la procedura guidata e non funziona a causa di problemi di autenticazione. Penso che anche con il tuo approccio MOM, incontrerai comunque problemi di autenticazione. Ciò lascia l'approccio TSQL e poiché si dispone di un accesso valido, si spera che funzioni.

Il codice seguente serializzerà il tuo .ispac, creerà la cartella di distribuzione se non esiste già, distribuirà il progetto e quindi assegnerà un valore di parametro.

In SSMS, dovrai cambiare la tua modalità in modalità SQLCMD che è disponibile nel menu Query. Dopo averlo fatto, premi Ctrl-Shift-M per visualizzare la macro e ti consentirà di specificare dove è possibile trovare il file .ispac.

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

Se hai partecipato alla conferenza SQL Pass Summit 2012, l'ho dimostrato nel mio intervento su Modello di distribuzione 2012 ma non ho coperto il parametro parte. Credo che l'ultima chiamata sia corretta ma non l'ho verificata. Ho collegato la documentazione per la chiamata di procedura in modo che tu possa adattarla alle tue esigenze specifiche.

Esempio di implementazione di PowerShell

Aggiornamento agosto 2013

Ho imparato qualcosa dal mio attuale cliente. Abbiamo i nostri laptop che sono uniti al dominio principale. Abbiamo account sulla rete AD del cliente. Ogni volta che ho bisogno di "fare" qualcosa nel mondo del cliente, devo avviare il mio processo e istruirlo per presentare le mie credenziali "estere". Ciò che lo rende possibile è RunAs . riferimento alternativo

Ho creato una suite di file batch che avviano tutti i processi di cui ho bisogno. Hanno la forma di

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

Ne ho uno per un prompt dei comandi (sopra), Visual Studio, SSMS, PowerShell, PowerShell ISE e alcune altre app speciali che devono funzionare con il loro dominio.

Utilizzando l'approccio runas, sono stato in grado di distribuire pacchetti utilizzando tutti i metodi precedenti (oltre a distribuire direttamente da un'istanza di Visual Studio eseguita con credenziali esterne).