2010-09-28 13 views
32

Ho un database SQL Server 2008 in cui tutti gli accessi alle tabelle sottostanti vengono eseguiti tramite stored procedure. Alcune stored procedure semplicemente SELECT i record dalle tabelle mentre altri UPDATE, INSERT e DELETE.Stored procedure e autorizzazioni: EXECUTE è sufficiente?

Se una stored procedure AGGIORNA una tabella, l'utente che esegue la stored procedure ha anche bisogno delle autorizzazioni UPDATE per le tabelle interessate o il fatto che disponga delle autorizzazioni EXECUTE per la stored procedure sufficiente?

Fondamentalmente mi chiedo se fornire all'utente le autorizzazioni EXECUTE alle stored procedure sia sufficiente o è necessario fornire loro le autorizzazioni SELECT, UPDATE, DELETE e INSERT alle tabelle affinché le stored procedure funzionino. Grazie.

[EDIT] Nella maggior parte delle mie stored procedure sembra effettivamente che EXECUTE sia sufficiente. Tuttavia, ho trovato che nelle stored procedure in cui è stato utilizzato "Execute sp_Executesql" EXECUTE non era sufficiente. Le tabelle coinvolte necessitavano di autorizzazioni per le azioni eseguite all'interno di "sp_Executesql".

+3

Ho paura che quando si utilizzano query SQL dinamiche è necessario concedere autorizzazioni sull'oggetto sottostante. Ho aggiornato la risposta per riflettere questo. –

+0

@Noel - Hai ragione. Ho scoperto che dovevo consentire a datareader l'accesso alle tabelle per gli utenti. Per fortuna non è stato un problema per la mia situazione dal momento che tutti gli utenti potevano visualizzare tutti i dati. – webworm

+0

In un'altra risposta, @RemusRusanu collega a un'alternativa: 1) Creare un certificato; 2) Creare un utente associato a quel certificato; 3) Concedere all'utente i diritti appropriati [alle risorse protette]; e 4) Firmare lo sproc con il certificato, ogni volta che si modifica lo sproc (stackoverflow.com/a/4081604/6894566, collegamento a: sommarskog.se/grantperm.html#Certificates). La firma aggiunge i diritti utente del certificato al token utente corrente, che SQL Server conserva quando chiama le procedure di sistema e SQL dinamico richiamato tramite EXEC() o sp_executesql. Quindi lo sproc succede. – iokevins

risposta

11

Le autorizzazioni di esecuzione per la stored procedure sono sufficienti.

CREATE TABLE dbo.Temp(n int) 

GO 
DENY INSERT ON dbo.Temp TO <your role> 
GO 
CREATE PROCEDURE dbo.SPTemp(@Int int) 
AS 

INSERT dbo.Temp 
SELECT @Int 

GO 

GRANT EXEC ON dbo.SPTemp TO <your role> 

GO 

Poi il (non db_owner) utente avrà i seguenti diritti:

EXEC dbo.SPTemp 10 
GO 

INSERT dbo.Temp --INSERT permission was denied on the object 'Temp' 
SELECT 10 

Tuttavia, se si c'è SQL dinamico all'interno dbo.SPTemp che tenta di inserire in dbo.Temp allora che avrà esito negativo. In questo caso, sarà necessario concedere l'autorizzazione diretta sul tavolo.

+7

Questo è almeno fuorviante, se non sbagliato. Il tuo esempio funziona solo perché il proprietario della procedura e il proprietario della tabella sono gli stessi e il concatenamento della proprietà salta il controllo dell'accesso. Se il proprietario della procedura * non * è il proprietario della tabella, ma ha semplicemente il permesso di CONTROLLO su di esso (cioè ha * tutto * il permesso, ma non è il proprietario), il tuo esempio fallirebbe. –

+1

@Remu, sarà necessario essere membro del ruolo db_owner per il passaggio dello scenario. –

+0

In un'altra risposta, @RemusRusanu collega a un'alternativa: 1) Creare un certificato; 2) Creare un utente associato a quel certificato; 3) Concedere all'utente i diritti appropriati [alle risorse protette]; e 4) Firmare lo sproc con il certificato, ogni volta che si modifica lo sproc (https://stackoverflow.com/a/4081604/6894566, che collega a: http://www.sommarskog.se/grantperm.html#Certificates) . La firma aggiunge i diritti utente del certificato al token utente corrente, che SQL Server conserva quando chiama le procedure di sistema e SQL dinamico richiamato tramite EXEC() o sp_executesql. Quindi lo sproc succede. – iokevins

23

Le autorizzazioni sulle tabelle non vengono controllate (incluso DENY) se le tabelle e proc hanno lo stesso proprietario. Possono essere anche in schemi diversi fintanto che gli schemi hanno lo stesso proprietario.

Vedi Ownership chaining su MSDN

Modifica, da un commento da una risposta cancellato.

Il contesto è sempre il login corrente a meno che non sia stato utilizzato EXECUTE AS: solo le autorizzazioni DML dell'oggetto di riferimento non vengono controllate. Prova OBJECT_ID (referencedtable) in un processo memorizzato in cui non vengono assegnati diritti a referencedtable. Dà NULL. Se eseguito dal proprietario del processo memorizzato, restituirebbe un valore in quanto Owener dispone di diritti su referenced

+0

+1 per aver menzionato DENY –

+0

l'hint 'OBJECT_ID' è stato molto utile; Avevo bisogno di un modo per verificare se un utente è in grado di eseguire una procedura memorizzata, questo ha funzionato magnificamente con lo – Simon1979

2

L'autorizzazione di esecuzione su una stored procedure che consente di inserire, aggiornare o eliminare è sufficiente. Non è necessario concedere tali autorizzazioni a livello di tabella. In realtà, vorrei scoraggiare questo approccio. L'utilizzo di una procedura memorizzata offre un maggiore controllo su come avviene la modifica. Ad esempio, potresti voler fare qualche controllo prima di consentire l'aggiornamento. L'utilizzo di una procedura memorizzata può anche aiutare a prevenire incidenti gravi, ad esempio l'eliminazione di tutte le righe nella tabella perché qualcuno ha dimenticato la clausola WHERE!

0

GRAZIE GRAZIE! Ho avuto un problema simile. Questo mi ha portato alla risposta.

Stavo tentando di troncare una tabella in una stored procedure che richiamava altre stored procedure che erano nidificate nelle istruzioni IF.

Il mio errore è stato

Il server principale "dominio \ my_id" non è in grado di accedere al database "2nd_DB" nel contesto di protezione corrente.

avevo dato la chiamata memorizzati diritti procedure per fare il Tronca (EXECUTE come auto), che poi ha causato un problema perché sé non aveva diritti sul 2 ° DB. La nostra soluzione era spostare il troncato su un altro SP, includendo l'ESEGUI COME AUTOS. Ora chiamiamo il truncate SP, eseguiamo l'elaborazione dei dati, stabiliamo la logica e chiamiamo il 3 ° SP appropriato.

1

Forse è possibile utilizzare

"con l'esecuzione come proprietario"

quando si crea la stored procedure.such come di seguito:

create procedure XXX 
with execute as owner 
as 
begin 
... 
end 
go 

allora avete solo bisogno di concedere all'utente il permesso di esecuzione per la stored procedure XXX.

+0

che ha funzionato per me. stava cercando di fornire l'accesso a un tavolo a un utente attraverso solo la stored procedure e questo ha funzionato. la tabella non deve essere posseduta dallo stesso schema della stored procedure. – gopstar

Problemi correlati