locked
Permisos en vista hacia otra tabla RRS feed

  • Pregunta

  • Hola, estoy intentando dar permisos a una vista que va hacia otra BDD a la que no tendrá permisos el usuario, mi objetivo es el siguiente;

    Tengo 2 BDD , en una de ellas he dado permisos al usuario para poder hacer consultas (ciclistas), en la otra he restingido los permisos de lectura y escritura(equipos). En la BDD con permisos de lectura tengo una vista que ataca directamente hacia  una  tabla sin permisos de lectura por el usuario, estoy intentando hacer consultas hacia la tabla "equipos" a través de la vista de la tabla "ciclistas".

    Con el usuario ''prueba'' si hago consultas a la tabla "equipos" puedo hacer consultar ya sea select, etc.. Creo que es porque la vista de la tabla ciclistas está atacando a la tabla de equipos, he intentado usar GRANT en la vista para solo darle permisos a ella y así no depender de la tabla restingida, pero al dar permisos a la vista automaticamente tambien se le asigna a la otra tabla.


    martes, 4 de septiembre de 2018 7:38

Respuestas

  • Si fuera un procedimiento almacenado podrías crearlo con "execute as" y poner ahí un usuario con permisos, pero la vista no tiene esa opción.

    La solución para esto es usar el "ownership chaining". Básicamente consiste en que si el propietario de la vista y el propietario de la tabla a la que accede la vista son el mismo, entonces la vista puede acceder a la tabla aunque no tenga permisos sobre la tabla el usuario que llama a la vista (pero sí que tiene que tener permiso sobre la vista).

    PERO: Normalmente eso solo funciona dentro de una misma base de datos. Si la vista está en una base de datos y la tabla en la otra, entonces hay que habilitar una opción a nivel de Instancia que se llama "corss-database ownership chaining". Se habilita desde SSMS en la pestaña de Seguridad de las Propiedades del servidor. Ojo, esto tiene implicaciones de seguridad en caso de que no todas las bases de datos sean igualmente confiables.

    martes, 4 de septiembre de 2018 16:01

Todas las respuestas

  • Si fuera un procedimiento almacenado podrías crearlo con "execute as" y poner ahí un usuario con permisos, pero la vista no tiene esa opción.

    La solución para esto es usar el "ownership chaining". Básicamente consiste en que si el propietario de la vista y el propietario de la tabla a la que accede la vista son el mismo, entonces la vista puede acceder a la tabla aunque no tenga permisos sobre la tabla el usuario que llama a la vista (pero sí que tiene que tener permiso sobre la vista).

    PERO: Normalmente eso solo funciona dentro de una misma base de datos. Si la vista está en una base de datos y la tabla en la otra, entonces hay que habilitar una opción a nivel de Instancia que se llama "corss-database ownership chaining". Se habilita desde SSMS en la pestaña de Seguridad de las Propiedades del servidor. Ojo, esto tiene implicaciones de seguridad en caso de que no todas las bases de datos sean igualmente confiables.

    martes, 4 de septiembre de 2018 16:01
  • Funcionó! Gracias!!
    miércoles, 5 de septiembre de 2018 11:08