2010-11-02 15 views
6

Ho un database con un ruolo di applicazione. I membri del ruolo appartengono tutti a un gruppo in Active Directory. Invece di assegnare al ruolo le autorizzazioni per selezionare dalle tabelle, ho assegnato al ruolo autorizzazioni di esecuzione su tutte le stored procedure che è necessario chiamare.Permessi SQL Server su Processi memorizzati con SQL dinamico

Questo funziona benissimo tranne che per una delle mie stored procedure che crea un po 'di SQL dinamico e chiama sp_executesql.

SQL dinamica sembra un po 'come questo:

SET @SQL = N' 
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id' 

EXEC sp_executesql @SQL 

Gli utenti in questo ruolo non riescono a chiamare la stored procedure. Si dà il seguente errore che è una specie di previsto suppongo:

Il permesso SELECT è stato negato sull'oggetto 'uvView1', database 'Foobar', schema 'dbo'.

Esiste un modo per consentire ai miei utenti di eseguire correttamente questo processo senza assegnare le autorizzazioni di ruolo a tutte le viste nell'SQL dinamico?

+0

L'utente accede alla vista, giusto? Non credo che la sicurezza si preoccupi di come accedervi. – JNK

+0

Questo è l'unico processo che ha esito negativo e non ha esito negativo con le autorizzazioni di esecuzione sul proc ... in particolare mi sta dicendo che è possibile selezionare dalla vista ... quindi sto indovinando che importa in qualche modo. – Dismissile

risposta

6

Sì.

Aggiungere una clausola EXECUTE AS CALLER alla procedura, quindi firmare la stored procedure e fornire l'autorizzazione richiesta alla firma . Questo è sicuro al 100%, sicuro e resistente ai proiettili. Vedi Signing Procedures with Certificates.

+0

Che ne dici di una soluzione che utilizza un trigger del database per monitorare lo Sql dell'utente e rifiutarlo se lo SQL inizia con 'select'? – ca9163d9

0

No. È possibile modificarlo in modo da non utilizzare l'SQL dinamico?

+0

No ... non che io sappia. La query sta effettivamente ruotando alcuni dati e le colonne su cui ruota sono dinamiche. Il mio esempio non mostra realmente la complessità della query. – Dismissile

+3

Si potrebbe prendere in considerazione la possibilità di inserire tutte queste viste in uno schema e fornire loro l'accesso a Datareader sullo schema. –

2

È possibile utilizzare impersonation per un altro ID con le autorizzazioni necessarie?

SET @SQL = N' 
EXECUTE AS USER = ''TrustedUser''; 
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id' 

EXEC sp_executesql @SQL 
+0

Buon consiglio Vedrò se posso farlo. – Dismissile

+0

-1: richiede l'autorizzazione IMPERSONATE su 'TrustedUser' che in effetti significa che l'utente ** ha ** tutte le autorizzazioni dell'utente fidato, poiché può impersonarlo a volontà. –