none
Permiso Insert Integration Service RRS feed

  • Pregunta

  • Buenas Noches,

    Estoy intentando crear un cubo que me permita cargar un excel, PERO, no me dan permiso para realizar un INSERT por ende no puede realizar lo tradicional en integration service.

    Cual sera la solucion? Llenarlo utilizando visual basic? si es asi seria lentisimo, espero respuestas, gracias.

     

    Saludos,

    Hans.

    martes, 25 de enero de 2011 0:40

Respuestas

  • Hola.

    Creo que con esta ya son tres las veces que te lo digo, pero lo repetiré una vez más: no tienes permisos, no podrás hacer la inserción, no es un problema de Integration Services.

    Así, lo más fácil sería que te otorgaran permisos de inserción. Si no, se podría dar un rodeo, sólo en el caso de que prepararas un procedimiento almacenado, te lo creara un usuario con permisos y luego te otorgara permisos para ejecutarlo. Comento lo del procedimiento almacenado porque parece que crees que es la vía de solucionar este caso, cuando el problema lo tienes en los permisos. Un procedimiento almacenado que reciba como parámetros los campos de la tabla y haga la inserción es una cuestión de 3 minutos, sin la menor dificultad (aunque sería lento y costoso de desarrollar la programación para llamarlo, como ya te han comentado).

    Ahora bien, a poco coherente que sea ese DBA, si no te da permisos de inserción, no te va a crear el procedimiento almacenado ni a otorgarte permisos para ejecutarlo.

    Así que podemos estar hablando de esto el tiempo que quieras, seguirá siendo un problema de permisos que no vas a resolver con un procedimiento almacenado.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 8:49
    Moderador
  • Muy buenas,

    Alberto... :) i know. La pregunta era retórica. Lo que quiere hacer es la forma menos ortodoxa que he visto de utilizar SSIS, pero si ese es su escenario... habrá que echarle una mano.

    Hans,

    Según te venimos comentando,

    1) crea una variable de ambito global del paquete (btn izquierdo sobre el el diseñador de flujo de control, variables), de tipo Object.

    2) Diseña el ETL como lo harías si pudieras hacer INSERT. Utiliza un DFT para leer los datos y transformarlos si fuera el caso, pero en lugar de dirigir el resultado a tu DB, utiliza un DataReader destination. Necesitas asignar el resutlado a una variable... ya sabes que hacer con la del punto 1, el resultado es like un dataset en memoria

    3) En el control flow, agrega un ForEach y de tipo ADO Enumerator y selecciona la variable del punto 1. (sección collection)

    ¿Que hace esto? leer cada uno de las filas que exista en el recordset.

    ¿Cómo accedes a los campos de cada fila? Repite la operación del punto 1, pero posicionado en el Foreach (restringe el ámbito a ese contenedor). Create una variable por cada campo que tengas en la filas, con el mismo tipo de dato.

    Ve a la sección Variable Mappings del editor del Foreach y mapea las variables con las columnas que hay en cada fila. OJO, aqui no verás el nombre de las columnas, tienes que saber el orden para asignar correctamente la variable.

    4) Dentro de ese ForEach agregas un ExecuteSQL, dónde podrás llamar a tu procedimiento almacenado pasandole como parámetros las variables que anteriormente has recogido. Este ExecuteSQL se ejecutará tantas veces como filas tengas en el recordset (variable object del punto 1).

    Ya nos dices como te va....


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    jueves, 10 de febrero de 2011 15:16

Todas las respuestas

  • Hola Hans,

    Existen métodos para rellenar un cubo sin tener un datawarehouse que lo sustente, o casi. Es necesario al menos que te crees una estructura de tablas que conformen el modelo dimensional (tablas de hechos y dimensiones). Puedes utilizar el método PUSH para rellenar y procesar los cubos, desde memoria y utilizando SSIS. Los componentes para esto son los destinos (dentro del DFT) Partition Processing (para rellenar y procesar hechos/particiones del cubo) y Dimension Processing (para las dimensiones).

    Si necesitas más ayuda comentalo. Te recomiendo que consultes la MSDN sobre el comportamiento de estos componentes.


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    martes, 25 de enero de 2011 8:24
  • Si porfa, la verdad no entiendo bien como funciona el metodo push. Mira lo que yo quiero hacer es llenar una tabla con integration service pero no tengo el permiso para hacer la sentencia sql "INSERT ni UPDATE" y se me complica.
    jueves, 27 de enero de 2011 3:16
  • Hola.

    Por favor, explica en detalle qué es lo que quieres hacer, cuál es el origen de los datos y cuál es el destino (parece ser que un fichero Excel) y acláranos la cuestión de los permisos también.

    No existen los permisos dentro de Integration Services, los debes gestionar para cada origen y destino. 

    Por otra parte, para consultar datos OLAP desde Excel no es necesaria la intervención de Integration Services.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 27 de enero de 2011 7:22
    Moderador
  • Si porfa, la verdad no entiendo bien como funciona el metodo push. Mira lo que yo quiero hacer es llenar una tabla con integration service pero no tengo el permiso para hacer la sentencia sql "INSERT ni UPDATE" y se me complica.

    No puedes agregar datos a una tabla sin hacer insert... ¿puedes hacer bulk insert? ¿no puedes utilizar otra cuenta para ejecutar el proceso?
    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    jueves, 27 de enero de 2011 13:04
  • El origen de datos es un excel y el destino una tabla en una base de datos cuyo usuario no me permite hacer insert ni bulk insert. Me parece que lo unico que puedo hacer es crear un programita para q me carge ese excel!!

    viernes, 28 de enero de 2011 3:31
  • Hola.

    Si desde SSIS no puedes por una cuestión de permisos, desde ninguna otra aplicación podrás. ¿Qué es lo que lo impide? ¿A qué te refieres con que el usuario no te lo permite? No sé, parece un sinsentido que te pidan cargar un Excel en una tabla y a la vez te impidan hacerlo.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 28 de enero de 2011 7:59
    Moderador
  • No existe ninguna otra instrucción que te permita introducir valores en una tabla. Aunque desarrolles una aplicación para ello, acabará intentando hacer un  insert.

     


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    viernes, 28 de enero de 2011 8:01
  • El usuario de La base de datos donde quiero llenar la tabla no tiene permiso para hacer INSERT, UPDATE y DELETE. Tan solo me permite hacer SELECT y crear procedure. Ahora por logica dentro del procedure si le puedo meter cualquier sentencia de insercion, modificacion o eliminacion.

    El tema es que en integration service internamente al enlazar un excel source con un destino de tabla de base de datos internamente hace INSERT entonces por consiguiente me sale error. Es por eso que Se me complica un poco llenar la tabla, probare con bulk insert.

    No se si me explique bien!!

     

    Saludos,

     

     

    lunes, 31 de enero de 2011 1:32
  • Hola.

    Insisto, si no tienes permisos para insertar en la tabla, no podrás insertar de ninguna de las maneras que te lo propongas (salvo que cambies de usuario o te den permisos), ni con Integration Services ni con un procedimiento almacenado. Y podrás crear un procedimiento que realice la inserción (curioso que no puedas insertar, pero sí crear objetos), pero no podrás ejecutarlo. Sería una elevación de permisos.

    Insisto también en lo extraño que resulta que te pidan que insertes en una tabla cuando no tienes permisos para ello.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    lunes, 31 de enero de 2011 9:25
    Moderador
  • Hola.

    ¿Avanzaste algo con el problema?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    sábado, 5 de febrero de 2011 14:55
    Moderador
  • Cro q no me explico bien. Yo no administro la base de datos, sino me dieron un usuario el cual no me deja ejecutar la sentencia INSERT.

    The INSERT permission was denied on the object 'TABLA', database 'ps000db', schema 'dbo'.

     La unica forma de ejecutar un insert es dentro de un procedure .

    martes, 8 de febrero de 2011 4:26
  • Buenas, ¿Cuales son los parámetros de entrada? Básicamente, diseñas un paquete que lea los datos desde excel y como destino utilizas un dataset (DataReader destination), que guarda en una variable tipo object. Esto dentro de un DataFlow task. Insertando en el flujo de control un forEach podras recorrerlo el dataset y ejecutar el procedimiento almacenado con parámetros, los de la fila actual del dataset. Es muy poco optimo hacer inserciones fila a fila. saludos
    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    martes, 8 de febrero de 2011 8:10
  • Para completar el Asistente para importación y exportación de SQL Server correctamente, se debe disponer como mínimo de los siguientes permisos:

    • Permisos para conectarse a las bases de datos o recursos compartidos de archivos de origen y de destino. Para ello, en Integration Services se requieren derechos de inicio de sesión del servidor y de la base de datos.

    • Permiso para leer datos de la base de datos o el archivo de origen. Para ello, en SQL Server se requieren permisos SELECT para las tablas y vistas de origen.

    • Permisos para escribir datos en la base de datos o el archivo de destino. Para ello, en SQL Server se requieren permisos INSERT para las tablas de destino.

    • Si se desea crear una base de datos o tabla de destino, o un archivo de destino, se requieren permisos suficientes para crear una base de datos, una tabla o un archivo. Para ello, en SQL Server se requieren permisos CREATE DATABASE o CREATE TABLE.

    • Para guardar el paquete creado con el asistente, se requieren permisos suficientes para escribir en la base de datos msdb o en el sistema de archivos. En Integration Services esto requiere la posesión de permisos INSERT para la base de datos msdb.

    jueves, 10 de febrero de 2011 3:31
  • Buenas, ¿Cuales son los parámetros de entrada? Básicamente, diseñas un paquete que lea los datos desde excel y como destino utilizas un dataset (DataReader destination), que guarda en una variable tipo object. Esto dentro de un DataFlow task. Insertando en el flujo de control un forEach podras recorrerlo el dataset y ejecutar el procedimiento almacenado con parámetros, los de la fila actual del dataset. Es muy poco optimo hacer inserciones fila a fila. saludos
    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky


    Correcto victor, pero no tengo de otra. Podrias ayudarme hacer el insert ejecutando procedimiento con parametros. Te agradeceria si me envias un ejemplo.

     

    Gracias,

     

    jueves, 10 de febrero de 2011 3:32
  • Hola.

    Creo que con esta ya son tres las veces que te lo digo, pero lo repetiré una vez más: no tienes permisos, no podrás hacer la inserción, no es un problema de Integration Services.

    Así, lo más fácil sería que te otorgaran permisos de inserción. Si no, se podría dar un rodeo, sólo en el caso de que prepararas un procedimiento almacenado, te lo creara un usuario con permisos y luego te otorgara permisos para ejecutarlo. Comento lo del procedimiento almacenado porque parece que crees que es la vía de solucionar este caso, cuando el problema lo tienes en los permisos. Un procedimiento almacenado que reciba como parámetros los campos de la tabla y haga la inserción es una cuestión de 3 minutos, sin la menor dificultad (aunque sería lento y costoso de desarrollar la programación para llamarlo, como ya te han comentado).

    Ahora bien, a poco coherente que sea ese DBA, si no te da permisos de inserción, no te va a crear el procedimiento almacenado ni a otorgarte permisos para ejecutarlo.

    Así que podemos estar hablando de esto el tiempo que quieras, seguirá siendo un problema de permisos que no vas a resolver con un procedimiento almacenado.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 8:49
    Moderador
  • Buenos a todos...

    Hans, parece que si tienes GRANT sobre el SP, sino como bien comenta Alberto sería imposible insertar nada.

    Pues para diseñar un paquete que utilice el procedimiento para el que tienes permisos y que a su vez hace un insert, tienes que tener claro cúales son los parámetros de entrada? Podrías copiarnos la llamada al SP? consulta con el DBA si no los conoces. Antes de seguir con el hilo asegurate de que efectivamente tienes permisos sobre el procedimiento almacenado que a realiza inserts.

    Alberto, ¿es posible que el procedimiento almacenado contenga lógica de negocio que requiera comprobar antes de insertar los datos? La verdad que el escenario no es muy usual....

    Saludos,


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    jueves, 10 de febrero de 2011 9:19
  • Hola.

    Víctor, sí, de hecho es muy habitual realizar comprobaciones sobre los datos antes de insertar. Lo típico, verificar que los datos no existan ya o que las claves foráneas sean válidas. Eso permite evitar que salte el error que daría por integridad referencial o clave duplicada, que son más difíciles de gestionar. Lo típico es usar un bloque "if exists":

    if exists (select Id from MiTabla where email = @pEmail)
     -- si existe actualizo
     update MiTabla set Campo = @pCampo where email = @pEmail
    else -- si no existe lo inserto
     insert MiTabla (Email, Campo) values (Email, Campo)
    
    En cuestiones de ETL, no suele ir por esta vía, sino por la de aglutinar todo y luego dividir el flujo entre lo que existe, para actualizarlo, y lo que no, para insertarlo, mediante un conditional split.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 14:37
    Moderador
  • Muy buenas,

    Alberto... :) i know. La pregunta era retórica. Lo que quiere hacer es la forma menos ortodoxa que he visto de utilizar SSIS, pero si ese es su escenario... habrá que echarle una mano.

    Hans,

    Según te venimos comentando,

    1) crea una variable de ambito global del paquete (btn izquierdo sobre el el diseñador de flujo de control, variables), de tipo Object.

    2) Diseña el ETL como lo harías si pudieras hacer INSERT. Utiliza un DFT para leer los datos y transformarlos si fuera el caso, pero en lugar de dirigir el resultado a tu DB, utiliza un DataReader destination. Necesitas asignar el resutlado a una variable... ya sabes que hacer con la del punto 1, el resultado es like un dataset en memoria

    3) En el control flow, agrega un ForEach y de tipo ADO Enumerator y selecciona la variable del punto 1. (sección collection)

    ¿Que hace esto? leer cada uno de las filas que exista en el recordset.

    ¿Cómo accedes a los campos de cada fila? Repite la operación del punto 1, pero posicionado en el Foreach (restringe el ámbito a ese contenedor). Create una variable por cada campo que tengas en la filas, con el mismo tipo de dato.

    Ve a la sección Variable Mappings del editor del Foreach y mapea las variables con las columnas que hay en cada fila. OJO, aqui no verás el nombre de las columnas, tienes que saber el orden para asignar correctamente la variable.

    4) Dentro de ese ForEach agregas un ExecuteSQL, dónde podrás llamar a tu procedimiento almacenado pasandole como parámetros las variables que anteriormente has recogido. Este ExecuteSQL se ejecutará tantas veces como filas tengas en el recordset (variable object del punto 1).

    Ya nos dices como te va....


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    jueves, 10 de febrero de 2011 15:16
  • Jaa! despues de tanta gestion me dieron los permisos de insert, pero igual vale... aprendi a hacerlo por procedimientos almacenados.

     

    gracias totales...

    sábado, 12 de febrero de 2011 2:28
  • Hola.

    Victor, mis disculpas, ni me paré a pensar que estuvieras siendo irónico.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    sábado, 12 de febrero de 2011 16:54
    Moderador
  • Muy buenas,

    Alberto... :) i know. La pregunta era retórica. Lo que quiere hacer es la forma menos ortodoxa que he visto de utilizar SSIS, pero si ese es su escenario... habrá que echarle una mano.

    Hans,

    Según te venimos comentando,

    1) crea una variable de ambito global del paquete (btn izquierdo sobre el el diseñador de flujo de control, variables), de tipo Object.

    2) Diseña el ETL como lo harías si pudieras hacer INSERT. Utiliza un DFT para leer los datos y transformarlos si fuera el caso, pero en lugar de dirigir el resultado a tu DB, utiliza un DataReader destination. Necesitas asignar el resutlado a una variable... ya sabes que hacer con la del punto 1, el resultado es like un dataset en memoria

    3) En el control flow, agrega un ForEach y de tipo ADO Enumerator y selecciona la variable del punto 1. (sección collection)

    ¿Que hace esto? leer cada uno de las filas que exista en el recordset.

    ¿Cómo accedes a los campos de cada fila? Repite la operación del punto 1, pero posicionado en el Foreach (restringe el ámbito a ese contenedor). Create una variable por cada campo que tengas en la filas, con el mismo tipo de dato.

    Ve a la sección Variable Mappings del editor del Foreach y mapea las variables con las columnas que hay en cada fila. OJO, aqui no verás el nombre de las columnas, tienes que saber el orden para asignar correctamente la variable.

    4) Dentro de ese ForEach agregas un ExecuteSQL, dónde podrás llamar a tu procedimiento almacenado pasandole como parámetros las variables que anteriormente has recogido. Este ExecuteSQL se ejecutará tantas veces como filas tengas en el recordset (variable object del punto 1).

    Ya nos dices como te va....


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky


    Por curiosidad, a que te refieres en este punto:

    2) Diseña el ETL como lo harías si pudieras hacer INSERT. Utiliza un DFT para leer los datos y transformarlos si fuera el caso, pero en lugar de dirigir el resultado a tu DB, utiliza un DataReader destination. Necesitas asignar el resutlado a una variable... ya sabes que hacer con la del punto 1, el resultado es like un dataset en memoria

    Lo que hize fue crear un data flow- dentro un excel source apuntando a un datareader destination. De ahi como asigno mi variable global?

    domingo, 13 de febrero de 2011 4:10
  • Hola,

    Hans... la variable global es la que debes asignar al DataReader Destination para almacenar el resultado. La creaste en el paso 1.


    Víctor M. Sánchez García (ES) (BI) Hope this help. Please vote if you find this posting was helpful. if this is an answer to your question, please mark it. http://bifase.blogspot.com | http://twitter.com/atharky
    lunes, 14 de febrero de 2011 12:42
  • Listo era con un recordset destination.
    • Editado hguevara martes, 15 de febrero de 2011 15:32 Solucionado
    lunes, 14 de febrero de 2011 19:26