Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure 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. Bir EXECUTE AS ifade çalıştırıldığında, oturumun yürütme bağlamı belirtilen giriş veya kullanıcı adına aktarılır. Bağlam değişikliğinden sonra, izinler, o hesabın giriş ve kullanıcı güvenlik tokenları ile kontrol edilir, açıklamayı EXECUTE AS çağıran kişi yerine kontrol edilir. 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
LOGIN
Applies to: 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ı veya Azure Synapse Analytics kullanılamaz.
USER
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
HAYIR REVERT
Bağlam anahtarının önceki bağlama geri döndürülemeyeceğini belirtir.
HAYIR REVERT 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.REVERT (Transact-SQL)
TANıMLAMA BILGISI INTO @varbinary_variable
Uygulama bağlamının yalnızca çağrı WITH COOKIE ifadesi doğru @varbinary_variable değerini içeriyorsa REVERT önceki bağlama geri döndürülebileceğini belirtir. Database Engine tanımlama bilgisini @varbinary_variable geç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'da 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 EXECUTE AS bir açıklama ise koşu.
Bir REVERT açıklama yapılıyor.
Oturum bırakılır.
Komutun yürütüldüğü saklı yordam veya tetikleyici çıkar.
Birden fazla prensip üzerinde ifadeyi EXECUTE AS birden fazla kez çağırarak bir yürütme bağlamı yığını oluşturabilirsiniz. Çağrıldığında, ifade REVERT bağlamı bağlam yığınında bir sonraki seviyedeki girişe veya kullanıcıya değiştirir. Bu davranışın bir gösterimi için bkz. Örnek A.
Kullanıcı veya Oturum Açma Adı Belirtme
context_specification'de> belirtilen EXECUTE AS<kullanıcı veya giriş adı, sırasıyla sys.database_principals veya sys.server_principals'de bir ana madde olarak bulunmalıdır, aksi takdirde ifade EXECUTE AS 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 bir üyesi değilse, kullanıcı Windows grup üyeliği aracılığıyla veritabanına veya SQL Server örneğine erişirken bile sorumlu bulunmalıdır. Ö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, EXECUTE AS USER = 'CompanyDomain\SqlUser1' veritabanında sorumlu olarak bulunmadığından CompanyDomain\SqlUser1 deyimi başarısız olur.
Kullanıcı yetim kaldıysa (ilgili giriş artık yoksa) ve kullanıcı WITHOUT LOGINile oluşturulmadıysa, EXECUTE AS 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
Bu EXECUTE AS ifade başarılı olabilir, yeter ki Database Engine ismi çözebilsin. Bir etki alanı kullanıcısı varsa, Windows kullanıcının SQL Server erişimi olmasa bile Windows Database Engine için kullanıcıyı çözümleyebilecektir. Bu, SQL Server 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.
Güvenlik konuları
Dbo sahiplik bağlamında çalıştırmak, örneğin ifadeyi EXECUTE AS USER = 'dbo'kullanarak , açık DENY izinlerin nasıl değerlendirildiğini değiştirir. Yürütme bağlamını dbo sahiplik bağlamına çevirdiğinizde, orijinal çağrı yöneticisine uygulanan izin temelli DENY kısıtlamalar taklit süresi boyunca uygulanmaz. Sonuç olarak, uygulama bağlamını dbo'ya geçirebilen bir yönetici, örneğin db_owner sabit veritabanı rolünde üyelik sayesinde, aksi takdirde o prensipe uygulanan DENY açık izinlerle engellenecek işlemleri gerçekleştirebilir.
Bu davranış tasarım gereğidir. Sahipliğin kimliğe bürünülebilmesine izin veren izinler verirken bunu dikkate alın. DENY İzinler, DBO olarak yürütebilen yöneticilerin etkin izinlerini sınırlamak için telafi edici bir kontrol olarak hizmet edemez.
HIÇ KULLANMA REVERT
Eğer ifade EXECUTE AS isteğe bağlı WITHOUT REVERT NO maddesini içerdiğinde, bir oturumun yürütme bağlamı başka EXECUTE AS bir ifade kullanılarak REVERT veya çalıştırılarak sıfırlanamaz. Deyimi tarafından ayarlanan bağlam, oturum bırakılana kadar etkin kalır.
ÇEREZSİZ REVERT = @varbinary_variable maddesi belirtildiğinde, SQL Server Database Engine çerez değerini @varbinary_variable'ye iletir. Bu ifadeyle belirlenen yürütme bağlamı, yalnızca WITH COOKIE = @varbinary_variable ifadesi çağrısı REVERT 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'ye iletilen değer yalnızca ifade EXECUTE AS arayan tarafından bilindiği için, arayan oluşturduğu uygulama bağlamının başka 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
Giriş sırasında belirtmek EXECUTE AS için, arayan kişinin belirtilen giriş adında IMPERSONATE iznine sahip olması gerekir ve IMPERSONATE HERÇİR LOGIN izin verilmemelidir. Bir veritabanı kullanıcısını belirtmek EXECUTE AS için, arayan kişinin belirtilen kullanıcı adında IMPERSONATE izinlerine sahip olması gerekir. CALLER belirtildiğindeEXECUTE AS, IMPERSONATE izinleri gerekmez.
Örnekler
A. Bağlamı değiştirmek için ve EXECUTE ASREVERT kullanmak
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 @cookie deyimindeki EXECUTE AS 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