2009-07-08 10 views
21

Considerare lo scenario in cui un database ha un ruolo del database SQL o un ruolo dell'applicazione. L'attività consiste nel concedere le autorizzazioni di esecuzione a n stored procedure.Modo rapido per concedere autorizzazioni Exec al ruolo DB per molti processi memorizzati

Quando si utilizza SQL Management Studio, c'è una bella schermata per aiutare ad applicare le autorizzazioni agli oggetti per un ruolo.

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

Questi sono i passi per applicare permesso:

  • selezionare l'oggetto che si desidera concedere/negare le autorizzazioni nella lista dei Entità a protezione diretta.
  • vai all'elenco di Autorizzazioni esplicite di seguito.
  • selezionare la casella di controllo Concedi o Nega come appropriato.

Ripetere quanto sopra per n oggetti. Accendi musica per divertirti mentre fai questo per oltre 100 oggetti! Deve esserci un modo migliore! È un clickfest di grandi proporzioni.

Domanda:

C'è un modo più veloce per eseguire questa operazione utilizzando SQL Server Management Studio 2005? Forse un altro strumento GUI (preferibilmente gratuito)?

Qualche suggerimento per la creazione di script T-SQL per eseguire automaticamente questa attività? Creare una tabella di tutti i nomi di stored procedure, loop e applicare le autorizzazioni exec?

+4

Avete considerato di avere tutte le procedure in uno schema e quindi concedere l'esecuzione su tale schema? –

+0

Questo è il motivo per cui gli strumenti della GUI e l'affidamento su di essi, fanno schifo. – RBarryYoung

risposta

11

Questo dovrebbe farlo:

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) 

Questo è Iniettabile come diamine, quindi tenerlo solo per uso Amministrativo.


Voglio solo aggiungere che il suggerimento di Remus di utilizzare gli schemi è l'approccio preferito, laddove ciò sia fattibile.

+0

Tremendo! Hai appena salvato questo programmatore junior un sacco di tempo. Grazie! – onefootswill

+0

Sembra eccessivo! – mok

3

Il modo più semplice è quello di:

GRANT EXECUTE ON myproc TO x 

dove x =

  1. SQL utente
  2. Ruolo
  3. Gruppo AD/account
13

si può fare questo, tuttavia non sono del tutto sicuro di quanto sia sicuro.

/* 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]; 

Non dimenticare le parentesi :)

+0

Come posso verificarlo in SSMS Gui o tramite TSQL? – nojetlag

2

È sufficiente aggiornare lo schema dbo e set Aggiungi un permesso di esecuzione su questo schema per l'utente/ruolo desiderato.

Problemi correlati