Aracılığıyla paylaş


REVERT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse Analytics

Yürütme bağlamını son EXECUTE AS ifadesinin çağırıcısına geri döndürür.

Transact-SQL söz dizimi kuralları

Sözdizimi

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

ÇEREZLE = @varbinary_variable
İlgili EXECUTE AS bağımsız ifadesinde oluşturulan çerezi belirtir. @varbinary_variablevarbinary(100)'dür.

Açıklamalar

REVERT, bir modül içinde, örneğin depolanmış bir prosedür veya kullanıcı tanımlı fonksiyon gibi, ya da bağımsız bir ifade olarak tanımlanabilir. Bir modül içinde belirtildiğinde, REVERT yalnızca modülde tanımlanan EXECUTE AS ifadeleri için geçerlidir. Örneğin, aşağıdaki kayıtlı prosedür bir EXECUTE AS ifade ve ardından bir REVERT ifade çıkarır.

CREATE PROCEDURE dbo.usp_myproc   
  WITH EXECUTE AS CALLER  
AS   
    SELECT SUSER_NAME(), USER_NAME();  
    EXECUTE AS USER = 'guest';  
    SELECT SUSER_NAME(), USER_NAME();  
    REVERT;  
    SELECT SUSER_NAME(), USER_NAME();  
GO  

Depolanan prosedürün çalıştırıldığı oturumda, oturumun yürütme bağlamının açıkça , login1olarak değiştirildiğini varsayın, aşağıdaki örnekte gösterildiği gibi.

  -- Sets the execution context of the session to 'login1'.  
EXECUTE AS LOGIN = 'login1';  
GO  
EXECUTE dbo.usp_myproc;   

İçinde usp_myproc tanımlanan ifade, REVERT modül içindeki yürütme bağlam kümesini değiştirir, ancak modül dışındaki yürütme bağlam kümesini etkilemez. Yani, oturumun yürütme bağlamı olarak login1kalır.

Bağımsız bir ifade olarak belirtildiğinde, REVERT bir toplu veya oturum içinde tanımlanan EXECUTE AS ifadelerine uygulanır. REVERT, ilgili EXECUTE AS ifadesi WITH NO REVERT maddesini içeriyorsa etkisi olmaz. Bu durumda, yürütme bağlamı oturum kaldırılana kadar geçerlidir.

Bir oturumun yürütme bağlamını ayarlamak için kullanılan EXECUTE AS ifadesi, isteğe bağlı NOT REVERT COOKIE = @varbinary_variable cümlesini içerebilir. Bu ifade çalıştırıldığında, Veritabanı Motoru çerezi @varbinary_variable'a iletir. Bu ifadeyle belirlenen yürütme bağlamı, yalnızca çağrı REVERT WITH COOKIE = @varbinary_variable ifadesi doğru @varbinary_variable değerini içeriyorsa önceki bağlama geri döndürülebilir.

Bu mekanizma, bağlantı havuzunun kullanıldığı bir ortamda faydalıdır. Bağlantı havuzu, birden fazla son kullanıcı arasında uygulamalar tarafından yeniden kullanılmak üzere bir grup veritabanı bağlantısının bakımını içerir. @varbinary_variable'ye iletilen değer yalnızca EXECUTE AS i'lemini çağıran (bu durumda uygulama) tarafından bilindiği için, arayan, kurduğu uygulama bağlamının, uygulamayı çağıran son kullanıcı tarafından değiştirilemeyeceğini garanti edebilir. Uygulama bağlamı geri alındıktan sonra, uygulama bağlamı başka bir ana anahtara değiştirebilir.

Permissions

İzin gerekmez.

Örnekler

A. Bağlamı değiştirmek için EXECUTE AS ve REVERT kullanmak

Aşağıdaki örnek, birden fazla prensip kullanarak bir bağlam yürütme yığını oluşturur. REVERT ifadesi, uygulama bağlamını önceki çağırana sıfırlamak için kullanılır. REVERT ifadesi, çalıştırma bağlamı orijinal çağırana kadar yığında birden fazla kez çalıştırılır.

USE AdventureWorks2022;  
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 that 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 the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
-- Display the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
-- Remove the temporary principals.  
DROP LOGIN login1;  
DROP LOGIN login2;  
DROP USER user1;  
DROP USER user2;  
GO  

Aşağıdaki örnek, bir oturumun yürütme bağlamını belirli bir kullanıcıya ayar ve NO REVERT COOKIE = @varbinary_variable maddesini belirtir. Bağlamı geri çağırana geri döndürmek için ifadedeki REVERTEXECUTE AS değişkene iletilen değeri @cookie belirtmelidir. Bu örneği çalıştırmak için, login1 örnek A'da oluşturulan giriş ve user1 kullanıcı var olmalıdır.

DECLARE @cookie VARBINARY(100);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie somewhere safe 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  

Ayrıca Bkz.

OLARAK YÜRÜT (Transact-SQL)
EXECUTE AS Yan Tümcesi (Transact-SQL)
ÇALIŞTIR (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
GİRİŞ OLUŞTUR (Transact-SQL)
KULLANICI OLUŞTUR (Transact-SQL)