2010-02-03 20 views
5

Estoy usando Sql Server 2008 y tengo un proceso que usa sp_executesql dentro. Sigo recibiendo el siguiente error al ejecutar el proceso a través de ASP.NET:obteniendo el error "select permission denied" cuando se usa sp_executesql en proc (Sql Server 2008)

El permiso SELECT fue denegado en el objeto 'MyTable', base de datos 'MyDatabase', esquema 'dbo'.

He investigado mucho sobre esto y la mayoría de las personas señalan el hecho de que debo otorgar permiso de selección en la tabla subyacente de la que lee mi consulta dinámica. Bueno, yo he hecho esto y todavía no parece trabajo:

select object_name(major_id) as object, 
user_name(grantee_principal_id) as grantee, 
user_name(grantor_principal_id) as grantor, 
permission_name, 
state_desc 
from sys.database_permissions 
where major_id = object_id('User') and 
class = 1 
Results: 
MyTable public dbo SELECT GRANT 
MyTable guest dbo SELECT GRANT 
MyTable myuser dbo SELECT GRANT 
MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT 

Como se puede ver, me he vuelto una exageración en tratar de concesión de seleccionar en la tabla subyacente. Incluso he vuelto a escribir mi proceso para que solo haga referencia a MyTable en el sql dinámico. Incluso concedí permiso de "ejecución" a todos los usuarios anteriores en el proceso ... Sin suerte.

El "myuser" anterior es el nombre de usuario en mi conexión en el web.config.

¿Falta algo aquí?

Gracias! Dave

+1

¿El procedimiento almacenado tiene un 'CON EXECUTE AS' definido? – Aaronaught

+0

Sí ... lo probé con "MyUser", llamador, auto, propietario. ¿Hay otros que me estoy perdiendo? Lo curioso es que cuando uso MyUser, arroja el mismo error en la ventana de consulta de Management Studio (mientras que sin esto no) – Dave

Respuesta

4

Me di cuenta. Publicar esto para cualquier otra persona que se encuentre con esto.

1) Primero, noté que mi usuario de dbo no tenía un nombre de inicio de sesión asociado. Puede ver esto haciendo clic con el botón derecho en el usuario dbo en la carpeta Seguridad/Usuarios en el usuario dbo y haciendo clic en Propiedades. En el área gris, debe tener un nombre de usuario (dbo) y un nombre de inicio de sesión (sa). Creo que esto normalmente sucede cuando restauras tu base de datos o algo así (no estoy seguro). De todos modos, si no ve el nombre de inicio de sesión, basta con ejecutar la secuencia de comandos en la base de datos con el tema:

sp_changedbowner 'sa'

Esto sólo hace DBO el propietario de la base de datos (o algo así). La razón por la que descubrí esto fue porque intenté guardar algunos de los permisos, como "db_datareader", "db_datawriter" a través de esta interfaz de interfaz gráfica de usuario pero arrojé un error que indica que se requiere el nombre de usuario. Creo que dbo debería tener controlado db_owner (el mío sí) y creo que esto supera a todos los demás de todos modos.

2) Para que mi proceso funcione, tuve que agregar "con ejecutar como propietario" al final del proceso. Intenté esto antes, pero creo que no funcionó debido a mi primer número 1. Por lo general, los procs se ejecutan bajo el propietario del proc, pero no en los proximos de sql dinámicos. Se ejecutan bajo el contexto del usuario que ejecuta el proceso. Para mí esto es extraño porque creo que tendría que agregar esto en el sql dinámico (que probé), pero tiene que estar en el proceso en sí (¿sabes?)

3) Probablemente no duela para ejecutar este script también:

concesión de seleccionar el 'MiTabla' a 'MyUser'

para cada tabla que se utiliza en el SQL dinámico.

Espero que esto ayude ...

aquí es algunas referencias a este mismo tema:

http://www.jimmcleod.net/blog/index.php/2007/05/15/sp_executesql-breaks-chain-of-ownership-in-sql-server-2000/

http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx

http://www.mssqltips.com/tipprint.asp?tip=1822

+1

Debe marcar su respuesta como la correcta. –

0

Lo que ha ayudado a mí era:

En SQL Server Management Studio, haga clic en el procedimiento almacenado y elija Propiedades, y en la página Permisos otorgar por missión al usuario relevante. El usuario relevante depende de su cadena de conexión SQL: si usa la autenticación de Windows, entonces es el usuario de Windows (que puede ser ASPNET si así se configura); de lo contrario, es el usuario de SQL que ha especificado en su cadena de conexión. El permiso que debe otorgar es Ejecutar permiso.

Cuestiones relacionadas