2009-07-08 7 views
21

Considere el escenario en el que una base de datos tiene una función de base de datos SQL o rol de aplicación. La tarea es otorgar permisos de Ejecución a n procedimientos almacenados.Forma rápida de otorgar permisos de Exec al rol de base de datos para muchos procesos almacenados

Al usar SQL Management Studio, hay una buena pantalla para ayudar a aplicar permisos a los objetos para un Rol.

SQL Management Studio http://i26.tinypic.com/2r5g6c3.png

Éstos son los pasos para solicitar permisos:

  • Seleccione el objeto que desea conceder/denegar permisos en la lista de Asegurables.
  • navegue a la lista de Permisos explícitos abajo.
  • seleccione la casilla Omitir o Denegar según corresponda.

Repetir lo anterior para n objetos. ¡Enciende algo de música para mantenerte entretenido mientras haces esto por más de 100 objetos! ¡Tiene que haber una mejor manera! Es un clickfest de grandes proporciones.

Pregunta:

¿Existe una manera más rápida para realizar esta tarea mediante SQL Server Management Studio 2005? ¿Quizás otra herramienta GUI (preferiblemente gratuita)?

¿Alguna sugerencia para crear scripts de T-SQL para realizar esta tarea automáticamente? es decir, ¿crear una tabla de todos los nombres de procedimientos almacenados, bucle y aplicar los permisos de ejecución?

+4

¿Ha considerado tener todos los procedimientos en un esquema y luego conceder ejecutar en dicho esquema? –

+0

Esta es la razón por la cual las herramientas de GUI y la confianza en ellas, apestan. – RBarryYoung

Respuesta

11

Esto debe hacerlo:

CREATE PROC SProcs_GrantExecute( 
    @To AS NVARCHAR(255) 
    , @NameLike AS NVARCHAR(MAX) 
    , @SchemaLike as NVARCHAR(MAX) = N'dbo' 
    ) AS 
/* 
Proc to Authorize a role for a whole bunch of SProcs at once 
*/ 
DECLARE @sql as NVARCHAR(MAX) 
SET @sql = '' 

SELECT @sql = @sql + ' 
GRANT EXECUTE ON OBJECT::['+ROUTINE_SCHEMA+'].['+ROUTINE_NAME+'] TO '[email protected]+';' 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_NAME LIKE @NameLike 
AND ROUTINE_SCHEMA LIKE @SchemaLike 

PRINT @sql 
EXEC(@sql) 

Esto es inyectable como demonios, así que guárdalo para uso exclusivo del administrador.


Solo quiero agregar que la sugerencia de Remus de usar esquemas es el enfoque preferido, donde eso es factible.

+0

¡Tremendo! Acabas de salvar a este programador junior mucho tiempo. ¡Gracias! – onefootswill

+0

¡Parece excesivo! – mok

3

forma más fácil es:

GRANT EXECUTE ON myproc TO x 

donde x =

  1. SQL usuario
  2. papel
  3. grupo de AD/Cuenta
13

puede hacer esto, sin embargo, no estoy del todo seguro de cuán seguro es esto.

/* CREATE A NEW ROLE */ 
CREATE ROLE db_executor 

/* GRANT EXECUTE TO THE ROLE */ 
GRANT EXECUTE TO db_executor 
31
USE database_name; 
GRANT EXECUTE TO [security_account]; 

No se olvide de los soportes :)

+0

¿Cómo puedo verificar esto en el SSMS Gui o vía TSQL? – nojetlag

2

simplemente actualizar el esquema dbo y set Añadir un permiso de ejecución en este esquema para el usuario/función deseada.

Cuestiones relacionadas