AS YÜRÜT (Transact-SQL)
Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse Analytics
Oturumun yürütme bağlamını ayarlar.
Varsayılan olarak, oturum bir kullanıcı oturum açtığında başlar ve kullanıcı oturumu kapattığında biter. Oturum sırasındaki tüm işlemler bu kullanıcıya yönelik izin denetimlerine tabidir. EXECUTE AS deyimi çalıştırıldığında, oturumun yürütme bağlamı belirtilen oturum açma veya kullanıcı adına geçirilir. Bağlam anahtarından sonra, EXECUTE AS deyimini çağıran kişi yerine bu hesabın oturum açma ve kullanıcı güvenlik belirteçlerine göre izinler denetlenür. Temelde, oturum veya modül yürütme süresi boyunca kullanıcı veya oturum açma hesabı kimliğine bürünülür veya bağlam anahtarı açıkça geri döndürülür.
Transact-SQL söz dizimi kuralları
Sözdizimi
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Bağımsız değişken
OTURUM AÇMA
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Kimliğine bürünülecek yürütme bağlamını bir oturum açma bilgisi olarak belirtir. Kimliğe bürünme kapsamı sunucu düzeyindedir.
Not
Bu seçenek, kapsanan bir veritabanında, Azure SQL Veritabanı'nda veya Azure Synapse Analytics'te kullanılamaz.
KULLANICI
Kimliğine bürünülecek bağlamın geçerli veritabanındaki bir kullanıcı olduğunu belirtir. Kimliğe bürünme kapsamı geçerli veritabanıyla sınırlıdır. Veritabanı kullanıcısına bağlam anahtarı, o kullanıcının sunucu düzeyi izinlerini devralmıyor.
Önemli
Veritabanı kullanıcısına bağlam anahtarı etkin olsa da, veritabanının dışındaki kaynaklara erişme girişimi deyiminin başarısız olmasına neden olur. Buna USE veritabanı deyimleri, dağıtılmış sorgular ve üç veya dört bölümlü tanımlayıcılar kullanan başka bir veritabanına başvuran sorgular dahildir.
'adı' Geçerli bir kullanıcı veya oturum açma adıdır. adsysadmin sabit sunucu rolünün üyesi olmalıdır veya sırasıyla sys.database_principals veya sys.server_principals'da sorumlu olarak bulunmalıdır.
ad yerel değişken olarak belirtilebilir.
ad tek bir hesap olmalıdır ve NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService veya NT AUTHORITY\LocalSystem gibi bir grup, rol, sertifika, anahtar veya yerleşik hesap olamaz.
Daha fazla bilgi için, bu konunun devamında Kullanıcı veya Oturum Açma Adı Belirtme
GERI DÖNDÜRME YOK
Bağlam anahtarının önceki bağlama geri döndürülemeyeceğini belirtir.
GERI DÖNDÜRME seçeneği yalnızca geçici düzeyde kullanılabilir.
Önceki bağlama geri dönme hakkında daha fazla bilgi için bkz.
TANıMLAMA BILGISI INTO @varbinary_variable
Yürütme bağlamını yalnızca çağıran REVERT WITH COOKIE deyimi doğru @varbinary_variable değerini içeriyorsa önceki bağlama geri döndürülebileceğini belirtir. Veritabanı Altyapısı tanımlama bilgisini @varbinary_variablegeçirir.
COOKIE INTO seçeneği yalnızca geçici düzeyde kullanılabilir.
@varbinary_variablevarbinary(8000).
Not
için tanımlama bilgisi OUTPUT parametresi şu anda doğru maksimum uzunluk olan varbinary(8000) olarak belgelenmiştir. Ancak geçerli uygulama
ARA -YAN
Modül içinde kullanıldığında, modülün içindeki deyimlerin modülü çağıranın bağlamında yürütülür olduğunu belirtir.
Bir modülün dışında kullanıldığında deyiminin hiçbir eylemi yoktur.
Not
Bu seçenek Azure Synapse Analytics'te kullanılamaz.
Açıklamalar
Yürütme bağlamındaki değişiklik, aşağıdakilerden biri gerçekleşene kadar geçerli kalır:
Başka bir EXECUTE AS deyimi çalıştırılır.
REVERT deyimi çalıştırılır.
Oturum bırakılır.
Komutun yürütüldüğü saklı yordam veya tetikleyici çıkar.
Execute AS deyimini birden çok sorumlu arasında birden çok kez çağırarak bir yürütme bağlam yığını oluşturabilirsiniz. Çağrıldığında, REVERT deyimi bağlamı bağlam yığınında bir sonraki düzeydeki oturum açma veya kullanıcıya geçirir. Bu davranışın bir gösterimi için bkz. Örnek A.
Kullanıcı veya Oturum Açma Adı Belirtme
EXECUTE AS <context_specification>'de belirtilen kullanıcı veya oturum açma adı sırasıyla sys.database_principals veya sys.server_principals'da sorumlu olarak bulunmalıdır veya EXECUTE AS deyimi başarısız olur. Ayrıca, sorumlu üzerinde KIMLIĞE BÜRÜN izinleri verilmelidir. Çağıran veritabanı sahibi değilse veya sysadmin sabit sunucu rolünün üyesi değilse, kullanıcı sql server veritabanına veya örneğine bir Windows grup üyeliği aracılığıyla erişirken bile sorumlunun mevcut olması gerekir. Örneğin, aşağıdaki koşulları varsayın:
CompanyDomain\SQLUsers grubunun Sales veritabanına erişimi vardır.
CompanyDomain\SqlUser1, SQLUsers üyesidir ve bu nedenle Sales veritabanına örtük erişime sahiptir.
CompanyDomain\SqlUser1SQLUsers grubu üyeliği aracılığıyla veritabanına erişimi olsa da, CompanyDomain\SqlUser1
veritabanında sorumlu olarak bulunmadığından EXECUTE AS USER = 'CompanyDomain\SqlUser1'
deyimi başarısız olur.
Kullanıcı yalnız bırakılmışsa (ilişkili oturum açma bilgileri artık mevcut değilse) ve kullanıcı OTURUM AÇMADAN ile oluşturulmadıysa AS YÜRÜT kullanıcı için başarısız olur.
En İyi Yöntem
Oturumdaki işlemleri gerçekleştirmek için gereken en düşük ayrıcalıklara sahip bir oturum açma veya kullanıcı belirtin. Örneğin, yalnızca veritabanı düzeyinde izinler gerekiyorsa, sunucu düzeyinde izinlere sahip bir oturum açma adı belirtmeyin; veya bu izinler gerekli olmadıkça bir veritabanı sahibi hesabı belirtmeyin.
Dikkat
Database Engine adı çözümleyebildiği sürece EXECUTE AS deyimi başarılı olabilir. Bir etki alanı kullanıcısı varsa, Windows kullanıcısının SQL Server'a erişimi olmasa bile Windows, Veritabanı Altyapısı için kullanıcıyı çözümleyebiliyor olabilir. Bu, SQL Server'a erişimi olmayan bir oturum açmanın oturum açmış gibi görünmesine neden olabilir, ancak kimliğine bürünülen oturum açma yalnızca genel veya konuk için verilen izinlere sahip olur.
GERI DÖNDÜRME OLMADAN kullanma
EXECUTE AS deyimi isteğe bağlı WITH NO REVERT yan tümcesini içerdiğinde, bir oturumun yürütme bağlamı REVERT kullanılarak veya başka bir EXECUTE AS deyimi yürütülerek sıfırlanamaz. Deyimi tarafından ayarlanan bağlam, oturum bırakılana kadar etkin kalır.
DEĞİrMEYİ İLE DÖN TANıMLAMA BILGISI = @varbinary_variable yan tümcesi belirtildiğinde, SQL Server Veritabanı Altyapısı tanımlama bilgisi değerini @varbinary_variablegeçirir. Bu deyim tarafından ayarlanan yürütme bağlamı ancak çağıran COOKIE ile GERI DÖN = @varbinary_variable deyimi aynı @varbinary_variable değerini içeriyorsa önceki bağlama geri döndürülebilir.
Bu seçenek, bağlantı havuzunun kullanıldığı bir ortamda kullanışlıdır. Bağlantı havuzu, bir veritabanı bağlantısı grubunun uygulama sunucusundaki uygulamalar tarafından yeniden kullanılması için bakımıdır. @varbinary_variable geçirilen değer yalnızca EXECUTE AS deyiminin çağıranı tarafından bilindiğinden, çağıran, oluşturdukları yürütme bağlamının başka hiç kimse tarafından değiştirilemeyeceğini garanti edebilir.
Özgün Oturum Açma Bilgilerini Belirleme
SQL Server örneğine bağlı oturum açma bilgilerinin adını döndürmek için ORIGINAL_LOGIN işlevini kullanın. Birçok açık veya örtük bağlam anahtarının bulunduğu oturumlarda özgün oturum açma kimliğini döndürmek için bu işlevi kullanabilirsiniz.
İzinler
Bir oturum açmada
Örnekler
A. Bağlamı değiştirmek için EXECUTE AS ve REVERT kullanma
Aşağıdaki örnek, birden çok sorumlu kullanarak bir bağlam yürütme yığını oluşturur.
REVERT
deyimi daha sonra yürütme bağlamını önceki çağırana sıfırlamak için kullanılır.
REVERT
deyimi, yürütme bağlamı özgün çağıran olarak ayarlanana kadar yığın yukarı taşınarak birden çok kez yürütü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 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. WITH COOKIE yan tümcesini kullanma
Aşağıdaki örnek, oturumun yürütme bağlamını belirtilen bir kullanıcıya ayarlar ve WITH COOKIE INTO @varbinary_variable yan tümcesini belirtir.
REVERT
deyimi, bağlamı çağırana geri döndürmek için EXECUTE AS
deyimindeki @cookie
değişkenine geçirilen değeri belirtmelidir. Bu örneği çalıştırmak için, A örneğinde oluşturulan login1
oturum açma ve user1
kullanıcı bulunmalıdır.
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