execute (Transact-sql)
Bir oturumun yürütme içeriği belirler.
Bir kullanıcı oturum açtığında ve kullanıcı oturumu kapattığında sona varsayılan bir oturum başlatır. Bir oturum sırasında tüm işlemleri izin denetimleri kullanıcı karşı tabidir. Ne zaman bir execute as deyimini çalıştırmak, oturumun yürütme içeriği için belirtilen oturum açma veya kullanıcı adı geçti. İçerik geçiş sonra execute as arayan kişi yerine bu hesabı için oturum açma ve kullanıcı güvenlik belirteçlerini izinleri gelmediğinin deyimi. Esas olarak, kullanıcı veya oturum açma hesabı oturum ya da modül yürütme süresi için özellikleri veya içerik anahtarı açıkça döndürülür.
Transact-SQL Sözdizim 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şkenler
LOGIN
Oturum açma özellikleri için yürütme içeriği belirtir. Sunucu düzeyinde kimliğe bürünme kapsamı nedir.[!NOT]
Bu seçenek içerilen bir veritabanında kullanılamaz.
KULLANICI
Geçerli veritabanında bir kullanıcı bağlamı özellikleri belirtir. Veritabanı için kimliğe bürünme kapsamı sınırlıdır. Veritabanı kullanıcı bağlamı geçin, kullanıcının sunucu düzeyinde izinleri devralmaz.Önemli Veritabanı kullanıcı bağlamı geçiş etkin durumdayken veritabanı dışına kaynaklara erişmek için herhangi bir girişimde deyimi başarısız olmasına neden olur. Bu kullanım içerir databasedeyimleri, dağıtılmış sorgular ve sorguları üç veya dört yarı tanımlayıcıları kullanır başka bir veritabanına başvuru.
'name'
Geçerli kullanıcı veya oturum açma adıdır. namebir üyesi olmanız sysadmin sabit sunucu rolü veya sorumlusu olarak mevcut sys.database_principals veya sys.server_principals, sırasıyla.nameYerel değişken olarak belirtilebilir.
namebir tek hesap olmalıdır ve bir grup, rol, sertifika, anahtar veya nt AUTHORITY\LocalService, nt AUTHORITY\NetworkService veya nt AUTHORITY\LocalSystem gibi yerleşik hesap olamaz.
Daha fazla bilgi için bkz: kullanıcı veya oturum açma adı belirtme bu konuda.
HİÇBİR GERİ DÖNDÜRME
İçerik geçiş önceki içerik geri döndürülmesi olamaz belirtir.Önceki içerik dönüştürme hakkında daha fazla bilgi için bkz: revert (Transact-sql).
COOKIE içine **@**varbinary_variable
Yürütme içeriği sadece döndürülmesi geri önceki içerik arama ile tanımlama bilgisi dönmek deyimi doğru içeriyorsa belirtir **@**varbinary_variable değer. Veritabanı Altyapısıİçin çerez geçer **@**varbinary_variable.**@**varbinary_variable is varbinary(8000).
[!NOT]
Çerez OUTPUTparametresi için geçerli olarak belgelenen varbinary(8000)doğru en fazla uzunluk olan. Ancak geçerli uygulama döndürür varbinary(100). Uygulamaları ayırmak varbinary(8000)böylece çerez boyutu artar bir sürümde dönerseniz düzgün çalışması uygulama devam ediyor.
ARAYAN
Modül içindeki deyimleri modülü arayan bağlamında yürütülür bir modül içinde kullanıldığında, belirtir.Dışında bir modülü kullanıldığında, hiçbir eylem deyimi vardır.
Açıklamalar
Yürütme içeriği değişikliği, aşağıdakilerden biri oluşana kadar etkin kalır:
Başka bir execute as deyimini çalıştırın.
Geri döndürme deyimini çalıştırın.
Oturum bırakılır.
Sen-ebilmek yaratmak bir yürütme içerik yığını execute as çağırarak deyimi birden çok kez üzerinde birden fazla sorumluları. Çağrıldığında, geri döndürme deyimini içeriğini oturum açma veya kullanıcı içerik yığını kadar sonraki düzeyin geçirir. Bu davranış bir gösteri için bakın örnek a.
Kullanıcı veya oturum açma adı belirtme
execute as içinde belirtilen kullanıcı veya oturum açma adı <context_specification> sorumlusu olarak mevcut olmalıdır sys.database_principals veya sys.server_principals, sırasıyla ya da execute deyimi başarısız olarak. Ayrıca, anapara özelliklerini Al izni verilmiş olması gerekir. Arayan veritabanı sahibi veya üyesi olduğu sürece sysadmin sabit sunucu rolü, asıl adı bile ne zaman kullanıcı veritabanı veya örneğini erişiyor bulunmalıdır SQL Serverbir Windows Grup üyeliği. Örneğin, aşağıdaki koşullar varsayılmaktadır:
CompanyDomain\SQLUsers grup erişimi olan Satış veritabanı.
Companydomain\sqluser1sqlusers üyesi olduğu SQLUsers ve bu nedenle, örtülü erişimi olan Satış veritabanı.
Her ne kadar Companydomain\sqluser1sqlusers veritabanı üyeliği yoluyla erişimi olan SQLUsers grup, deyim EXECUTE AS USER = 'CompanyDomain\SqlUser1' başarısız olur CompanyDomain\SqlUser1veritabanı sorumlusu yok.
Eğer kullanıcı artık (ilişkili oturumu artık var), ve kullanıcı ile oluşturulmamış WITHOUT LOGIN, EXECUTE ASkullanıcı için başarısız olur.
En iyi uygulama
Bir oturum açma veya oturum işlemleri gerçekleştirmek için gereken en az ayrıcalıklara sahip kullanıcının belirtin. Örneğin, sunucu düzeyinde izinleri olan oturum açma adı belirtmezseniz, yalnızca veritabanı düzeyinde izinler gereklidir; veya bu izinleri gerekli olmadıkça bir veritabanı sahibi hesabı belirtin.
Dikkat |
---|
execute as deyimi başarılı olarak Veritabanı Altyapısıadı çözebilirsiniz. Bir etki alanı kullanıcısı varsa, Windows kullanıcıdan çözmek mümkün olabilir Veritabanı Altyapısı, düz-se bile Windows kullanıcı erişimi yok SQL Server. Bu koşul için nerede oturum açma erişimi olmayan yol açabilir SQL Serverbürünülen giriş sadece kamu ya da misafir için verilen izinleri olurdu ama, oturum açmış görünmektedir. |
HİÇBİR geri döndürme ile kullanma
Ne zaman execute deyimi hiçbir Döndür baba, bir oturumun yürütme içeriği olamaz sıfırlamak geri al'ı kullanarak isteğe bağlı WITH içerir veya başka bir execute as deyimi yürütme. Oturumu kesilmeden kadar beyannamenin set içeriği etkiler içinde kalır.
Zaman ile hayır dönmek ÇEREZ = @varbinary\_variable yan tümcesi belirtilirse, SQL Server Veritabanı Altyapısı@ tanımlama bilgisi değerine geçervarbinary_variable. Eğer arama ÇEREZ ile dönmek deyimi yalnızca önceki içerik döndürülmesi yürütme içeriği ayarlar = @varbinary\_variable aynı deyimi içeren @varbinary\_variable değer.
Bu, hangi bağlantı havuzlaması kullanılan ortamlarda yararlı bir seçenektir. Bağlantı havuzu bakım veritabanı bağlantılarını yeniden bir uygulama sunucusundaki uygulamalar tarafından kullanılmak üzere bir grup olduğunu. Çünkü değeri geçti @varbinary\_variableyalnızca execute as arayan için bilinen deyimini arayan garanti onlar kurmak yürütme içeriği başkası tarafından değiştirilemez.
Özgün oturum açma belirleme
Kullanım ORIGINAL_LOGIN örneğine bağlı oturum açma adı dönmek için işlevi SQL Server. Çok açık veya örtülü bağlam anahtarları olan oturumlarda özgün oturum açma kimliğine dönmek için bu işlevi kullanabilirsiniz.
İzinler
execute as a giriş belirtmek için arayan belirtilen oturum açma adı özelliklerini Al izni olmalıdır. execute as bir veritabanı kullanıcı belirtmek için arayan belirtilen kullanıcı adına özelliklerini Al izni olmalıdır. execute as arayan belirtildiğinde özelliklerini Al izni gerekmez.
Örnekler
A.execute as kullanarak ve geri döndürme içeriğinde geçiş yapma
Aşağıdaki örnek, birden çok ilkeleri kullanarak içeriği yürütme yığın oluşturur. REVERTDeyimi sonra yürütme içeriği önceki çağrıyı sıfırlamak için kullanılır. REVERTDeyimi yürütüldüğünde birden çok kez hareket yukarı yığın yürütme içeriği özgün çağrıyı ayarlanıncaya kadar.
USE AdventureWorks2012;
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
USE AdventureWorks2012;
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.ÇEREZ ile yan tümcesi kullanarak
Aşağıdaki örnek, belirtilen kullanıcı için bir oturum yürütme içeriği belirler ve WITH no dönmek ÇEREZ belirtir = @varbinary\_variable fıkra. REVERTDeyimi geçirilen değer belirtmelidir @cookiedeğişken olarak EXECUTE ASsırt-e doğru arayan bağlamı başarıyla dönmek deyimi. Bu örneği çalıştırmak için login1giriş ve user1a gerekir mevcut örnekte oluşturulmuş kullanıcı.
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
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