El permiso SELECT fue denegado en el objeto 'Usuarios', base de datos 'XXX', esquema 'dbo'

82

Moví una base de datos de SQL Server 2012 a Azure. No quiero usar el usuario master, así que creé un usuario test. Esto es lo que hice para la base de datos XXX en Azure:

create user test from login test with default_schema=[dbo]
exec sp_addrolemember 'db_owner','test'

Lo verifiqué y los objetos de la base de datos que me interesan están todos en el esquema dbo. La tabla Usersestá en el esquema dbo.

La cadena de conexión en mi proyecto web tiene testcomo inicio de sesión. Produce el mensaje de error:

The SELECT permission was denied on the object 'Users', database 'XXX', schema 'dbo'

¿Qué significa el mensaje de error y qué puedo hacer para permitir que el usuario testacceda a la base de datos XXX?

Viejo viejo
fuente
Gracias por hacer esta pregunta :)
Kamlesh

Respuestas:

75

Creo que el problema es que el usuario tiene privilegios denegados . Este error se produce cuando el usuario que ha creado no tiene los privilegios suficientes para acceder a sus tablas en la base de datos. Otorgue el privilegio al usuario para obtener lo que desea.

Otorgue al usuario permisos específicos como SELECT, INSERT, UPDATE y DELETE en las tablas de esa base de datos.

Rahul Tripathi
fuente
3
¿A veces se perderán las opciones de lector de datos de base de datos / propietario de base de datos? windowstechinfo.com/2014/09/…
Aravinda
5
Tuve que desmarcar 'db_denydatareader' y 'db_denydatawriter' y supongo que eso es lo que SaeX quiere decir con "revocar". Gracias SaeX.
AH.
@AH. Tuve el mismo problema que tú, así que escribí una respuesta a esta pregunta. Compruébalo si tienes la oportunidad
Cañón de Kolob
Eres un salvavidas, muchas gracias :)
Kamlesh
55
  1. Abrir SQL Management Studio
  2. Expande tu base de datos
  3. Expanda la carpeta "Seguridad"
  4. Expandir "Usuarios"
  5. Haga clic derecho en el usuario (el que está intentando realizar la consulta) y seleccione Properties.
  6. Seleccionar página Membership.
  7. Asegúrate de desmarcar

    db_denydatareader

    db_denydatawriter

ingrese la descripción de la imagen aquí

Esto debería ser evidente, pero solo otorgue los permisos a lo que el usuario necesita. Una solución fácil y perezosa es verificar db_ownercomo lo hice yo, pero esta no es la mejor práctica de seguridad.

Cañón de Kolob
fuente
4
Eres un salvavidas, muchas gracias :)
Kamlesh
1
¡Me has ahorrado HORAS de frustración y pérdida de tiempo en Google!
Scott Fleming
1
Muchos de nosotros simplemente los seleccionamos todos asumiendo que obtendremos todos los permisos. Sin embargo hay una denydemasiado
Murali Murugesan
30

La sintaxis para otorgar permiso de selección en una tabla específica:

USE YourDB;

GRANT SELECT ON dbo.functionName TO UserName;

Para otorgar el permiso de selección en todas las tablas de la base de datos:

USE YourDB;

GRANT SELECT TO UserName;
John Hayhow
fuente
2
La primera vez que hice esto, así que no estoy seguro de si era correcto, pero quería otorgar permiso de selección para toda la base de datos, así que hice GRANT SELECT TO UserName y dejé la cláusula ON. Funcionó.
Rich
18

Así es como pude resolver el problema cuando lo enfrenté.

  1. Inicie SQL Management Studio.
  2. Expanda el nodo del servidor (en el 'Explorador de objetos').
  3. Expanda el nodo Bases de datos y luego expanda la base de datos específica a la que está intentando acceder usando el usuario específico.
  4. Expanda el nodo Usuarios debajo del nodo Seguridad de la base de datos.
  5. Haga clic derecho en el usuario específico y haga clic en 'propiedades'. Obtendrá un cuadro de diálogo.
  6. Asegúrese de que el usuario sea miembro del grupo db_owner (lea los comentarios a continuación antes de usar go this path) y otros cambios necesarios usando la vista. (Usé esto para 2016. No estoy seguro de cómo se ve el diálogo específico en otra versión y, por lo tanto, no es específico)
Pramod BR
fuente
6
Tenga cuidado con quién asigna el rol de base de datos db_owner. No todos los usuarios deben agregarse a esa función.
Rod
1
@Rod Si no se recomienda otorgar db_owner, ¿qué tipo de acceso se recomienda para que la aplicación interactúe con la base de datos?
Jacob
1
¿Sería suficiente público?
Rod
2
@Jacob Para escribir y leer datos en cualquier tabla hay id db_datareader y db_datawriter. db_owner también da permiso para modificar las definiciones de tablas.
Oskar Berggren
3
Esto no funciona si el usuario ha verificado db_denydatareadeodb_denydatawriter
Kolob Canyon
0

Se necesitan conceder permisos para ese usuario

billah77
fuente
0

Compruebe el espacio de su base de datos. Este error se produce cuando el espacio aumenta en comparación con el espacio asignado a la base de datos.

Nilesh
fuente
También cambie el ID de usuario y la contraseña de la base de datos
Nilesh
0

Usando SSMS, me aseguré de que el usuario tuviera permisos de conexión tanto en la base de datos como en ReportServer.

En la base de datos específica que se está consultando, en propiedades, asigné sus credenciales y habilité el lector de datos y los permisos públicos. Además, como han dicho otros, me aseguré de que no se seleccionaran casillas de denegar lectura / denegar escritura.

No quería habilitar la propiedad de la base de datos cuando para sus informes, ya que solo necesitaban tener permisos seleccionados.

Aloha480
fuente
-1

Resuelvo mi problema haciendo esto. [NOTA IMPORTANTE: Permite privilegios escalados (expandidos) a la cuenta en particular, posiblemente más de los necesarios para un escenario individual].

  1. Vaya a ' Explorador de objetos ' de SQL Management Studio.
  2. Expanda Seguridad , luego Iniciar sesión .
  3. Seleccione el usuario con el que está trabajando, luego haga clic derecho y seleccione Propiedades Windows .
  4. En Seleccionar una página , vaya a Funciones del servidor
  5. Haga clic en sysadmin y guarde.
cassob
fuente
2
No estoy seguro de por qué se rechazó esta respuesta. Esta respuesta resolvió mi problema. Entonces, he votado a favor.
Emran Hussain
9
Esta respuesta DEBE ser rechazada porque le dice abiertamente al lector que le dé al objeto de usuario un control total, completo y total de todo el servidor sin explicar o advertir que esto es lo que hace. Según la redacción de la pregunta y esta respuesta, creo que existe el peligro de que los usuarios novatos apliquen esta "solución" sin comprender completamente.
Oskar Berggren
3
Esta es una opción de fuerza bruta que no debe aplicarse. Si no comprende lo que está haciendo, no debería hacerlo.
n8.
Todos: no hagas esto en el entorno de producción.
gotqn
Por supuesto que no haría eso en prod, pero resolvió mi problema (en el entorno de desarrollo). Por eso merece mi voto a favor. Gracias ccassob.
Fl4v
-2

Puede ser que su panel de Plesk u otro panel de suscripción haya caducado ... por favor verifique Fin de suscripción.

Abhendra Tiwari
fuente
Proporcione una descripción más sobre su respuesta
asolanki