REVERT (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL Database Azure SQL Managed InstanceAzure Synapse Analytics

Mengalihkan konteks eksekusi kembali ke pemanggil pernyataan terakhir EXECUTE AS .

Konvensi sintaks transact-SQL

Sintaks

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Argumen

DENGAN COOKIE = @varbinary_variable
Menentukan cookie yang dibuat dalam pernyataan mandiri yang sesuai EXECUTE AS . @varbinary_variable adalah varbinary(100).

Keterangan

REVERT dapat ditentukan dalam modul seperti prosedur tersimpan atau fungsi yang ditentukan pengguna, atau sebagai pernyataan yang berdiri sendiri. Ketika ditentukan di dalam modul, REVERT hanya berlaku untuk EXECUTE AS pernyataan yang ditentukan dalam modul. Misalnya, prosedur tersimpan berikut mengeluarkan EXECUTE AS pernyataan diikuti oleh REVERT pernyataan.

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  

Asumsikan bahwa dalam sesi tempat prosedur tersimpan dijalankan, konteks eksekusi sesi secara eksplisit diubah menjadi login1, seperti yang ditunjukkan dalam contoh berikut.

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

Pernyataan REVERT yang didefinisikan di dalam usp_myproc mengalihkan konteks eksekusi yang diatur di dalam modul, tetapi tidak memengaruhi konteks eksekusi yang ditetapkan di luar modul. Artinya, konteks eksekusi untuk sesi tetap diatur ke login1.

Ketika ditentukan sebagai pernyataan mandiri, REVERT berlaku untuk EXECUTE AS pernyataan yang ditentukan dalam batch atau sesi. REVERTtidak berpengaruh jika pernyataan yang sesuai EXECUTE AS berisi klausa WITH NO.REVERT Dalam hal ini, konteks eksekusi tetap berlaku sampai sesi dihentikan.

Pernyataan EXECUTE AS yang digunakan untuk mengatur konteks eksekusi sesi dapat menyertakan klausa opsional WITH NO REVERT COOKIE = @varbinary_variable. Ketika pernyataan ini dijalankan, Mesin Database meneruskan cookie ke @varbinary_variable. Konteks eksekusi yang ditetapkan oleh pernyataan tersebut hanya dapat dikembalikan ke konteks sebelumnya jika pernyataan WITH COOKIE = @varbinary_variable yang dipanggil REVERT berisi nilai @varbinary_variable yang benar.

Mekanisme ini berguna di lingkungan tempat pengumpulan koneksi digunakan. Pengumpulan koneksi adalah pemeliharaan sekelompok koneksi database untuk digunakan kembali oleh aplikasi di beberapa pengguna akhir. Karena nilai yang diteruskan ke @varbinary_variable hanya diketahui oleh pemanggil EXECUTE AS pernyataan (dalam hal ini, aplikasi), pemanggil dapat menjamin bahwa konteks eksekusi yang mereka buat tidak dapat diubah oleh pengguna akhir yang memanggil aplikasi. Setelah konteks eksekusi dikembalikan, aplikasi dapat beralih konteks ke prinsipal lain.

Izin

Tidak ada izin yang diperlukan.

Contoh

J. Menggunakan EXECUTE AS dan REVERT untuk mengganti konteks

Contoh berikut membuat tumpukan eksekusi konteks dengan menggunakan beberapa prinsipal. REVERT Pernyataan kemudian digunakan untuk mengatur ulang konteks eksekusi ke pemanggil sebelumnya. Pernyataan REVERT dijalankan beberapa kali memindahkan tumpukan hingga konteks eksekusi diatur ke pemanggil asli.

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  

Contoh berikut menetapkan konteks eksekusi sesi ke pengguna tertentu dan menentukan klausa WITH NO REVERT COOKIE = @varbinary_variable . Pernyataan REVERT harus menentukan nilai yang diteruskan ke @cookie variabel dalam EXECUTE AS pernyataan agar berhasil mengembalikan konteks kembali ke pemanggil. Untuk menjalankan contoh ini, login dan login1 pengguna yang user1 dibuat dalam contoh A harus ada.

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  

Lihat Juga

EXECUTE AS (Transact-SQL)
EXECUTE AS Klausul (Transact-SQL)
JALANKAN (Transact-SQL)
SUSER_NAME (T-SQL)
USER_NAME (T-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)