none
¿Como automatizar un proceso ETL para que suba automaticamente data a traves de Visual Studio? RRS feed

  • Pregunta

  • Hola, actualmente en mi trabajo usamos el MS VS 2008, y usualmente trabajamos con una ETL para actualizar lso datos de una tabla en Oracle, nos gustaria encontrar la manera de subir los datos automaticamente (es decir, a tal dia a una cierta hora, por ejemplo) de modo que la tabla se actualice sola, queda claro que siempre hay una maquina que permanece trabajando siempre.

    Saludos

    jueves, 27 de diciembre de 2018 20:52

Respuestas

  • Un articulo interesante Miguel, en especial la creación del Proxy, es siempre una buena práctica (aunque conlleve un poco más de trabajo).  Para el despliegue del paquete ISPAC en lo personal prefiero el uso de PowerShell, pero como no he escrito un articulo aún explicando el tema :-) , creo que al usuario le resultara comodo usar tu propuesta del Integration Deployment Wizard.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    lunes, 31 de diciembre de 2018 11:43

Todas las respuestas

  • Supongo que el ETL estará hecho con SQL Server Integration services. Si es así,  los pasos son

    * Crear el catálogo en la máquina de destino

    * Desplegar el paquete en la máquina de destino

    * Crear un job que ejecute el paquete en la máquina de destino

    * Agendar ese paquete a las horas en las que quieras que se ejecute.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 28 de diciembre de 2018 7:23
    Moderador
  • Solo agregando un poco a la respuesta concisa de Miguel, para el despliegue del paquete SSIS, te recomiendo utilizar PowerShell, entre los muchos articulos que puedas encontrar al respecto, te recomiendo este que fue publicado en el sitio de Red-Gate.

    https://www.red-gate.com/simple-talk/sql/ssis/deploying-multiple-ssis-projects-via-powershell/


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    viernes, 28 de diciembre de 2018 10:09
  • Oh ya veo, existen otros programas para correrlo con schedule programado no? Hasta donde habia buscado, hay un metodo que me permite ahcer esto y es una funcion que esta integrada en el MS SQL Management, pero estuve intentando el dia de ayer y no corria a la hora programada. Probare con este PowerShell a ver que tal.

     
    viernes, 28 de diciembre de 2018 15:44
  • Efectivamente, es un SSI, estaba intentando crear un Job y programar el shcedule pero por alguna razon no lo corre desde ahi, sabes cual es la configuracion general que sirva para la amyoria de ETLs? Es decir, al insertarlo en los "steps"? Hay muchas opciones de configuracion ahi. 
    viernes, 28 de diciembre de 2018 15:47
  • Te posteo un ejemplo de un codigo TSQL en el que puedes configurar un JOB, es requerido que hayas desplegado previamente el paquete de SSIS

    DECLARE @job_name sysname = N'NombreJOB';
    DECLARE @job_description nvarchar(512) = N'Una breve descripcion aqui'
    
    DECLARE @step_name sysname = N'Descripcion de tu paso';
    DECLARE @schedule_name sysname = N'ETL - Tu SSIS';
    DECLARE @schedule_enabled bit = 0;
    DECLARE @schedule_active_start_time sysname = N'00000';
    DECLARE @schedule_active_end_time sysname = N'235959';
    
    DECLARE @ssis_server_name sysname = @@SERVERNAME;
    
    DECLARE @folder_name sysname = N'FolderSSIS';
    DECLARE @project_name sysname = N'Proyecto-ssis';
    DECLARE @package_name sysname = N'PaqueteSSIS.dtsx';
    DECLARE @environment_name sysname = N'ENV_Variables'
    DECLARE @environment_reference bigint = (
        SELECT reference_id
        FROM SSISDB.[catalog].folders AS f
            INNER JOIN SSISDB.[catalog].projects AS p ON p.folder_id = f.folder_id
            INNER JOIN SSISDB.[catalog].environments AS e ON e.folder_id = f.folder_id
            INNER JOIN SSISDB.[catalog].environment_references AS e_r
                ON e_r.project_id = p.project_id
                AND e_r.environment_folder_name = f.name
                AND e_r.environment_name = e.name
        WHERE f.name = @folder_name
            AND p.name = @project_name
            AND e.name = @environment_name);
    
    -- Drop and recreate job
    
    DECLARE @sql nvarchar(MAX) = CONCAT(N'
    BEGIN TRANSACTION
    IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N''', @job_name, ''')
        EXEC msdb.dbo.sp_delete_job @job_name = N''', @job_name, ''', @delete_unused_schedule = 1;
    
    DECLARE @ReturnCode INT
    SELECT @ReturnCode = 0
    IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N''[Uncategorized (Local)]'' AND category_class=1)
    BEGIN
    EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N''JOB'', @type=N''LOCAL'', @name=N''[Uncategorized (Local)]''
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    
    END
    
    DECLARE @jobId BINARY(16)
    EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N''', @job_name, ''', 
    		@enabled=1, 
    		@notify_level_eventlog=0, 
    		@notify_level_email=2, 
    		@notify_level_netsend=0, 
    		@notify_level_page=0, 
    		@delete_level=0, 
    		@description=N''', @job_description, ''', 
    		@category_name=N''[Uncategorized (Local)]'', 
    		@owner_login_name=N''sa'', 
    		@notify_email_operator_name=N''SQL Server DBA'', @job_id = @jobId OUTPUT
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback');
    
    -- Agregando el paso 1
    
    SET @sql = CONCAT(@sql, N'
    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N''Disable job if last n executions all failed'', 
    		@step_id=1, 
    		@cmdexec_success_code=0, 
    		@on_success_action=3, 
    		@on_success_step_id=0, 
    		@on_fail_action=2, 
    		@on_fail_step_id=0, 
    		@retry_attempts=0, 
    		@retry_interval=0, 
    		@os_run_priority=0, @subsystem=N''TSQL'', 
    		@command=N''-- Disable job if last n executions all failed
    
    SET NOCOUNT ON;
    
    DECLARE @NumberOfRunsToCheck int = 60;
    
    DECLARE @job_name sysname = (SELECT name FROM msdb.dbo.sysjobs WHERE job_id = $(ESCAPE_SQUOTE(JOBID)));
    DECLARE @job_id uniqueidentifier;
    DECLARE @CountRuns int = 0;
    DECLARE @RunsSucceeded int = 0;
    DECLARE @DisableMessage varchar(1000);
    
    SELECT @job_id = job_id
    FROM dbo.sysjobs
    WHERE name = @job_name
        AND [enabled] = 1;
    
    IF @job_id IS NOT NULL
    BEGIN
    
        WITH CTE_RecentRuns AS (
            SELECT TOP(@NumberOfRunsToCheck) instance_id, run_status
            FROM dbo.sysjobhistory
            WHERE job_id = @job_id
                AND step_id = 0
            ORDER BY instance_id DESC
            )
        SELECT
            @CountRuns = COUNT(*) 
            ,@RunsSucceeded = SUM(CASE WHEN run_status = 1 THEN 1 ELSE 0 END)
        FROM CTE_RecentRuns;
        
        IF @CountRuns = @NumberOfRunsToCheck
            AND @RunsSucceeded = 0
        BEGIN
            SET @DisableMessage = CONCAT(''''Job: '''', @job_name, ''''. Previous '''', @NumberOfRunsToCheck ,'''' executions all failed. Job disabled, please resolve and re-enable.'''');
            RAISERROR(@DisableMessage, 16, 1);
    
            EXECUTE dbo.sp_update_job @job_id = @job_id , @enabled = 0;
        END
    
    END
    '', 
    		@database_name=N''msdb'', 
    		@flags=0
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback');
    
    -- Add step 2
    
    SET @sql = CONCAT(@sql, N'
    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N''', @step_name, ''', 
    		@step_id=2, 
    		@cmdexec_success_code=0, 
    		@on_success_action=1, 
    		@on_success_step_id=0, 
    		@on_fail_action=2, 
    		@on_fail_step_id=0, 
    		@retry_attempts=0, 
    		@retry_interval=0, 
    		@os_run_priority=0, @subsystem=N''SSIS'', 
    		@command=N''/ISSERVER "\"\SSISDB\', @folder_name, '\', @project_name, '\', @package_name, '\"" /SERVER "\"', @ssis_server_name, '\"" /ENVREFERENCE ', @environment_reference, ' /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";0 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'', 
    		@database_name=N''master'', 
    		@flags=0, 
    		@proxy_name=N''SSISProxy''');
    
    -- Set start step
    
    SET @sql = CONCAT(@sql, N'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback');
    
    -- Add schedule
    
    SET @sql = CONCAT(@sql, N'
    EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N''', @schedule_name, ''', 
    		@enabled=', @schedule_enabled, ', 
    		@freq_type=4, 
    		@freq_interval=1, 
    		@freq_subday_type=4, 
    		@freq_subday_interval=1, 
    		@freq_relative_interval=0, 
    		@freq_recurrence_factor=0, 
    		@active_start_date=20151105, 
    		@active_end_date=99991231, 
    		@active_start_time=', @schedule_active_start_time, ', 
    		@active_end_time=', @schedule_active_end_time, '
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N''(local)''
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    COMMIT TRANSACTION
    GOTO EndSave
    QuitWithRollback:
        IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
    EndSave:
    ');
    
    EXEC sp_executesql @sql;


    "Oh, the wind, the wind is blowing<g class="gr_ gr_7 gr-alert gr_gramm gr_inline_cards gr_run_anim Style replaceWithoutSep" data-gr-id="7" id="7">,through</g> the <g class="gr_ gr_5 gr-alert gr_gramm gr_inline_cards gr_run_anim Punctuation only-ins replaceWithoutSep" data-gr-id="5" id="5">graves</g> the wind is blowing<g class="gr_ gr_8 gr-alert gr_gramm gr_inline_cards gr_run_anim Style replaceWithoutSep" data-gr-id="8" id="8">,Freedom</g> soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net


    viernes, 28 de diciembre de 2018 20:09
  • Cuando un paquete corre en el entorno de visual studio, pero lo programas y no corre e, 99.9% de las veces es por permisos, por seguridad

    Te recomiendo que crees un proxie para la ejecución. Voy a ver si posteo un artículo explicando todo esto un poco


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 31 de diciembre de 2018 8:12
    Moderador
  • mira este artículo que acabo de escribir, a ver si te aclara. ssis catalog

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 31 de diciembre de 2018 11:18
    Moderador
  • Un articulo interesante Miguel, en especial la creación del Proxy, es siempre una buena práctica (aunque conlleve un poco más de trabajo).  Para el despliegue del paquete ISPAC en lo personal prefiero el uso de PowerShell, pero como no he escrito un articulo aún explicando el tema :-) , creo que al usuario le resultara comodo usar tu propuesta del Integration Deployment Wizard.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    lunes, 31 de diciembre de 2018 11:43