EXECUTE AS (T-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
Mengatur konteks eksekusi sesi.
Secara default, sesi dimulai saat pengguna masuk dan berakhir saat pengguna keluar. Semua operasi selama sesi tunduk pada pemeriksaan izin terhadap pengguna tersebut. Saat pernyataan EXECUTE AS dijalankan, konteks eksekusi sesi dialihkan ke login atau nama pengguna yang ditentukan. Setelah peralihan konteks, izin diperiksa terhadap token keamanan login dan pengguna untuk akun tersebut alih-alih orang yang memanggil pernyataan EXECUTE AS . Intinya, pengguna atau akun masuk ditiru selama durasi sesi atau eksekusi modul, atau sakelar konteks dikembalikan secara eksplisit.
Sintaks
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Argumen
LOGIN
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
Menentukan konteks eksekusi yang akan ditiru adalah login. Cakupan peniruan berada di tingkat server.
Catatan
Opsi ini tidak tersedia dalam database mandiri, Azure SQL Database, atau Azure Synapse Analytics.
USER
Menentukan konteks yang akan ditiru adalah pengguna dalam database saat ini. Cakupan peniruan dibatasi untuk database saat ini. Peralihan konteks ke pengguna database tidak mewarisi izin tingkat server pengguna tersebut.
Penting
Meskipun peralihan konteks ke pengguna database aktif, setiap upaya untuk mengakses sumber daya di luar database akan menyebabkan pernyataan gagal. Ini termasuk pernyataan database USE, kueri terdistribusi, dan kueri yang mereferensikan database lain yang menggunakan pengidentifikasi tiga atau empat bagian.
'name' Adalah nama pengguna atau login yang valid. nama harus merupakan anggota peran server tetap sysadmin , atau ada sebagai prinsipal di sys.database_principals atau sys.server_principals.
nama dapat ditentukan sebagai variabel lokal.
nama harus berupa akun singleton, dan tidak boleh menjadi grup, peran, sertifikat, kunci, atau akun bawaan, seperti NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, atau NT AUTHORITY\LocalSystem.
Untuk informasi selengkapnya, lihat Menentukan Nama Pengguna atau Login nanti dalam topik ini.
TIDAK ADA PEMBALIKAN
Menentukan bahwa sakelar konteks tidak dapat dikembalikan ke konteks sebelumnya. Opsi NO REVERT hanya dapat digunakan pada tingkat adhoc.
Untuk informasi selengkapnya tentang kembali ke konteks sebelumnya, lihat KEMBALIKAN (Transact-SQL).
COOKIE KE @varbinary_variable
Menentukan konteks eksekusi hanya dapat dikembalikan ke konteks sebelumnya jika pernyataan KEMBALIKAN KEMBALI DENGAN COOKIE yang benar berisi nilai @varbinary_variable yang benar. Mesin Database meneruskan cookie ke @varbinary_variable. Opsi COOKIE INTO hanya dapat digunakan pada tingkat adhoc.
@ varbinary_variable adalah varbinary(8000).
Catatan
Parameter OUTPUT cookie untuk saat ini didokumenkan sebagai varbinary(8000) yang merupakan panjang maksimum yang benar. Namun implementasi saat ini mengembalikan varbinary(100). Aplikasi harus memesan varbinary(8000) sehingga aplikasi terus beroperasi dengan benar jika ukuran pengembalian cookie meningkat dalam rilis mendatang.
PEMANGGIL
Saat digunakan di dalam modul, menentukan pernyataan di dalam modul dijalankan dalam konteks pemanggil modul.
Saat digunakan di luar modul, pernyataan tidak memiliki tindakan.
Catatan
Opsi ini tidak tersedia di Azure Synapse Analytics.
Keterangan
Perubahan konteks eksekusi tetap berlaku hingga salah satu hal berikut ini terjadi:
Pernyataan EXECUTE AS lainnya dijalankan.
Pernyataan REVERT dijalankan.
Sesi dihentikan.
Prosedur tersimpan atau pemicu di mana perintah dijalankan keluar.
Anda dapat membuat tumpukan konteks eksekusi dengan memanggil pernyataan EXECUTE AS beberapa kali di beberapa prinsipal. Ketika dipanggil, pernyataan REVERT mengalihkan konteks ke login atau pengguna di tingkat berikutnya ke atas dalam tumpukan konteks. Untuk demonstrasi perilaku ini, lihat Contoh A.
Menentukan Nama Pengguna atau Login
Nama pengguna atau login yang ditentukan dalam EXECUTE AS <context_specification> harus ada sebagai prinsipal dalam sys.database_principals atau sys.server_principals, masing-masing, atau pernyataan EXECUTE AS gagal. Selain itu, izin IMPERSONATE harus diberikan pada prinsipal. Kecuali pemanggil adalah pemilik database, atau merupakan anggota peran server tetap sysadmin , prinsipal harus ada bahkan ketika pengguna mengakses database atau instans SQL Server melalui keanggotaan grup Windows. Misalnya, asumsikan kondisi berikut:
Grup CompanyDomain\SQLUsers memiliki akses ke database Penjualan .
CompanyDomain\SqlUser1 adalah anggota SQLUsers dan, oleh karena itu, memiliki akses implisit ke database Penjualan .
Meskipun CompanyDomain\SqlUser1 memiliki akses ke database melalui keanggotaan di grup SQLUsers , pernyataan EXECUTE AS USER = 'CompanyDomain\SqlUser1'
gagal karena CompanyDomain\SqlUser1
tidak ada sebagai prinsipal dalam database.
Jika pengguna yatim piatu (login terkait tidak ada lagi), dan pengguna tidak dibuat dengan TANPA LOGIN, EXECUTE AS akan gagal untuk pengguna.
Praktik Terbaik
Tentukan login atau pengguna yang memiliki hak istimewa paling sedikit yang diperlukan untuk melakukan operasi dalam sesi. Misalnya, jangan tentukan nama login dengan izin tingkat server, jika hanya izin tingkat database yang diperlukan; atau tidak menentukan akun pemilik database kecuali izin tersebut diperlukan.
Perhatian
Pernyataan EXECUTE AS dapat berhasil selama Mesin Database dapat menyelesaikan nama. Jika pengguna domain ada, Windows mungkin dapat mengatasi pengguna untuk Mesin Database, meskipun pengguna Windows tidak memiliki akses ke SQL Server. Ini dapat menyebabkan kondisi di mana login tanpa akses ke SQL Server tampaknya masuk, meskipun login yang ditiru hanya akan memiliki izin yang diberikan kepada publik atau tamu.
Menggunakan WITH NO REVERT
Ketika pernyataan EXECUTE AS menyertakan klausa WITH NO REVERT opsional, konteks eksekusi sesi tidak dapat diatur ulang menggunakan REVERT atau dengan menjalankan pernyataan EXECUTE AS lainnya. Konteks yang ditetapkan oleh pernyataan tetap berlaku hingga sesi dihilangkan.
Ketika klausa WITH NO REVERT COOKIE = @varbinary_variable ditentukan, Mesin Database SQL Server meneruskan nilai 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 sama.
Opsi ini berguna di lingkungan tempat pengumpulan koneksi digunakan. Pengumpulan koneksi adalah pemeliharaan sekelompok koneksi database untuk digunakan kembali oleh aplikasi di server aplikasi. Karena nilai yang diteruskan ke @varbinary_variable hanya diketahui oleh pemanggil pernyataan EXECUTE AS, pemanggil dapat menjamin bahwa konteks eksekusi yang mereka tetapkan tidak dapat diubah oleh orang lain.
Menentukan Login Asli
Gunakan fungsi ORIGINAL_LOGIN untuk mengembalikan nama login yang tersambung ke instans SQL Server. Anda dapat menggunakan fungsi ini untuk mengembalikan identitas login asli dalam sesi di mana ada banyak sakelar konteks eksplisit atau implisit.
Izin
Untuk menentukan EXECUTE AS pada login, pemanggil harus memiliki izin IMPERSONATE pada nama login yang ditentukan dan tidak boleh ditolak izin IMPERSONATE ANY LOGIN . Untuk menentukan EXECUTE AS pada pengguna database, pemanggil harus memiliki izin IMPERSONATE pada nama pengguna yang ditentukan. Ketika EXECUTE AS CALLER ditentukan, izin IMPERSONATE tidak diperlukan.
Contoh
J. Menggunakan EXECUTE AS dan REVERT untuk beralih konteks
Contoh berikut membuat tumpukan eksekusi konteks 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 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. Menggunakan klausa WITH COOKIE
Contoh berikut mengatur konteks eksekusi sesi ke pengguna tertentu dan menentukan klausa WITH COOKIE INTO @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(8000);
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(8000);
-- 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