EXECUTE AS (Transact-SQL)
Viene impostato il contesto di esecuzione di una sessione.
Per impostazione predefinita, una sessione inizia quando un utente si connette e termina quando l'utente si disconnette. Tutte le operazioni eseguite durante una sessione sono soggette alle verifiche delle autorizzazioni dell'utente connesso. Quando viene eseguita un'istruzione EXECUTE AS, il contesto di esecuzione della sessione viene impostato sull'account di accesso o sul nome utente specifico. In seguito all'impostazione del contesto specifico, le autorizzazioni vengono verificate in base ai token di protezione dell'account di accesso e dell'account utente per l'account specifico anziché in base alla persona che ha chiamato l'istruzione EXECUTE AS. In pratica, l'account utente o l'account di accesso viene rappresentato per l'intera durata dell'esecuzione della sessione o del modulo oppure il passaggio di contesto viene ripristinato in modo esplicito. Per ulteriori informazioni sul contesto di esecuzione, vedere Informazioni sul contesto di esecuzione. Per ulteriori informazioni sul cambio di contesto, vedere Informazioni sul cambio di contesto.
Sintassi
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Argomenti
LOGIN
Specifica che il contesto di esecuzione da rappresentare è un account di accesso. L'ambito di rappresentazione è a livello di server.USER
Specifica che il contesto da rappresentare è un utente nel database corrente. L'ambito di rappresentazione è limitato al database corrente. Un cambio di contesto a un utente del database non eredita le autorizzazioni a livello di server di tale utente.Importante Mentre il cambio di contesto all'utente del database è attivo, qualsiasi tentativo di accesso alle risorse esterne al database comporterà l'esito negativo dell'esecuzione dell'istruzione. Ciò è valido per le istruzioni USE database, le query distribuite e le query che fanno riferimento a un altro database che utilizza identificatori in tre o quattro parti. Per estendere l'ambito del cambio di contesto all'esterno del database corrente, vedere Estensione della rappresentazione di database tramite EXECUTE AS.
'name'
Nome utente o nome account di accesso valido. name deve essere membro del ruolo predefinito del server sysadmin oppure esistere come entità rispettivamente in sys.database_principals o sys.server_principals.L'argomento name può essere specificato come variabile locale.
L'argomento name deve essere un account singleton e può essere un gruppo, un ruolo, un certificato, una chiave oppure un account predefinito, ad esempio NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService o NT AUTHORITY\LocalSystem.
Per ulteriori informazioni, vedere Specifica di un nome utente o un nome account di accesso di seguito in questo argomento.
NO REVERT
Specifica che non è possibile ripristinare il contesto precedente in seguito a un cambio di contesto.Per ulteriori informazioni sul ripristino del contesto precedente, vedere REVERT (Transact-SQL).
COOKIE INTO **@**varbinary_variable
Specifica che è possibile ripristinare il contesto di esecuzione precedente solo se l'istruzione REVERT WITH COOKIE chiamante include il valore corretto per **@**varbinary_variable . Motore di database passa il cookie a **@**varbinary_variable.**@**varbinary_variable is varbinary(100).
CALLER
Se utilizzato all'interno di un modulo, specifica che le istruzioni all'interno del modulo vengono eseguite nel contesto del chiamante del modulo.Se utilizzato all'esterno di un modulo, l'istruzione non esegue alcuna azione.
Osservazioni
Il cambio di contesto di esecuzione rimane valido finché non si verifica una delle situazioni seguenti:
Viene eseguita un'altra istruzione EXECUTE AS.
Viene eseguita un'istruzione REVERT.
La sessione viene rimossa.
È possibile creare uno stack di contesti di esecuzione eseguendo più volte una chiamata all'istruzione EXECUTE AS in più entità. Quando viene chiamata, l'istruzione REVERT imposta il contesto sull'account di accesso o sull'utente nel successivo livello superiore nello stack di contesti. Per una dimostrazione di questo comportamento, vedere l'esempio A.
Specifica di un nome utente o un nome account di accesso
Il nome utente o il nome account di accesso specificato in EXECUTE AS <context_specification> deve esistere come entità rispettivamente in sys.database_principals o sys.server_principals. In caso contrario, l'istruzione EXECUTE AS ha esito negativo. È inoltre necessario concedere le autorizzazioni IMPERSONATE per l'entità. A meno che il chiamante non sia il proprietario del database o membro del ruolo predefinito del server sysadmin, l'entità deve esistere anche quando l'utente effettua l'accesso al database o all'istanza di SQL Server tramite l'appartenenza a un gruppo di Windows. Si supponga, ad esempio, che siano presenti le condizioni seguenti:
Il gruppo CompanyDomain\SQLUsers ha accesso al database Sales.
CompanyDomain\SqlUser1 è membro del gruppo SQLUsers e pertanto può implicitamente accedere al database Sales.
Anche se CompanyDomain\SqlUser1 può accedere al database in virtù dell'appartenenza al gruppo SQLUsers, l'istruzione EXECUTE AS USER = 'CompanyDomain\SqlUser1' ha esito negativo in quanto CompanyDomain\SqlUser1 non esiste come entità nel database.
Se l'utente è reso orfano (l'accesso associato non esiste più) e non è stato creato con WITHOUT LOGIN, EXECUTE AS restituirà esito negativo per tale utente.
Procedura consigliata
Specificare un account di accesso o un utente che disponga almeno dei privilegi necessari per eseguire operazioni nella sessione. Ad esempio, non specificare un nome account di accesso con autorizzazioni a livello di server se sono richieste solo autorizzazioni a livello di database oppure non specificare l'account di un proprietario di database a meno che siano richieste le autorizzazioni corrispondenti.
Utilizzo di WITH NO REVERT
Se l'istruzione EXECUTE AS include la clausola facoltativa WITH NO REVERT, il contesto di esecuzione di una sessione non può essere ripristinato tramite REVERT oppure tramite l'esecuzione di un'altra istruzione EXECUTE AS. Il contesto impostato dall'istruzione rimane valido fino all'eliminazione della sessione.
Se si specifica la clausola WITH NO REVERT COOKIE = @varbinary\_variable, il Motore di database di SQL Server passa il valore del cookie a @varbinary\_variable. È possibile ripristinare il contesto precedente del contesto di esecuzione impostato da tale istruzione solo se l'istruzione chiamante REVERT WITH COOKIE = @varbinary\_variable contiene lo stesso valore di @varbinary\_variable .
Questa opzione risulta utile in un ambiente in cui vengono utilizzati i pool di connessioni. Tramite i pool di connessioni vengono gestiti i gruppi di connessioni al database in modo che tali connessioni possano essere riutilizzate dalle applicazioni in un server applicazioni. Poiché il valore passato a @varbinary\_variable è noto solo al chiamante dell'istruzione EXECUTE AS, il chiamante è in grado di garantire che il contesto di esecuzione stabilito non venga modificato da altri.
Determinazione dell'account di accesso originale
Utilizzare la funzione ORIGINAL_LOGIN per restituire il nome dell'account di accesso connesso all'istanza di SQL Server. È possibile utilizzare questa funzione per restituire l'identità dell'account di accesso originale nelle sessioni in cui sono presenti numerosi cambi di contesto espliciti o impliciti.
Autorizzazioni
Per specificare l'istruzione EXECUTE AS per un account di accesso, il chiamante deve disporre delle autorizzazioni IMPERSONATE per il nome dell'account di accesso specificato. Per specificare l'istruzione EXECUTE AS per un utente del database, il chiamante deve disporre delle autorizzazioni IMPERSONATE per il nome utente specificato. Se si specifica EXECUTE AS CALLER, le autorizzazioni IMPERSONATE non sono obbligatorie.
Esempi
A. Utilizzo di EXECUTE AS e REVERT per cambiare contesto
Nell'esempio seguente viene creato uno stack di contesti di esecuzione utilizzando più entità. Viene quindi utilizzata l'istruzione REVERT per ripristinare il contesto di esecuzione al chiamante precedente. L'istruzione REVERT viene eseguita più volte per innalzare di livello lo stack finché il contesto di esecuzione viene impostato sul chiamante originale.
USE AdventureWorks;
GO
--Create two temporary principals
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';
CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';
GO
CREATE USER user1 FOR LOGIN login1;
CREATE USER user2 FOR LOGIN login2;
GO
--Give IMPERSONATE permissions on user2 to user1
--so that user1 can successfully set the execution context to user2.
GRANT IMPERSONATE ON USER:: user2 TO user1;
GO
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
-- Set the execution context to login1.
EXECUTE AS LOGIN = 'login1';
--Verify the execution context is now login1.
SELECT SUSER_NAME(), USER_NAME();
--Login1 sets the execution context to login2.
EXECUTE AS USER = 'user2';
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
-- The execution context stack now has three principals: the originating caller, login1 and login2.
--The following REVERT statements will reset the execution context to the previous context.
REVERT;
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
REVERT;
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
--Remove temporary principals.
DROP LOGIN login1;
DROP LOGIN login2;
DROP USER user1;
DROP USER user2;
GO
B. Utilizzo della clausola WITH COOKIE
Nell'esempio seguente il contesto di esecuzione di una sessione viene impostato su un utente specifico e quindi viene specificata la clausola WITH NO REVERT COOKIE = @varbinary\_variable. Nell'istruzione REVERT è necessario specificare il valore passato alla variabile @cookie nell'istruzione EXECUTE AS per ripristinare correttamente il contesto al chiamante originale. Per eseguire questo esempio, l'account di accesso login1 e l'utente user1 creato nell'esempio A devono esistere.
DECLARE @cookie varbinary(100);
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;
-- Store the cookie in a safe location in your application.
-- Verify the context switch.
SELECT SUSER_NAME(), USER_NAME();
--Display the cookie value.
SELECT @cookie;
GO
-- Use the cookie in the REVERT statement.
DECLARE @cookie varbinary(100);
-- Set the cookie value to the one from the SELECT @cookie statement.
SET @cookie = <value from the SELECT @cookie statement>;
REVERT WITH COOKIE = @cookie;
-- Verify the context switch reverted.
SELECT SUSER_NAME(), USER_NAME();
GO
Vedere anche