2011-12-14 30 views
6

SQL Server 2008 R2: normalmente creamos nuestra tabla y el procedimiento almacenado, y le otorgamos al usuario derechos de ejecución para el procedimiento almacenado. Nunca tenemos que otorgar derechos específicos a las tablas o vistas porque si el usuario puede ejecutar el procedimiento almacenado, SQL Server deduce que el procedimiento almacenado debe permitir realizar las instrucciones de selección/inserción/actualización. Funciona bien porque solo estamos tratando con un esquema, pero ahora tenemos un escenario donde las tablas están en un esquema, pero un procedimiento almacenado está en otro. Cuando el usuario ejecuta el procedimiento almacenado, consiguen un error:procedimiento almacenado llamando datos en un esquema diferente

Msg 229, Level 14, State 5, Procedure teststoredprocedure, Line 7 The SELECT permission was denied on the object 'testtable', database 'testdatabase', schema 'testschema'.

teststoredprocedure es en un esquema diferente que testtable. ¿Es posible permitir que el procedimiento almacenado seleccione desde tablas, sin otorgarle derechos específicos al usuario sobre esas tablas?

+0

Si la respuesta fue correcta o útil, acepte o vote. – Ben

Respuesta

2

que necesita para dar el propietario del procedimiento almacenado WITH GRANT acceso a la tabla .

En general, un esquema es propiedad de un rol con el mismo nombre que el esquema, de modo de permitir storedprocschema.teststoredprocedure acceder a la tabla sería:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT 

Esto debería funcionar si y sólo si la tabla está en la misma base de datos que el proc.

Para lograr el mismo resultado con una tabla en una base de datos diferente, puede:

  • Habilitar "encadenamiento de base de datos propiedad"

  • Mueva el procedimiento para la otra base de datos, y tienen una procedimiento shim en la base de datos original que lo llama. Luego, gestione los permisos en ambos procedimientos.

0

Sí, es posible. Esto es lo que desea hacer:

alter procedure teststoredprocedure 
with execute as 'UserWithPermissions' 
-- rest of stored proc code 

Dónde UserWithPermissions tiene los permisos necesarios en sus objetos de la base de que usted está tratando de ejecutar operaciones CRUD de nuevo.

Por el contrario, si el contexto de seguridad del usuario de base de datos tiene los permisos necesarios, puede utilizar la abreviatura para lograr esto, así:

with execute as self 
Cuestiones relacionadas