Академический Документы
Профессиональный Документы
Культура Документы
La desaparición de los antiguos Paquetes DTS por la nueva ETL de Microsoft (los
Paquetes DTSX), SQL Server Integration Services (SSIS), ha sido uno de los cambios
más importantes en Microsoft SQL Server 2005, y dónde adquirimos una ventaja
competitiva frente a otros fabricantes de base de datos. En este Artículo, intentaremos
resolver las preguntas más frecuentes sobre Microsoft SQL Server Integration Services
(SSIS) para aquellos que se inician... y por supuesto, en Castellano !! (ante todo que se
entienda... jeje ;-)
• Manejar datos de Texto en los Flujos de Datos (Data Flows) de SQL Server
Integration Services (SSIS)
• ¿Cómo se puede en un Flujo de Datos (Data Flow) de SSIS insertar sólo las filas
nuevas?
• ¿Es posible alterar el esquema de una base de datos utilizada por un paquete de
SSIS?
• ¿Dónde guardar los ficheros DTSX de los paquetes de SSIS 2005?
• ¿Cuántas instancias del servicio Integration Services de SSIS 2005 pueden
existir en una única máquina?
• ¿Es posible instalar SSIS 2005 en Microsoft Cluster (MSCS)?
• ¿Es posible integrar ActiveX Scripts (ej: VBScript) en Paquetes DTSX de SSIS?
• ¿Es posible integrar Scripts con .Net Famework en Paquetes DTSX de SSIS?
• ¿De qué formas es posible ejecutar un Paquete DTSX de SSIS?
• ¿Por qué al intentar ejecutar un Paquete DTSX de SSIS se produce el error de
Error Loading y el Paquete DTSX no se ejecuta? ¿Para qué sirve la propiedad
ProtectionLevel?
• ¿Es posible especificar a un Paquete DTSX distintas configuraciones, en función
de en qué entorno o servidor se ejecute? ¿Cómo funcionan los Ficheros de
Configuraciones?
• ¿Para qué sirven las Variables y Expresiones en SSIS? ¿Cómo se utilizan?
• ¿Qué posibilidades de Registro (Logging) tienen los Paquetes DTSX de SSIS?
¿Cómo se utiliza?
• ¿Para qué sirven las Transacciones en SSIS? ¿Cómo trabajar con Transacciones
en SSIS?
• ¿Es posible ejecutar un Paquete DTSX en modo 32-bit sobre una máquina 64-bit
(arquitectura x64)? ¿Y si no tenemos Proveedores OLEDB o .Net de 64-bit?
¿Qué ventaja tiene ésto?
• ¿Qué permisos son necesarios para que los Programadores puedan guardar sus
Paquetes DTSX en MSDB? ¿Qué permisos son necesarios para poder crear,
editar y ejecutar un JOB del Agente de SQL Server para sus Paquetes DTSX?
• ¿Por qué no puedo ejecutar un Paquete DTSX en Business Intelligence
Development Studio (BIDS)? ¿Por qué está deshabilitado el botón Iniciar
Depuración (Start Debugging) y el botón Iniciar sin Depurar (Start without
Debugging)?
Manejar datos de Texto en los Flujos de Datos (Data
Flows) de SQL Server Integration Services (SSIS)
SQL Server Integration Services (SSIS) funciona como una pequeña base de datos, y
como tal, tiene sus propios tipos de datos. Estos tipos de datos, se infieren a su vez de
los tipos de datos existentes en los orígenes y destinos de datos (ficheros Microsoft
Excel, bases de datos Microsoft SQL Server, etc.). Es muy importante saber si
trabajamos con datos de tamaño fijo o con datos de tamaño variable. Esto es debido
a que muchas tareas, como por ejemplo Merge, Merge Join, Lookup, etc., al realizar
comparaciones entre dos valores, pueden producirse resultados no deseados. Así, si
estamos leyendo texto de Microsoft Excel, SSIS tomará por defecto valores UNICODE
de hasta 250 caracteres de longitud, pero al hacer un Merge Join con un campo
NCHAR(10) de Microsoft SQL Server podríamos obtener un resultado no deseado por
los caracteres blancos existentes a la derecha (sería necesario hacer un TRIM, por
ejemplo con una tarea Derived Column). En esta situación, no se tomaría como iguales
los valores del JOIN, y podríamos pensar que existe algún error o bug. No,
simplemente, así es la naturaleza de los datos de texto de tamaño fijo y de tamaño
variable.
• Utilizando la tarea Merge Join. Esta tarea permite realizar un Join entre dos
Flujos de datos de SSIS. A diferencia de la tarea Merge, Merge Join permite
realizar no sólo un INNER JOIN, sino también un LEFT OUTER JOIN o un
FULL OUTER JOIN.
La tarea Merge Join, y al igual que la tarea Merge, sólo tiene dos entradas (es
posible utilizar varias tareas Merge o Merge Join en cascada). Es requisito que
sus entradas estén ordenadas, para lo cual, se suele utiliza tareas Sort.
Aquí existe un problema: la tarea Lookup por defecto, sólo funciona si para cada
fila encuentra otra fila en la tabla de búsqueda. En caso contrario se produce el
error "Row yielded no match during lookup". Por lo tanto, no podríamos
utilizar la tarea Lookup para nuestros fines.
Sin embargo, en otras ocasiones nos podemos encontrar con el siguiente error:
Para solucionarlo, click OK sobre dicho diálogo. Después, volvemos a editar el origen
de datos, seleccionamos la pestaña Columns, deseleccionamos la nueva Columna, y
click OK para cerrar el diálogo editor del origen de datos.
Otros cambios, como por ejemplo alterar una columna VARCHAR a INT en un
destino de datos, puede provocar un error en tiempo de ejecución, y adicionalmente, al
intentar modificar el correspondiente paquete DTSX, nos encontraremos con la
advertencia producida por la falta de sincronización entre el esquema de la base de datos
y los metadatos del paquete DTSX de SSIS.
Como vemos, para el servicio Integration Services sólo podemos elegir entre las
opciones Package Store y SQL Server (MSDB). Por el contrario, con BIDS sólo
podemos trabajar sobre File System.
Es posible cambiar la Instancia de SQL Server (base de datos MSDB) utilizada por
SSIS 2005 (por defecto se utiliza la instancia por defecto), una situación típica en caso
de tener en un mismo servidor múltiples instancias de SQL Server. Del mismo modo,
también es posible cambiar la ruta del Package Store utilizada por SSIS 2005, por
ejemplo, si queremos utilizar un disco diferente del empleado en la instalación de
producto. Para realizar estas configuraciones es necesario modificar el fichero de
configuración de SSIS 2005 (MsDtsSrvr.ini.xml), que por defecto es C:\Program
Files\Microsoft SQL Server\90\DTS\Binn\MsDtsSrvr.ini.xml.
<DtsServiceConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<StopExecutingPackagesOnShutdown>true</StopExecutingPackagesOnShutdown>
<TopLevelFolders>
<Folder xsi:type="SqlServerFolder">
<Name>MSDB</Name>
<ServerName>.</ServerName>
</Folder>
<Folder xsi:type="FileSystemFolder">
<Name>File System</Name>
<StorePath>..\Packages</StorePath>
</Folder>
<Folder xsi:type="FileSystemFolder">
<Name>File System Alternativo</Name>
<StorePath>..\Packages_Alternativo</StorePath>
</Folder>
</TopLevelFolders>
</DtsServiceConfiguration>
Habitualmente, resulta muy útil poder acceder a variables del Paquete DTSX desde el
ActiveX Script, para lo cual, utilizaremos la colección DTSGlobalVariables, pudiendo
especificar qué variable deseamos acceder, como por ejemplo
DTSGlobalVariables("MiVariable").Value. De este modo, podemos leer el
contenido de una variable del Paquete DTSX, o bien establecer un valor a dicha
variable.
Function Main()
MsgBox(DTSGlobalVariables("MiVariable").Value)
End Function
Dentro del Control Flow de un Paquete DTSX podemos utilizar una tarea de tipo Script
Task, en la cual deberemos especificar habitualmente las siguientes propiedades:
Algo muy habitual dentro de un Paquete DTSX es acceder a las variables del paquete.
Además de utilizar las propiedades ReadOnlyVariables y ReadWriteVariables para
especificar a qué variables deseamos acceder, desde nuestro código podemos utilizar la
colección Dts.Variables para acceder a las variables del Paquete DTSX, como por
ejemplo Dts.Variables("MiVariable").Value.
También puede resultar interesante lanzar o forzar un error (raise error), por ejemplo
ejecutando Dts.Events.FireError(0, "Comprobando Fecha de la Excel y Fecha del
Nombre del Fichero", "Las fechas no coinciden", "", 0).
Como conclusión, tenemos varias maneras de ejecutar nuestros Paquetes DTSX, y para
gustos, hay colores. Yo personalmente desarrollo con BIDS (evidentemente) y prefiero
ejecutar los Paquetes DTSX con el Agente de SQL Server y dejarlos almacenados en
SQL Server (es decir, en MSDB).
You may not be authorized to access this information. This error occurs when
there is a cryptographic error. Verify that the correct key is available.
Como vemos, los únicos tipos de configuraciones que permiten almacenar valores para
múltiples propiedades, son los Ficheros de Configuración XML y SQL Server. El resto
de tipos, requiere utilizar múltiples configuraciones para poder establecer valores a
múltiples propiedades.
Existe otro detalle de suma importancia. Al margen del tipo de configuración elegido,
existen dos métodos para especificar la ubicación de la configuración:
Sin embargo, ¿Cómo se puede establecer una variable de entorno?. La forma más
sencilla, es hacer click con el botón derecho sobre Mi PC (My Computer), y después
click en la opción Propiedades (Properties) del menú contextual. Seguidamente, en el
diálogo Propiedades del Sistema (System Properties), seleccionamos la pestaña
Opciones avanzadas (Advanced), y click sobre el botón Variables de Entorno
(Environment Variables). En el diálogo Variables de Entorno (Environment Variables)
agregaremos o modificaremos la variable de entorno del sistema que deseamos, ya
que si utilizamos una variable de entorno de usuario, si ejecutamos el Paquete DTSX
con un usuario distinto al usuario contextual, dicho usuario no tendrá visibilidad sobre
la variable de entorno.
Se puede distinguir entre Variables definidas por el usuario (las que creamos nosotros
mismos en nuestros Paquetes DTSX) y Variables del Sistema (ya vienen incorporadas,
y sólo se pueden leer o especificar un evento que salte cuando cambien de valor). Los
nombres de Variables son susceptibles de mayúsculas y minúsculas.
Las Variables de SSIS también tienen ámbito. Así, se pueden crear en el ámbito de un
Paquete DTSX (como si se tratase de una variable global), o en el ámbito de un
contenedor, tarea o controlador de evento.
Resulta especialmente útil, asignar a Propiedades el valor de las Variables, de tal modo,
que a través de Ficheros de Configuración XML (o a través de otros tipos de
configuraciones: Entradas de Registro, Variables de Entorno, etc.) se pueda establecer el
valor de las Variables, y en consecuencia de las Propiedades. Esto es muy cómodo, ya
que en caso de utilizar un mismo valor en varios sitios, es suficiente con asignar a la
Varible una Configuración, y asignar la Variable a las Propiedades que la
necesiten. Sin embargo, esta técnica no siempre nos será de utilidad. Por ejemplo, no se
puede asignar una Expresión (ej: una Variable) a la Propiedad Password de una
conexión de base de datos, al tratarse de un dato sensible. En este caso, sólo se podrá
asignar directamente el valor de la Configuración.
Además, existen varias tareas que requieren utilizar Expresiones y/o Variables para
su funcionamiento, como son:
Llegados a este punto, ya podemos tener una idea de la importancia y la utilidad de las
Variables y de las Expresiones en los Paquetes DTSX de SSIS. Ahora queda dar una
pincelada práctica al asunto.
¿Cómo se puede crear una Variable en ámbito del Paquete DTSX?. En el menú
SSIS de BIDS, seleccionaremos la opción Variables, con lo que se mostrará la ventana
de Variables. A continuación, abrir el Paquete DTSX deseado y hacer click sobre el
fondo o tapiz del Flujo de Control (Control Flow). Ahora, en la ventana de Variables
podemos ver, crear, modificar, eliminar, etc., las Variables de ámbito de Paquete.
Podemos seleccionar todos aquellos eventos que necesitemos, existiendo los que a
continuación se enumeran:
• OnError.
• OnExecStatusChanged.
• OnInformation.
• OnPipelinePostEndOfRowset.
• OnPipelinePostPrimeOutput.
• OnPipelinePreEndOfRowset.
• OnPipelinePrePrimeOutput.
• OnPipelineRowsSent.
• OnPostExecute.
• OnPostValidate.
• OnPreExecute.
• OnPreValidate.
• OnProgress.
• OnQueryCancel.
• OnTaskFailed.
• OnVariableValueChanged.
• OnWarning.
• Diagnostic.
Así, para cada Evento podemos seleccionar qué campos deseamos que queden
registrados. Por defecto, serán todos los campos, pudiendo elegir entre:
• Computer.
• Operator.
• SourceName.
• SourceID.
• ExecutionID.
• MessageText.
• DataBytes.
• Proveedor de registro SSIS para archivos de texto. Destaca por ser el método
más sencillo, fácil de explorar, y fácil de manipular si posteriormente se desea
cargar en una base de datos SQL Server, por poner un ejemplo. Utiliza un
formato de fichero ASCII separado por comas (CSV).
• Proveedor de registro SSIS para el Analizador de SQL Server. Permite
generar ficheros para abrirlo posteriormente con la herramienta Analizador de
SQL Server (SQL Server Profiler).
• Proveedor de registro SSIS para SQL Server. Permite almacenar la
información en SQL Server, lo cual, tiene varias ventajas: primero, que permite
poder consultar la información aprovechando la potencia de Transact-SQL,
y segundo, que es posile la descarga desde MSDN de un Pack de informes de
Reporting Services. Otra ventaja, es que utilizar una base de datos SQL Server
es un método ideal como repositorio compartido de información para su consulta
por distintos usuarios. Utiliza la tabla sysdtslog90, de tal modo, que si la tabla
no existe en la base de datos especificada, la crea automáticamente (no es
necesario crearla manualmente).
• Proveedor de registro SSIS para el Registro de sucesos de Windows. En
entornos de producción críticos, puede resultar de especial interés registrar la
información de ejecución de los Paqutes DTSX en el Registro de sucesos de
Windows.
• Proveedor de registro SSIS para archivos XML. Tiene prácticamente las
mismas ventajas de los archivos de texto, y además, la ventaja adicional de
poder utilizar XSL Transformations (XSLT) para visualizar el Registro de
Paquetes DTSX como si fuese una página Web.
Utiliza el servicio DTC, por lo cual, el servicio DTC debe estar disponible para la
correcta ejecución del Paquete DTSX. En caso de que no esté disponible, se producirá
el siguiente error:
Error: 0xC001401A at Data Flow Task: The SSIS Runtime has failed to start the
distributed transaction due to error 0x8004D01B "The Transaction Manager is not
available.". The DTC transaction failed to start. This could occur because the MSDTC
Service is not running.
• Required. El Paquete, Contenedor y/o Tarea inicia una nueva transacción, salvo
en el caso de que el componente principal ya haya iniciado una transacción, en
cuyo caso de juntará con la transacción del componente principal.
• Supported. El Paquete, Contenedor y/o Tarea nunca inicia una nueva
transacción. Tan sólo se puede juntar con la transacción del componente
principal (si fue iniciada).
• NotSupported. El Paquete, Contenedor y/o Tarea nunca inicia una nueva
transacción, y nunca se junta o combina con una transacción existente.
Es importante tener en cuenta que el valor por defecto de la propiedad
TransactionOption es Supported.
Así, existen distintas configuraciones posibles, que a fin de cuentas, dependen como se
configure la opción TransactionOption en los Paquetes DTSX y en sus componentes o
tareas (puede verse como una jerarquía). Las más típicas son las siguientes:
Debido a que los Paquetes DTSX pueden incluir a su vez tareas Execute Package para
ejecutar otros Paquetes DTSX secundarios, es posible utilizar otras configuraciones
como por ejemplo, usar múltiples Paquetes DTSX y un única Transacción (es necesario,
que exista un Paquete DTSX principal con el valor Required de la propiedad
TransactionOption, y que dicho Paquete DTSX utilice tareas Execute Package).
Dicho esto, la realidad es que las Transacciones DTC son una solución excepcional, ya
que para aprovechar su funcionalidad, tan sólo será suficiente con establecer a Required
la propiedad TransactionOption del Paquete (o de la Tarea deseada) y listo. Además, es
la única forma de aportar trasaccionalidad a las tareas de tipo Data Flow.
De hecho, en las ocasiones que me he encontrado éste error, con quitar el soporte de
Transacciones DTC, problema solucionado.
Utiliza las capacidades nativas de las Transacciones de SQL Server. Tiene la ventaja de
ser la solución de transaccionalidad más ligera, pero tiene varios inconvenientes:
Para su configuración, todas las tareas de la misma transacción deben utilizar la misma
conexión (es decir, el mismo Connection Manager), y se debe establecer la propiedad
RetainSameConnection de la conexión utilizada (perdón… del Conection Manager) al
valor True en las tareas de la misma transacción.
El principal problema de utilizar diferentes arquitecturas (ej: x86 y x64) impacta en que
no todo el software y no todos los drivers (ej: Drivers ODBC, Proveedores
OLEDB, Proveedores .Net, etc.) están disponibles tanto en x86 (32-bit) como en
x64 (64-bit), y mucho menos aún para Itanium. Un ejemplo significativo es el
Proveedor MSDASQL, que se trata del Proveedor OLEDB que hace de puente con
ODBC, es decir, a través de él podemos acceder a orígenes de datos ODBC desde
OLEDB. Este Proveedor OLEDB es quizás uno de los Proveedores OLEDB más
utilizados, sin embargo, resulta que sólo estaba disponible en 32-bit (x86). De hecho,
Microsoft no tenía intención de darle continuidad en 64-bit, sin embargo, en respuesta a
las múltiples solicitudes de los usuarios, finalmente accedió y desde Abril de 2008 está
disponible para descarga gratuita el Proveedor MSDASQL de 64-bit (tanto para x64
como para Itanium - IA64). ¿Y hasta Abril 2008 que podíamos haber hecho para sacar
adelante nuestros desarrollos?
Para más información sobre el Proveedor MSDASQL puede visitarse el artículo ¿Como
consultar un origen de datos ODBC (DSN) desde SQL Server 2005 64-bit a través
de OPENROWSET u OPENQUERY + Servidor Vinculado (Proveedor
MSDASQL 64-bit)?.
Bien, con este ejemplo creo que ya estamos en situación. Es decir, en una máquina x64
puede ejecutarse código x64 (código 64-bit) y código x86 (código de 32-bit, que
realmente se ejecuta emulado en lo que se denomina WoW: Windows-on-Windows).
De este modo:
• Un proceso de 64-bit puede utilizar sólo y exclusivamente las conectividades
(OLEDB, ODBC, .Net, etc.) de 64-bit. Por lo cual, si tenemos un Paquete
DTSX y lo ejecutamos en 64-bit, tenemos una dependencia directa con la
disponibilidad de los drivers 64-bit necesarios, para que el Paquete DTSX pueda
ejecutarse con éxito.
• Un proceso de 32-bit puede utilizar sólo y exclusivamente las conectividades
(OLEDB, ODBC, .Net, etc.) de 32-bit. Por lo cual, si tenemos un Paquete
DTSX y lo ejecutamos en 32-bit, tenemos una dependencia directa con la
disponibilidad de los drivers 32-bit necesarios, para que el Paquete DTSX pueda
ejecutarse con éxito. Bueno... realmente, esto no es problema, ya que en 32-bit
(x86) suele estar disponible todo.
Lo primero de todo, debemos tener en cuenta que las utilidades dtexec.exe, dtutil.exe y
DTSWizard.exe (el asistente de importación y exportación), sobre una máquina x64
están disponibles tanto en 64-bit como en 32-bit. Eso si, la versión 64-bit la
encontraremos dentro del directorio Program Files mientras que la versión 32-bit la
encontraremos dentro del directorio Program Files (x86). En consecuencia, podremos
ejecutar la versión de 32-bit o de 64-bit, según nos interese, para lo cual será
suficiente ejecutar el ejecutable correspondiente (el de 32-bit o el de 64-bit).
Por ello, en la planificación de JOBs con el Agente de SQL Server para ejecutar
Paquetes DTSX en 32-bit sobre máquinas x64 (64-bit), si tenemos SQL Server 2005
64-bit (x64) instalado, el Agente de SQL Server será un proceso 64-bit, y por lo tanto,
un JOB del Agente de SQL Server con un paso del tipo SQL Server Integration Services
Package, ejecutará el Paquete DTSX en 64-bit.
Sin embargo tenemos dos alternativas con las que podemos jugar:
• ¿Qué permisos son necesarios para que un desarrollador pueda guardar, ejecutar,
etc. un Paquete DTSX en MSDB? ¿Cómo asignar dichos permisos?
• ¿Qué permisos son necesarios para que un desarrollador pueda crear, editar y
ejecutar JOBs del Agente de SQL Server para sus Paquetes DTSX? ¿Cómo
asignar dichos permisos?
En ambos casos será necesario utilizar funciones de base de datos del sistema en
MSDB (es decir, roles de base de datos - fixed database roles - ... vamos, que son
grupos).
Del mismo modo, para conceder permisos para la creación, edición y ejecución de JOBs
con el Agente de SQL Server, están disponibles las siguientes funciones de base de
datos en MSDB:
Dicho ésto, lo único recordar que para poder hacer miembro de estas funciones de base
de datos del sistema (de MSDB) a un usuario, es necesario crear un usuario de base
de datos en MSDB para los inicios de sesión a los que deseamos conceder dichos
permisos. Cara a crear un usuario de base de datos, es importante recordar que si
utilizamos un Inicio de Sesión para un Grupo de Directorio Activo, es posible crear
un usuario de base de datos para un Usuario de Directorio Activo en particular
miembro de dicho Grupo, eso sí, deberemos hacer ejecutando la correspondiente
sentencia CREATE USER ... FOR LOGIN (de forma gráfica, desde SQL Server
Management Studio, no podremos... sólo a través de Transact-SQL con CREATE
USER).
Bueno, vamos por partes (dijo Jack). Primero, no se denomina botón de ejecutar (F5) ya
que en Business Intelligence Development Studio (BIDS) el botón que utilizamos para
ejecutar, se denomina Iniciar Depuración (Start Debugging). En cualquier caso, jode
lo mismo cuando el botón Iniciar Depuración está deshabilitado, y no sabemos por qué.
En fin, un tema la mar de sencillo, pero al menos a mí, la primera vez que me ocurrió
me quedé patidifuso ;-) Espero que os sirva.