Principales respuestas
Permisos en vista hacia otra tabla

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.
- Editado Cristian Reche martes, 4 de septiembre de 2018 9:01
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.
- Propuesto como respuesta Pablo RubioModerator miércoles, 5 de septiembre de 2018 8:45
- Marcado como respuesta Cristian Reche miércoles, 5 de septiembre de 2018 10:47
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.
- Propuesto como respuesta Pablo RubioModerator miércoles, 5 de septiembre de 2018 8:45
- Marcado como respuesta Cristian Reche miércoles, 5 de septiembre de 2018 10:47
martes, 4 de septiembre de 2018 16:01 -
Funcionó! Gracias!!miércoles, 5 de septiembre de 2018 11:08