¿Cómo otorga permiso de ejecución para un único procedimiento almacenado?


40

Normalmente, cuando creo un procedimiento almacenado, uso lo siguiente como una plantilla de clasificación

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

¿Hay alguna manera de incluir otorgar permiso de ejecución solo en ese procedimiento almacenado mientras estoy en ello?
Por ejemplo como ...

Grant execute [User_Execute] 

... pero solo para este procedimiento almacenado?

He visto algunas otras preguntas similares, pero parecen referirse a TODOS los procedimientos almacenados y no solo a uno, ni he visto uno en el que pueda especificar permisos dentro del create procedurescript. Incluso las respuestas sobre cómo puedo establecer permisos sin la GUI para procedimientos almacenados específicos serían bienvenidas.

Editar La respuesta principal ciertamente me señaló en la dirección correcta, esto es esencialmente lo que estaba buscando, no pensé en agrupar los comandos, que es lo que terminé haciendo, agrupar el comando junto con mi procedimiento almacenado. De todos modos, creo que es bastante hábil.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

El código provisto en el texto editado es válido y la respuesta correcta a esta pregunta.
ninty9notout

Respuestas:



10

truncar tabla El permiso de configuración en objetos como procedimientos almacenados se puede lograr con:

GRANT EXECUTE ON <schema>.<object> to <user>;

Sin embargo, es posible que también desee otorgar derechos de seguridad tanto a nivel de inicio de sesión como de usuario. Deberá determinar y otorgar SOLO los derechos necesarios para los objetos que requieren acceso (como la ejecución). Considere el uso de la EXECUTE AScapacidad que permite la suplantación de otro usuario para validar los permisos necesarios para ejecutar el código SIN tener que otorgar todos los derechos necesarios a todos los objetos subyacentes (por ejemplo, tablas). EXECUTE ASse puede agregar a procedimientos almacenados, funciones, disparadores, etc.

Agregue al código de la siguiente manera dentro del Procedimiento almacenado:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

En este caso, se hace pasar por el propietario del módulo al que se llama. También puede suplantarse a sí mismo, o al usuario que crea o altera el módulo, O ... llama a la persona que llama, que permitirá que el módulo tome los permisos del usuario actual, o ... suplante al PROPIETARIO, que tendrá el permiso del propietario del procedimiento que se llama OR ... suplanta 'user_name', que suplantará a un usuario específico OR ... suplanta 'login_name' con suplantará un inicio de sesión específico.

La mayoría de las veces, solo necesitará otorgar EXECUTEderechos a los procesos almacenados y luego se otorgarán derechos a todos los objetos a los que se hace referencia dentro del proceso almacenado.

De esta manera, NO necesita otorgar derechos implícitos (ejemplo: para actualizar datos o llamar a procesos adicionales). El encadenamiento de propiedad maneja esto por usted. Esto es especialmente útil para SQL dinámico o si necesita crear tareas de seguridad elevadas como CREATE TABLE. EXECUTE ASEs una herramienta útil a tener en cuenta para estos.

Este ejemplo puede ayudar a aclarar todo esto:

Cree un usuario llamado NoPrivUser con acceso público a una base de datos (por ejemplo, dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

NOTA: EL CREADOR O PROPIETARIO DE ESTE PROCEDIMIENTO REQUERIRÁ CREAR DERECHOS DE TABLA dentro de la base de datos de destino.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Con la EXECUTE AScláusula, el procedimiento almacenado se ejecuta en el contexto del propietario del objeto. Este código crea con éxito dbo.MyTabley las filas se insertan con éxito. En este ejemplo, el usuario no NoPrivUsertiene absolutamente ningún derecho otorgado para modificar la tabla, o leer o modificar cualquiera de los datos en esta tabla.

Solo adquiere los derechos necesarios para completar esta tarea específica codificada DENTRO del contexto de este procedimiento.

Este método de crear procedimientos almacenados que pueden realizar tareas que requieren derechos de seguridad elevados sin asignar permanentemente esos derechos puede ser muy útil.


44
Esta es la misma respuesta que publicó ayer en SO , que también tuve que formatear para facilitar su lectura.
Aaron Bertrand

5

ingrese la descripción de la imagen aquí

seleccione inicio de sesión en la base de datos -> Vaya a Asegurable y haga clic en el botón Buscar como en la imagen anterior. Al hacer clic en el botón Buscar, encontrará la siguiente ventana para agregar el tipo de objeto.

Haga clic en el botón Tipos de objeto y obtendrá la ventana "Seleccionar tipos de objeto" con varios objetos. Ahora, si ve, el procedimiento almacenado se enumera en el área de tipos de objeto. Ahora seleccionaremos nuestro procedimiento almacenado específico en el que queremos otorgar permiso.


Primero, la pregunta tenía más de cinco años cuando la respondiste. Eso estaría bien, excepto que el OP solicitó específicamente soluciones que no usen la GUI y que puedan integrarse en un script. Su respuesta no aborda eso.
Eric Brandt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.