none
Esquemas SQLServer, y permisos entre Esquemas RRS feed

  • Pregunta

  • Hola!

    Partiendo del siguiente ejemplo:

    INTANCIA_BBDD_1 --> BBDD_1 --> ESQUEMA_1 --> TABLA_1 (Accesible por el Usuario1) 

    INTANCIA_BBDD_1 --> BBDD_1 --> ESQUEMA_2 --> VISTA_2 (Accesible por el Usuario2)

    La VISTA_2 tiene el siguiente código:

    • select campo1, campo2, campoN from BBDD_1.ESQUEMA_1.TABLA_1 where campo1='dato_concreto'

    Esta vista es ejecutada por el Usuario2, el cual no tiene permisos al objeto TABLA_1 por lo tanto al ejecutarla me devuelve el siguiente error: 

    • Mens. 229, Nivel 14, Estado 5, Línea 2
      Se denegó el permiso SELECT en el objeto 'TABLA_1', base de datos 'BBDD_1', esquema 'ESQUEMA_1'.

    Lo que pretendo es, que el [Usuario2] solo acceda a determinados registros de la 'TABLA_1' que son los filtrados en la [VISTA_2], pero  que no pueda seleccionar todos los elementos de la 'TABLA_1'.

    Para solucionar el error, he pensado en darle permisos de Select al [Usuario2] en la 'TABLA_1', pero entonces ve más datos de los que debe, que son los filtrados en [VISTA_2].

    Se me ocurren distintas soluciones, pero todas pasan por duplicar datos de 'TABLA_1', y pasarlos al 'ESQUEMA_2'.

    Otra solución sería tener una Vista_Auxiliar en la 'Tabla_1' que haga el filtro y dar permisos de select al 'USUARIO_2', pero cuando más usuarios tenga que filtrar, tendré que hacer más vistas en el [Esquema_1] y será tedioso su mantenimiento, por eso busco una forma más general de hacerlo.

    Resumiendo tengo una tabla maestra con datos de diferentes orígenes, y quiero que un usuario pueda ver solamente los de un origen en concreto. Esto se hará extensible a funciones con valores de tabla, más vistas, etc, por eso he optado por crear un nuevo esquema.

    Gracias de antemano por vuestras ideas y comentarios. Un abrazo a todos.

    viernes, 13 de enero de 2017 13:02

Respuestas

  • ¿Qué requisito no puedes cumplir? ¿El de que la tabla y la vista tengan el mismo propietario? Es rarísimo, normalmente todos los objetos de la base de datos se hacen pertenecer al mismo propietario, típicamente el dbo. Recuerda que que a partir de la version 2005 el propietario y el esquema van por separado, y no hay problema en que objetos de distintos esquemas tengan el mismo propietario. Lo digo porque hay gente que adquirió el concepto en la version 2000 o anterior de que para usar distintos esquemas habia que usar distintos propietarios, y ahora creen que no se puede cambiar el propietario por estar usando distintos esquemas.
    lunes, 16 de enero de 2017 14:57
  • Prueba con el comando "alter authorization":

    ALTER AUTHORIZATION ON OBJECT::Esquema.Vista2 TO dbo;

    • Propuesto como respuesta Joyce_ACModerator miércoles, 18 de enero de 2017 15:31
    • Marcado como respuesta Roque Santos jueves, 19 de enero de 2017 7:32
    miércoles, 18 de enero de 2017 12:05

Todas las respuestas

  • Hola

    Prueba con:

    GRANT SELECT ON ESQUEMA_1.VISTA_2 TO Usuario2

    Saludos

    viernes, 13 de enero de 2017 13:53
  • Hola Raimundo.

    Gracias por tu contestación.

    El caso es que ESQUEMA_1 no tiene un objeto llamado VISTA_2, entonces no sirve este comando.

    Saludos.

    domingo, 15 de enero de 2017 13:41
  • Puedes usar el encadenamiento de pertenencia (Ownership Chaining). Básicamente consiste en que si la tabla y la vista pertenecen al mismo propietario (típicamente el dbo), entonces basta con que le des al usuario permisos sobre la Vista y no le des ningún permiso sobre la tabla. A pesar de no tener permiso sobre la tabla, la Select podrá ejecutarse gracias a que el propietario de la tabla es el mismo que el propietario de la vista. Obviamente, esto requiere que cambies el propetario de la tabla y/o de la vista para que coincida en los dos sitios.
    domingo, 15 de enero de 2017 22:18
  • Hola Raimundo.

    Gracias por tu contestación.

    El caso es que ESQUEMA_1 no tiene un objeto llamado VISTA_2, entonces no sirve este comando.

    Saludos.

    Hola

    Claro me he equivocado, sería Esquema_2. Prueba con estos pasos que explícitamente da y quita privilegios, nos cuentas si funciona

    DENY SELECT ON ESQUEMA_1.[TABLA_1] TO [Usuario2]
    GO
    GRANT SELECT ON ESQUEMA_2.Vista_2 TO Usuario2
    GO
    EXEC AS USER=N'Usuario2'
    GO
    SELECT * FROM ESQUEMA_1.TABLA_1
    SELECT * FROM ESQUEMA_2.Vista_2

    REVERT;
    GO

    Saludos

    lunes, 16 de enero de 2017 12:47
  • Hola Alberto.

    Se agradece tu respuesta, pero es un requisito que desgraciadamente no puedo cumplir.

    Saludos.

    lunes, 16 de enero de 2017 14:08
  • ¿Qué requisito no puedes cumplir? ¿El de que la tabla y la vista tengan el mismo propietario? Es rarísimo, normalmente todos los objetos de la base de datos se hacen pertenecer al mismo propietario, típicamente el dbo. Recuerda que que a partir de la version 2005 el propietario y el esquema van por separado, y no hay problema en que objetos de distintos esquemas tengan el mismo propietario. Lo digo porque hay gente que adquirió el concepto en la version 2000 o anterior de que para usar distintos esquemas habia que usar distintos propietarios, y ahora creen que no se puede cambiar el propietario por estar usando distintos esquemas.
    lunes, 16 de enero de 2017 14:57
  • Llevas razón! Pruebo y te cuento

    Imposible cambiar el propietario del objeto vista_2 con sp_changeobjectowner:

    Mens 15001, Nivel 16, Estado 1, Procedimiento sp_changeobjectowner, Línea 69
    El objeto '[usuario.anterior].[vista_2]' no existe o no es un objeto válido para esta operación.

    Lo que si he podido cambiar es el propietario del Esquema_2 y ponerle el dbo, pero al objeto concreto no me deja.

    Lanzando:

    select * from sysobjects where name = 'tabla_1' or name = 'vista_2'

    efectivamente me muestra el campo [uid] con índices distintos.

    tabla_1 --> uid = 1 --> dbo

    vista_2 --> uid = 6 --> usuario.anterior

    Gracias por la ayuda

    • Editado Roque Santos miércoles, 18 de enero de 2017 10:10
    miércoles, 18 de enero de 2017 7:51
  • Prueba con el comando "alter authorization":

    ALTER AUTHORIZATION ON OBJECT::Esquema.Vista2 TO dbo;

    • Propuesto como respuesta Joyce_ACModerator miércoles, 18 de enero de 2017 15:31
    • Marcado como respuesta Roque Santos jueves, 19 de enero de 2017 7:32
    miércoles, 18 de enero de 2017 12:05
  • Hola!

    Ha funcionado perfectamente. Muchas gracias por todo!

    Un abrazo

    jueves, 19 de enero de 2017 7:32