execute as yan tümcesi (Transact-sql)

De SQL Server, aşağıdaki kullanıcı tanımlı modül yürütme içeriği tanımlayabilirsiniz: işlevleri (dışında satır içi tablo değerli işlevler), yordamlar, sıralarını ve Tetikleyicileri.

Modülü çalıştırılır bağlam belirterek, hangi kullanıcı hesabını kontrol edebilirsiniz Veritabanı Altyapısımodülü tarafından başvurulan nesneler izinleri doğrulamak için kullanır. Bu ek esneklik ve denetim yetkilerinin üzerinde kullanıcı tanımlı modülleri ve bu modüller tarafından başvurulan nesneler arasında varolan nesne zinciri içinde sağlar. Onları başvurulan nesneler izinleri vermek zorunda kalmadan yalnızca modülü kendisi, kullanıcılara izinler verilmelidir. Modül olarak çalıştığı kullanıcı modülü tarafından erişilen nesneler izinleri olmalıdır.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

Functions (except inline table-valued functions), Stored Procedures, and DML Triggers
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' } 

DDL Triggers with Database Scope
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' } 

DDL Triggers with Server Scope and logon triggers
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' } 

Queues
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' } 

Bağımsız değişkenler

  • ARAYAN
    Modül içindeki deyimleri modülü arayan bağlamında yürütülür belirtir. Modül yürütme kullanıcı modülü kendisi değil sadece, aynı zamanda modülü tarafından başvurulan veritabanı nesneleri üzerinde uygun izinleriniz olmalıdır.

    ARAYAN sıraları dışında tüm modülleri için varsayılandır ve aynı SQL Server 2005davranış.

    ARAYAN queue create veya alter queue deyiminde belirtilemez.

  • KENDİNİ
    execute as self execute as için eşdeğer user_name, burada belirtilen kullanıcı oluşturma veya değiştirme modülü kişi. Oluşturma veya değiştirme modülü kişinin gerçek kullanıcı kimliği saklanan execute_as_principal_id sütununda sys.sql_modules ya execute_as_principal_idsys.service_queues Katalog görünümü.

    self sıralar için varsayılandır.

    [!NOT]

    Kullanıcı kimliğini değiştirmek için execute_as_principal_id de execute_as_principal_idsys.service_queues Katalog görünümü, açıkça alter queue deyiminde ayarı olarak execute belirtmeniz gerekir.

  • SAHİBİ
    Modül içindeki deyimleri modülü geçerli sahibi bağlamında yürütür belirtir. Modül belirtilen sahip değilse, şema modülü sahibi kullanılır. SAHİBİ için ddl ya da logon tetikleyici belirtilemez.

    Önemli notÖnemli

    SAHİBİ, bir tek hesabına eşlenmelidir ve rol veya grup olamaz.

  • 'user_name'
    Modül içindeki deyimleri yürütme içinde belirtilen kullanıcı bağlamında belirtir user_name. Modül içindeki tüm nesneleri için izinleri onaylı karşı user_name. user_name Sunucu kapsamlı ddl Tetikleyicileri veya oturum açma Tetikleyiciler için belirtilemez. Kullanım login_name yerine.

    user_namegeçerli veritabanında bulunması gerekir ve bir tek hesabı olması gerekir. user_nameGrup, rol, sertifika, anahtar veya nt AUTHORITY\LocalService, nt AUTHORITY\NetworkService veya nt AUTHORITY\LocalSystem gibi yerleşik hesap olamaz.

    Yürütme içeriği kullanıcı kimliğini meta verilerde depolanır ve görüntülenebilir execute_as_principal_id sütununda sys.sql_modules ya sys.assembly_modules Katalog görünümü.

  • 'login_name'
    Modül içindeki deyimleri yürütme bağlamında belirtir SQL Serveroturum açma belirtilen login_name. Modül içindeki tüm nesneleri için izinleri onaylı karşı login_name. login_name yalnızca sunucu kapsamlı ddl Tetikleyicileri veya oturum açma Tetikleyiciler için belirtilebilir.

    login_nameGrup, rol, sertifika, anahtar veya nt AUTHORITY\LocalService, nt AUTHORITY\NetworkService veya nt AUTHORITY\LocalSystem gibi yerleşik hesap olamaz.

Açıklamalar

Nasıl Veritabanı Altyapısıiçinde başvurulan nesneler izinleri değerlendirir ve başvurulan nesneler arama arasında mevcut sahiplik zinciri modülü bağlıdır. Önceki sürümlerinde SQL Server, sahipliği zincirleme olarak tüm başvurulan nesneler arama kullanıcı erişimi vermek zorunda kalmamak kullanabileceğiniz tek yöntem.

Sahipliği zincir aşağıdaki sınırlamalara sahiptir:

  • Yalnızca dml deyimleri geçerlidir: select, INSERT, update ve delete.

  • Çağıran ve çağrılan nesnelerin sahiplerini aynı olması gerekir.

  • Modül içinde dinamik sorguları için geçerli değildir.

Modülünde belirtilen yürütme içeriği ne olursa olsun, her zaman aşağıdaki işlemler uygulanır:

  • Modül çalıştırıldığında, Veritabanı Altyapısıilk modül yürütme kullanıcı modülü üzerinde execute izni olduğunu doğrular.

  • Sahiplik zincirleme kuralları sürdürür. Buna göre çağıran ve çağrılan nesnelerin sahiplerini aynı ise, alttaki nesneler izin yok denetlenir.

Kullanıcı dışında arayan bağlamında çalıştırmak için belirtilen bir modül yürütüldüğünde, modül yürütmek için kullanıcının iznini kontrol edilir, ancak ek izinleri kontrol modülü tarafından erişilen nesneler üzerinde execute as içinde belirtilen kullanıcı hesabının karşı yapılma yan tümcesi. Modül yürütme kullanıcı, is in effect, belirtilen kullanıcı kimliğine bürünülüyor.

execute as yan tümcesi modülü sadece modül yürütme süresi için geçerlidir belirtilen içeriği. Modül yürütme tamamlandığında içerik arayan kişiye geri döner.

Kullanıcı veya oturum açma adı belirtme

Yan bir modül modül kadar bırakılan execute içinde belirtilen veritabanı kullanıcı veya sunucu oturumu, altında başka bir içeriği yürütmek için değiştirildi.

execute as yan tümcesi belirtilen kullanıcı veya oturum açma adı sorumlusu olarak varolması gerekir sys.database_principals veya sys.server_principals, sırasıyla veya başka oluşturma veya değiştirme modülü işlemi başarısız. Ayrıca, oluşturur veya değiştirir modülü kullanıcı anapara özelliklerini Al izni olmalıdır.

Kullanıcı veritabanı veya örneğini örtülü erişimi olup olmadığını SQL Serveras yan tümcesi modülü oluşturulduğunda örtük olarak oluşturulur Windows Grup üyeliği, execute ne zaman aşağıdaki gereksinimleri biri belirtilen kullanıcı:

  • Belirtilen kullanıcı veya oturum açma üyesi olduğu sysadmin sunucu rolü.

  • Modül oluşturma kullanıcı ilkeleri oluşturma izni vardır.

Bu şartların hiçbiri karşılandığında modül oluşturma işlemi başarısız olur.

Önemli notÖnemli

Eğer SQL Server(mssqlserver) hizmeti çalıştıran yerel değil execute as içinde belirtilen Windows etki alanı hesabı grup üyeliklerini almak için ayrıcalıkları olacak hesap (Yerel hizmet veya yerel kullanıcı hesabı), yan. Bu yürütme modülü başarısız olmasına neden olur.

Ö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 erişimi Satış veritabanı.

  • Oluşturma veya değiştirme modülü kullanıcı ilkeleri oluşturma izinleri vardır.

Zaman aşağıdaki CREATE PROCEDUREdeyimi çalıştırmak, CompanyDomain\SqlUser1örtülü veritabanı olarak asıl olarak oluşturulan Salesveritabanı.

USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT user_name();
GO

USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT user_name();
GO

execute as arayan tek başına deyimi kullanma

execute as arayan tek başına deyimi içinde bir modül yürütme içeriği arayan için ayarlamak için kullanın.

Aşağıdaki saklı yordam denir kabul SqlUser2.

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'SqlUser1'
AS
SELECT user_name(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.
REVERT;
SELECT user_name(); -- Shows execution context is set to SqlUser1.
GO

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'SqlUser1'
AS
SELECT user_name(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.
REVERT;
SELECT user_name(); -- Shows execution context is set to SqlUser1.
GO

Özel izin kümeleri tanımlamak için EXECUTE'ı kullanma

Ayarlar belirtme özel izin tanımlamak istediğiniz bir modül yürütme içeriği çok yararlı olabilir. Örneğin, truncate table gibi bazı eylemler c.Grantable izinleri yoktur. truncate table deyimi içinde bir modül ve bu modül execute Tablo değiştirme iznine sahip bir kullanıcı olarak belirterek birleşmeyle modül execute izinleri verdiğiniz kullanıcı tablo kesecek şekilde izinler genişletebilirsiniz.

Belirtilen yürütme içeriği modülüyle tanımını görüntülemek için sys.sql_modules (Transact-sql)Katalog görünümü.

En iyi uygulama

Bir oturum açma veya kullanıcı modülünde tanımlanan işlemleri gerçekleştirmek için gereken en az ayrıcalıklara sahip belirtin. Bu izinleri gerekli olmadıkça, bir veritabanı sahibi hesabı belirtin.

İzinler

execute as ile belirtilen bir modül yürütmek için arayan modülü yürütme izinleri olmalıdır.

Başka bir veritabanı veya sunucu, hedef kaynaklara erişen execute as ile belirtilen clr modül yürütmek için veritabanı veya Sunucu doğrulayıcı modülüne (kaynak veritabanı) kaynaklandığı veritabanının güvenmesi gerekir.

execute as belirtmek için yan tümcesi, bir modül oluşturduğunuzda veya değiştirdiğinizde olması gerekir özelliklerini Al izni belirtilen anapara ve ayrıca modül oluşturma izinleri. Her zaman kendinizi bürünebilir. Yürütme içeriği yok belirtilir veya execute as arayan belirtilen özelliklerini Al izni gerekmez.

Belirtmek için bir login_nameya user_nameörtülü veritabanı Windows Grup üyeliği yoluyla erişimi olan, veritabanı üzerinde denetim izinleriniz olmalıdır.

Örnekler

Aşağıdaki örnek, bir saklı yordam oluşturur ve yürütme içeriği atar OWNER.

USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.uspEmployeesInDepartment 
@DeptValue int
WITH EXECUTE AS OWNER
AS
    SET NOCOUNT ON;
    SELECT e.BusinessEntityID, c.LastName, c.FirstName, e.JobTitle
    FROM Person.Person AS c 
    INNER JOIN HumanResources.Employee AS e
        ON c.BusinessEntityID = e.BusinessEntityID
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.BusinessEntityID = edh.BusinessEntityID
    WHERE edh.DepartmentID = @DeptValue
    ORDER BY c.LastName, c.FirstName;
GO

-- Execute the stored procedure by specifying department 5.
EXECUTE HumanResources.uspEmployeesInDepartment 5;
GO

Ayrıca bkz.

Başvuru

sys.assembly_modules (Transact-sql)

sys.sql_modules (Transact-sql)

execute_as_principal_idsys.service_queues (Transact-sql)

revert (Transact-sql)

execute (Transact-sql)