Necesito limitar el acceso a un usuario en particular, pero aún necesitan poder ver los datos en tablas propiedad de dbo.
Estoy tratando de hacer lo siguiente:
- El esquema dbo funciona como lo haría normalmente, tiene acceso a todo
- schema1 schema tiene acceso solo a objetos schema1
- Si una vista de esquema1 o un procedimiento almacenado accede a los datos en tablas propiedad de dbo, la cadena de permisos de manera adecuada
- el usuario1 tiene acceso al esquema1, y nada más; excepto en el caso del n. ° 3
Esto es lo que he intentado:
- Crear un usuario1 usuario asignado a un inicio de sesión de prueba con una contraseña aleatoria
- Creé un par de tablas en el esquema dbo con algunos datos de prueba en ellas
- Creó un esquema de esquema1
- Creó un schema1.get_profiles que selecciona desde una vista llamada schema1.profiles que accede a datos en dbo.people, dbo.taglinks y dbo.tags
Sin embargo, utilizando la siguiente instrucción mientras está conectado como usuario1:
EXEC get_profiles 1
resultados en:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
He intentado WITH EXECUTE AS OWNER
y no puedo comenzar a entender cómo se supone que funciona el "encadenamiento de propiedad".
También he intentado
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
pero recibo el siguiente error (a pesar de ser un usuario con acceso de nivel dbo):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
Lo que necesito es user1 para poder acceder a los datos a través de los procedimientos almacenados que le doy, y nada más.
Además, esto está destinado a vivir eventualmente en una base de datos SQL Azure existente, pero primero estoy probando contra una base de datos ficticia local.
fuente
Respuestas:
El concepto básico es utilizar los permisos de esquema GRANT / DENY . Puede administrar los permisos de manera eficiente al crear un rol y luego agregarle miembros.
A continuación se muestra un ejemplo que lo explicará en detalle.
Ahora prueba:
Ahora cree procedimientos almacenados:
Ahora otorgue permisos de ejecución al usuario A en el SP de schemaB
Pruébelo ... para ver si el usuario A puede ejecutar SP desde el esquema B. Esto pasará
Pero el usuario A no podrá ver los datos de SchemaB
Alternativamente, puede usar DATABASE ROLE y simplemente agregar usuarios para una mejor capacidad de administración de permisos:
La siguiente declaración se asegurará de que el usuario A pueda ver el esquema A y NO el esquema B. Lo bueno es que solo puede agregar usuarios al
SchemaBUsesSchemaAProc
rol y heredarán todos los permisos otorgados a ese rol.Si solo desea permitir que el usuario A ejecute SP que son propiedad de SchemaB, la siguiente declaración hará el trabajo:
De esta forma, el usuario A no puede ver las tablas de SchemaB, pero aún puede ejecutar procs desde SchemaB.
A continuación se explicará la jerarquía de permisos :
fuente