Come si concede l'autorizzazione di esecuzione per una singola procedura memorizzata?


40

Normalmente, quando creo una procedura memorizzata, utilizzo quanto segue come modello di ordinamento

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

 <procedure>

end

C'è un modo per includere la concessione dell'autorizzazione di esecuzione solo su quella procedura memorizzata mentre ci sono io?
Ad esempio come ...

Grant execute [User_Execute] 

... ma solo per questa procedura memorizzata?

Ho visto altre domande simili, ma sembrano riferirsi a TUTTE le procedure memorizzate e non solo a una, né ne ho vista una in cui è possibile specificare le autorizzazioni all'interno dello create procedurescript. Anche le risposte su come posso impostare le autorizzazioni senza la GUI per specifiche procedure memorizzate sarebbero benvenute.

Modifica La risposta principale mi ha sicuramente indicato la giusta direzione, questo è essenzialmente quello che stavo cercando, non ho pensato di raggruppare i comandi che è quello che ho finito per fare, raggruppare il comando insieme alla mia procedura memorizzata. Comunque, penso che sia piuttosto elegante.

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

<procedure>

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

Il codice fornito nel testo modificato è valido e la risposta corretta a questa domanda.
novantanove l'

Risposte:



10

troncare la tabella L'impostazione dell'autorizzazione su oggetti come le stored procedure può essere effettuata con:

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

Tuttavia, potresti anche voler concedere diritti di sicurezza sia a livello di accesso che a livello di utente. Dovrai determinare e concedere SOLO i diritti necessari per gli oggetti che richiedono l'accesso (come l'esecuzione). Considerare l'uso della EXECUTE ASfunzionalità che consente la rappresentazione di un altro utente per convalidare le autorizzazioni necessarie per eseguire il codice SENZA dover concedere tutti i diritti necessari a tutti gli oggetti sottostanti (ad esempio tabelle). EXECUTE ASpuò essere aggiunto a stored procedure, funzioni, trigger, ecc.

Aggiungi al codice come segue direttamente nella Stored Procedure:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

In questo caso stai impersonando il proprietario del modulo chiamato. Puoi anche impersonare SELF, O l'utente che crea o modifica il modulo OR ... imperonate CALLER, che consentirà al modulo di assumere le autorizzazioni dell'utente corrente, oppure ... impersonare PROPRIETARIO, che assumerà l'autorizzazione del il proprietario della procedura chiamata OR ... impersonifica 'user_name', che impersonerà un utente specifico OR ... impersonifica 'login_name' con impersonificherà un login specifico.

Nella maggior parte dei casi, sarà necessario concedere solo i EXECUTEdiritti ai proc memorizzati e quindi i diritti sono concessi a tutti gli oggetti a cui si fa riferimento all'interno del proc memorizzato.

In questo modo, NON è NECESSARIO assegnare diritti impliciti (esempio: per aggiornare i dati o chiamare procs aggiuntivi). Il concatenamento di proprietà gestisce questo per te. Ciò è particolarmente utile per sql dinamico o se è necessario creare attività di sicurezza elevate come CREATE TABLE. EXECUTE ASè uno strumento utile da considerare per questi.

Questo esempio può aiutare a chiarire tutto ciò:

Creare un utente chiamato NoPrivUser con accesso pubblico a un database (ad esempio 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: IL CREATORE O IL PROPRIETARIO DI QUESTA PROCEDURA RICHIEDERÀ CREARE I DIRITTI DI TABELLA all'interno del database di destinazione.

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 ASclausola la procedura memorizzata viene eseguita nel contesto del proprietario dell'oggetto. Questo codice viene creato correttamente dbo.MyTablee le righe vengono inserite correttamente. In questo esempio, l'utente non NoPrivUserha assolutamente alcun diritto concesso per modificare la tabella o leggere o modificare i dati in questa tabella.

Assume solo i diritti necessari per completare questa specifica attività codificata ENTRO il contesto di questa procedura.

Questo metodo di creazione di stored procedure in grado di eseguire attività che richiedono diritti di sicurezza elevati senza assegnare permanentemente tali diritti risulta molto utile.


4
Questa è la stessa risposta che hai pubblicato ieri su SO , che ho anche dovuto formattare per leggibilità.
Aaron Bertrand

5

inserisci qui la descrizione dell'immagine

selezionare il login al database -> Vai su Sicuro e fare clic sul pulsante Cerca come nell'immagine precedente. Facendo clic sul pulsante Cerca, troverai la seguente finestra per aggiungere il tipo di oggetto.

Fai clic sul pulsante Tipi di oggetto e otterrai la finestra "Seleziona tipi di oggetto" con vari oggetti. Ora, se vedi, la procedura memorizzata è elencata nell'area dei tipi di oggetto. Ora selezioneremo la nostra specifica procedura memorizzata su cui vogliamo fornire l'autorizzazione.


Innanzitutto, la domanda aveva più di cinque anni quando hai risposto. Ciò andrebbe bene, tranne l'OP che chiedeva specificamente soluzioni che non utilizzano la GUI e che possono essere incorporate in uno script. La tua risposta non risponde a questo.
Eric Brandt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.