Pregunta

Un cliente me pidió que implementara algunas vistas con fines de generación de informes; se accederá a las vistas a través de PowerBI, Excel y SSRS.El usuario designado solo tendrá acceso a la vista y no debe haber tablas subyacentes disponibles para el usuario.

El problema que encontré fue que el SQL dentro de la vista toca 3 esquemas diferentes (todos dentro de la misma base de datos):

  • Alumno
  • Proveedor
  • Seguridad

La vista es:

CREATE VIEW dbo.vTestPermissions
AS
SELECT a.Column1,
       b.Column1,
       c.Column1
FROM Pupil.Table1 a
JOIN Provider.Table2 b ON a.Column1 = b.Column1
JOIN Security.Table3 c ON a.Column1 = c.Column1

Los propietarios de las Tablas/Vista son los siguientes:

  • Pupil.Table1 - Alumno propietario
  • Provider.Table2 - Proveedor propietario
  • Security.Table3 - Seguridad del propietario
  • vTestPermissions - Propietario dbo

Cuando selecciono desde la vista me sale un error:

El permiso de selección se denegó en el objeto 'Tabla3', base de datos 'Test', Schema 'Security'

he intentado dar SELECT permiso con y sin el GRANT opción para el esquema y las tablas, pero eso hace que las tablas subyacentes estén disponibles para el usuario.

Cualquier ayuda al respecto será muy apreciada.

¿Fue útil?

Solución

03Cp> La concesión de permiso Seleccionar en la vista sería suficiente si la vista y las tablas tenían el mismo propietario. Esto se llama 03Ca href="https://technet.microsoft.com/en-us/library/ms188676(v=sql.105).aspx" rel="nofollow">Cadenamiento de propiedadu003C/:u003C/

03Cblockquote> norteu0

03Cp> Cuando se accede a un objeto a través de una cadena, SQL Server primero compara el propietario del objeto al propietario del objeto de llamada. Este es el enlace anterior en la cadena. Si ambos objetos tienen el mismo propietario, no se evalúan los permisos en el objeto referenciado.u003C/

p> norteu003C/blockquot

03Cp> Donde los objetos tienen diferentes propietarios, la encadenamiento de la propiedad no funciona.u003C/

03Cp> Por lo tanto, la respuesta u003Cem>más sencillau003C/em> es cambiar la propiedad de las tablas para que coincidan con la vista:u003C/

ALTER AUTHORIZATION ON Pupil.Table1 TO dbo;
ALTER AUTHORIZATION ON Provider.Table2 TO dbo;
ALTER AUTHORIZATION ON Security.Table3 TO dbo;

03Cp> Concesión Seleccionar en la vista:u003C/

GRANT SELECT ON dbo.vTestPermissions TO USER = 'your_user';

03Cp> ... luego permitirá el acceso a través de la vista, a través de la posesión de la contratación, al tiempo que evitó el acceso de la tabla directa.u003C/

03Cp> Si eso no es adecuado para sus necesidades, tendremos que ver un arreglo más complejo.u003C/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top