Estoy trabajando con MSSQL Server Management Studio 2008 y necesito exponer una vista a un tercero para su reconciliación de datos. He creado la vista adecuada, pero tengo problemas para crear un usuario y darle a ese usuario los permisos adecuados para seleccionar de la vista.
Seguí a los asistentes para crear un inicio de sesión y un usuario y luego agregué mi vista en la sección Asegurables con el cuadro de concesión marcado para seleccionar. Todo parecía estar bien, pero cuando inicié sesión como ese usuario e intenté hacer un "Seleccionar * de MyViewName" me dijo que se había denegado el permiso de selección.
Acabo de recrear al usuario (esta vez solo usando SQL en lugar del asistente) y otorgué permisos de selección explícitamente y ahora me está dando el error: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(No sé por qué está intentando acceder a la base de datos no relacionada ...)
Realmente no sé a dónde ir desde aquí. Nuevamente, básicamente todo lo que necesito es crear un usuario que pueda darle al tercero para que se conecte a nuestra base de datos y seleccione desde esta vista.
fuente
Respuestas:
Por favor, no use la interfaz de usuario para esto. Es un desastre confuso.
Me parece que lo que quieres es crear un usuario en una base de datos, para un inicio de sesión específico, que solo tiene permisos para seleccionar desde una vista. Entonces, como ya ha creado el inicio de sesión:
EDITAR aquí es un ejemplo de una secuencia de comandos que conducirá al error que mencionas.
Primero, cree una tabla en el unrelated_db:
Ahora cree un inicio de sesión relativamente restringido:
Ahora cree una base de datos donde vivirá la vista y agregue el inicio de sesión como usuario:
Ahora cree una función que haga referencia a la tabla en la otra base de datos, y un sinónimo de la otra tabla:
Ahora cree una tabla local:
Ahora cree una vista que haga referencia a la tabla, la función y el sinónimo, y otorgue
SELECT
ausername
:Ahora intente ejecutar como
username
y seleccione solo la columna local de la vista:Resultado:
Ahora cambie la vista para no hacer referencia a ningún objeto externo y ejecute lo anterior
SELECT
nuevamente, y funciona:A menos que nos muestre los scripts para los detalles de pago, detalles de cuenta y objetos MyView, tal vez pueda informarnos si esta consulta devuelve algún resultado. Puede encontrar referencias a varios objetos a través de la vista de catálogo
sys.sql_expression_dependencies
, pero esta vista no es perfecta; creo que depende de que todas las vistas se actualicen (en el caso de que las vistas hagan referencia a otras vistas, por ejemplo, o el esquema subyacente haya cambiado) en orden ser preciso.SQL Server no solo intentará acceder
unrelated_db
por diversión ... debe haber algún vínculo con esa base de datos desde la vista que está tratando de usar. Desafortunadamente, si no podemos ver la definición de la vista y más detalles sobre los objetos que toca, todo lo que podemos hacer es especular. Las dos cosas principales en las que puedo pensar son sinónimos o funciones que usan nombres de tres partes, pero ver los scripts reales nos dará una idea mucho mejor en lugar de adivinar. :-)Es posible que también desee verificar
sys.dm_sql_referenced_entities
, sin embargo, esta función no devuelve nada útil en el ejemplo anterior.fuente
Puede probar esto haciendo lo siguiente:
fuente