Aracılığıyla paylaş


Yan (Transact-SQL) yürütme

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

Modül yürütüldüğünde içerik belirterek, hangi kullanıcı hesabını kontrol edebilirsiniz Veritabanı Altyapısı kullanan tarafından başvurulan nesnelerin izinlerini doğrulamak içinmodül.Bu ek esneklik ve kullanıcı tanımlı modülleri ve bu modülleri tarafından başvurulan nesneler arasında var olan nesne zincirinin izinleri yönetme kontrol sağlar.Başvurulan nesneler üzerinde açık izinler vermek kalmadan yalnızca modülde kendisi, kullanıcılara izinler verilmelidir.Modül olarak çalıştığı kullanıcı modülü tarafından erişilen nesneleri izinlerine sahip olmalısınız.

Konu bağlantısı simgesiTransact-SQL sözdizimi 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ı, yalnızca modülde, aynı zamanda bir modül tarafından başvurulan herhangi bir veritabanı nesnesini iznine sahip olmalısınız.

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

    ARAYAN bir kuyruk oluşturma veya SIRA alter deyimbelirtilemez.

  • SELF
    execute as self execute as eşdeğer user_name, burada belirtilen kullanıcı, kişi oluşturma veya değiştirme modülü.Oluşturma veya modülleri değiştirme kişinin gerçek kullanıcı kimliği saklanan execute_as_principal_id sütun sql_dependencies veya sys.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 , sys.service_queues Katalog görünümü, SIRA alter deyimayarı olarak execute açıkça belirtmelisiniz.

  • SAHİBİ
    Modül içindeki deyimleri modülü geçerli sahibinin bağlamında yürütür belirtir.Belirtilen sahip modülü yoksa, modülün şema sahibini kullanılır.SAHİBİ için DDL veya oturum açma tetikleyici belirtilemez.

    Önemli notÖnemli

    SAHİBİ bir singleton hesabına eşlenmelidir ve rol ya da grup olamaz.

  • 'user_name'
    Belirtilen kullanıcı bağlamında modül yürütmek içindeki ifadeler belirtir user_name.Modül içindeki tüm nesneleri için izinleri karşı doğrulandığından user_name.user_name Sunucu kapsam DDL Tetikleyiciler veya oturum açma Tetikleyiciler için belirtilemez.Use login_name bunun yerine.

    user_nameGeçerli veritabanında bulunması gerekir ve bir singleton hesabı olması gerekir.user_nameGrup, rol, sertifika, anahtarveya 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 veriler verilerde depolanır ve görüntülenebilir execute_as_principal_id sütun sql_dependencies veya sys.assembly_modules Katalog görünümü.

  • 'login_name'
    Modül yürütmek içindeki ifadeler bağlamında belirtir SQL Server öğesinde belirtilen oturum açma login_name.Modül içindeki tüm nesneleri için izinleri karşı doğrulandığından login_name.login_name yalnızca sunucu kapsam DDL Tetikleyiciler veya oturum açma Tetikleyiciler için belirtilebilir.

    login_nameGrup, rol, sertifika, anahtarveya 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 nesnelerin izinlerini değerlendirir modülü nesneleri ve başvurulan nesnelere çağrı arasında bulunan sahiplik zinciri bağlıdırÖnceki sürümlerinde SQL Server, sahiplik zincirleme kullanabileceğiniz tek yöntem önlemek gerek kullanıcıya vermek arayan kullanıcı erişimini tüm başvurulan nesneler.

Sahiplik zincirleme aşağıdaki sınırlamalara sahiptir:

  • Yalnızca DML deyimlerini geçerlidir: SEÇİN, Ekle, güncelleştir ve Sil.

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

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

Sahipliği zincir oluşturma hakkında daha fazla bilgi için bkz: Sahiplik Chains.

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

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

  • Sahiplik zincirleme kuralları uygulamaya devam edin.Yani, çağıran ve çağrılan nesnelerin sahiplerini aynıysa, alttaki nesneler izin yok denetlenir.

Kullanıcı ARAYAN dışındaki bir bağlamda çalıştırmak için belirtilen bir modül yürütüldüğünde, kullanıcının iznini modül yürütmek için denetlenir, ancak ek izinler denetimleri modülü tarafından erişilen nesneler üzerinde execute as belirtilen kullanıcı hesabının karşı gerçekleştirilen yan tümce.Modül yürütme, gerçekte, belirtilen kullanıcı kimliğine bürünülüyor kullanıcıdır.

yan tümce modülü yalnızca modülü yürütme süresi için geçerli olduğu gibi yürütme belirtilen bağlamı.İçerik Modülü yürütme tamamlandığında çağırana geri döner.Bir modül yürütme içeriği değiştirme hakkında daha fazla bilgi için bkz: execute as modüller içinde kullanma.

Bir kullanıcı veya oturum açma adı belirtme

yan tümce bir modülün modül kadar kesilmesini edemiyor gibi yürütme içinde belirtilen veritabanı kullanıcı veya sunucu oturumu başka bağlamında yürütmek için değiştirildi.

execute as yan tümce tümcesinde belirtilen kullanıcı veya oturum açma adı, bir asıl olarak mevcut olmalıdır 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 olur.Ayrıca, oluşturan veya değiştiren modülü kullanıcı özelliklerini Al izinleri patron sunucu üzerinde olması gerekir.

Kullanıcı veritabanı veya örnek örtülü erişimi olup olmadığını SQL Server yan tümce modülü oluşturulduğunda örtük olarak oluşturulur gibi Windows Grup üyeliği ile execute içinde ne zaman aşağıdaki gereksinimlerden biri var belirtilen kullanıcı:

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

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

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

Önemli notÖnemli

SQL Server (mssqlserver) hizmet , yerel çalışırken onu ayrıcalıklarına sahip değilsiniz execute as belirtilen bir Windows etki alanı hesabı grup üyeliklerini almak için hesap (local hizmet veya yerel kullanıcı hesabı) yan tümce.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\SqlUser1 üye olduğu SQLUsers ve bu nedenle, erişimi olan Satış veritabanı.

  • Oluşturma veya değiştirme modülü kullanıcı ilkeleri oluşturma izinlerine sahip olur.

Zaman aşağıdaki CREATE PROCEDURE deyim çalıştırıldığında, CompanyDomain\SqlUser1 dolaylı bir veritabanı sorumlusu oluşturulur Sales veritabanı.

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 kullanarak

execute as ARAYAN tek başına deyim içinde bir modül Arayana modül yürütme içeriği küme için kullanın.

Aşağıdaki saklı yordam çağıran varsayalım 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

Özel izin kümeleri tanımlamak için execute as kullanarak

Özel izin tanımlamak istediğinizde bir modül yürütme içeriği çok yararlı olabilir belirten ayarlar.Örneğin, truncate table gibi bazı eylemler grantable izni yok.truncate table deyim bir modül içinde ekleme ve tablodeğiştirme izinlerine sahip bir kullanıcı olarak bu modül yürütmek belirterek, izinleri modülü yürütme izinlerini vermek için kullanıcı tablo kesecek şekilde genişletebilirsiniz.Daha fazla bilgi için, bkz. execute as özel izin kümeleri oluşturmak için kullanma.

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

En iyi

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

İzinler

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

execute as ile belirtilen bir clr modül yürütmek için başka bir veritabanındaki kaynaklarına erişen veya sunucu, hedef veritabanı veya sunucu Modülü ( kaynak veritabanı) kaynaklandığı veritabanının doğrulayıcı güvenmelidir.doğrulayıcı güven hakkında daha fazla bilgi için bkz: execute as kullanarak veritabanı kimliğe bürünme genişletme.

execute as belirtmek için yan tümce oluşturmak veya bir modül değiştirdiğinizde, olması gerekir belirtilen anapara özelliklerini Al izinleri ve ayrıca modül oluşturma izinleri.Kendinizi her zaman 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_name veya user_name örtülü veritabanı Windows Grup üyeliği yoluyla erişimi olan, sahip olmalı, Denetim izinlerini veritabanı.

Örnekler

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

USE AdventureWorks2008R2;
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