Bagikan melalui


KEMBALIkan (T-SQL)

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

Mengalihkan konteks eksekusi kembali ke pemanggil pernyataan EXECUTE AS terakhir.

Konvensi sintaks transact-SQL

Sintaks

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Argumen

DENGAN COOKIE = @varbinary_variable
Menentukan cookie yang dibuat dalam pernyataan EXECUTE AS stand-alone yang sesuai. @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 pernyataan EXECUTE AS 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 pernyataan EXECUTE AS yang ditentukan dalam batch atau sesi. REVERT tidak berpengaruh jika pernyataan EXECUTE AS yang sesuai 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 klausul opsional DENGAN 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 memanggil KEMBALIKAN DENGAN COOKIE = @varbinary_variable 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 pernyataan EXECUTE AS (dalam hal ini, aplikasi), pemanggil dapat menjamin bahwa konteks eksekusi yang mereka tetapkan 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 beralih konteks

Contoh berikut membuat tumpukan eksekusi konteks dengan menggunakan beberapa prinsipal. Pernyataan REVERT 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 mengatur 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 user1 pengguna yang login1 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 (T-SQL)
Klausa EXECUTE AS (Transact-SQL)
EXECUTE (Transact-SQL)
SUSER_NAME (T-SQL)
USER_NAME (T-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)