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
SQL Server'da şu kullanıcı tanımlı modüllerin yürütme bağlamını tanımlayabilirsiniz: işlevler (satır içi tablo değerli işlevler hariç), yordamlar, kuyruklar ve tetikleyiciler.
Modülün yürütüldiği bağlamı belirterek, Veritabanı Altyapısı'nın modül tarafından başvurulan nesneler üzerindeki izinleri doğrulamak için hangi kullanıcı hesabını kullandığını denetleyebilirsiniz. Bu, kullanıcı tanımlı modüller ile bu modüller tarafından başvuruda bulunılan nesneler arasında var olan nesne zincirinde izinleri yönetme konusunda ek esneklik ve denetim sağlar. Kullanıcılara başvuruda bulunılan nesneler üzerinde açık izinler vermek zorunda kalmadan izinler yalnızca modülün kendisinde verilmelidir. Yalnızca modülün çalıştığı kullanıcının modül tarafından erişilen nesneler üzerinde izinleri olmalıdır.
Transact-SQL söz dizimi kuralları
Sözdizimi
Bu bölümde için EXECUTE ASSQL Server söz dizimi açıklanmaktadır.
İşlevler (satır içi tablo değerli işlevler hariç), saklı yordamlar ve DML tetikleyicileri:
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }
Veritabanı kapsamına sahip DDL tetikleyicileri:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }
Sunucu kapsamı ve oturum açma tetikleyicileri olan DDL tetikleyicileri:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }
Sıra:
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }
Arguments
ARA -YAN
Modülün içindeki deyimlerin, modülü çağıranın bağlamında yürütülür olduğunu belirtir. Modülü yürüten kullanıcının yalnızca modülün kendisinde değil, modül tarafından başvuruda bulunan tüm veritabanı nesnelerinde de uygun izinlere sahip olması gerekir.
CALLER , kuyruklar dışındaki tüm modüller için varsayılandır ve SQL Server 2005 (9.x) davranışıyla aynıdır.
CALLER veya CREATE QUEUEALTER QUEUE deyiminde belirtilemiyor.
SELF
EXECUTE AS SELF , belirtilen kullanıcının modülü oluşturan veya değiştiren kişi olduğu öğesine eşdeğerdir EXECUTE AS <user_name>. Modülleri oluşturan veya değiştiren kişinin gerçek kullanıcı kimliği, veya execute_as_principal_id katalog görünümündeki sütunda sys.sql_modulessys.service_queues depolanır.
SELF , kuyruklar için varsayılan değerdir.
Uyarı
Katalog görünümünde sütunun execute_as_principal_idsys.service_queues kullanıcı kimliğini değiştirmek için, deyiminde EXECUTE ASALTER QUEUE ayarı açıkça belirtmeniz gerekir.
SAHİP
Modülün içindeki deyimlerin, modülün geçerli sahibi bağlamında yürütüldüğünü belirtir. Modülün belirtilen sahibi yoksa, modülün şemasının sahibi kullanılır.
OWNER DDL veya oturum açma tetikleyicileri için belirtilemiyor.
Önemli
OWNER tek bir hesaba eşlenmelidir ve bir rol veya grup olamaz.
'user_name'
modülünün içindeki deyimleri user_name'de belirtilen kullanıcı bağlamında yürütür. Modüldeki tüm nesnelerin izinleri user_name karşı doğrulanır. user_name , sunucu kapsamına veya oturum açma tetikleyicilerine sahip DDL tetikleyicileri için belirtilemiyor. Bunun yerine login_name kullanın.
user_name geçerli veritabanında bulunmalı ve tek bir hesap olmalıdır.
user_name grup, rol, sertifika, anahtar veya , NT AUTHORITY\LocalServiceveya NT AUTHORITY\NetworkServicegibi NT AUTHORITY\LocalSystemyerleşik bir hesap olamaz.
Yürütme bağlamının kullanıcı kimliği meta verilerde depolanır ve veya execute_as_principal_id katalog görünümündeki sütunda sys.sql_modulessys.assembly_modules görüntülenebilir.
'login_name'
modülünün içindeki deyimleri , login_name belirtilen SQL Server oturum açma bilgileri bağlamında belirtir. Modüldeki tüm nesnelerin izinleri login_name karşı doğrulanır. login_name yalnızca sunucu kapsamına veya oturum açma tetikleyicilerine sahip DDL tetikleyicileri için belirtilebilir.
login_name , veya NT AUTHORITY\LocalServicegibi NT AUTHORITY\NetworkServiceNT AUTHORITY\LocalSystembir grup, rol, sertifika, anahtar veya yerleşik hesap olamaz.
Açıklamalar
Veritabanı Altyapısı'nın modülde başvuruda bulunan nesneler üzerindeki izinleri nasıl değerlendirdiğini, çağıran nesnelerle başvuruda bulunan nesneler arasında var olan sahiplik zincirine bağlıdır. SQL Server'ın önceki sürümlerinde, çağrı yapan kullanıcıya başvuruda bulunulmuş tüm nesnelere erişim vermek zorunda kalmamak için kullanılabilen tek yöntem sahiplik zinciriydi.
Sahiplik zincirinin sınırlamaları şunlardır:
- Yalnızca DML deyimleri için geçerlidir:
SELECT,INSERT,UPDATEveDELETE. - Çağrının sahipleri ve çağrılan nesneler aynı olmalıdır.
- Modülün içindeki dinamik sorgular için geçerli değildir.
Modülde belirtilen yürütme bağlamından bağımsız olarak, aşağıdaki eylemler her zaman geçerlidir:
Modül yürütülürken, Veritabanı Altyapısı önce modülü yürüten kullanıcının modül
EXECUTEüzerinde izni olduğunu doğrular.Sahiplik zincirleme kuralları uygulanmaya devam eder. Bu, çağıran ve çağrılan nesnelerin sahipleri aynıysa, temel alınan nesneler üzerinde hiçbir izin denetlenmediğini gösterir.
Bir kullanıcı dışında CALLERbir bağlamda çalıştırılacak şekilde belirtilen bir modülü yürüttüğünde, kullanıcının modülü yürütme izni denetlenirken, modül tarafından erişilen nesneler üzerinde ek izin denetimleri yan tümcesinde EXECUTE AS belirtilen kullanıcı hesabında gerçekleştirilir. Modülü yürüten kullanıcı, belirtilen kullanıcının kimliğine bürünüyor.
Modülün EXECUTE AS yan tümcesinde belirtilen bağlam yalnızca modül yürütme süresi boyunca geçerlidir. Modül yürütmesi tamamlandığında bağlam çağırana geri döner.
Kullanıcı veya oturum açma adı belirtme
Modülün EXECUTE AS yan tümcesinde belirtilen veritabanı kullanıcısı veya sunucu oturum açma bilgileri, modül başka bir bağlam altında yürütülecek şekilde değiştirilinceye kadar bırakılamaz.
Yan tümcesinde EXECUTE AS belirtilen kullanıcı veya oturum açma adı sırasıyla veya sys.database_principalsiçinde sys.server_principals sorumlu olarak bulunmalıdır, aksi halde modül oluşturma veya değiştirme işlemi başarısız olur. Ayrıca, modülü oluşturan veya değiştiren kullanıcının sorumlu üzerinde KIMLIĞE BÜRÜNme izinlerine sahip olması gerekir.
Kullanıcının windows grup üyeliği aracılığıyla SQL Server veritabanına veya örneğine örtük erişimi varsa, aşağıdaki gereksinimlerden biri mevcut olduğunda modül oluşturulduğunda yan tümcesinde EXECUTE AS belirtilen kullanıcı örtük olarak oluşturulur:
- Belirtilen kullanıcı veya oturum açma, sysadmin sabit sunucu rolünün bir üyesidir.
- Modülü oluşturan kullanıcının sorumlu oluşturma izni vardır.
Bu gereksinimlerin hiçbiri karşılanmadığında modül oluşturma işlemi başarısız olur.
Önemli
SQL Server (MSSQLSERVER) hizmeti yerel bir hesap (yerel hizmet veya yerel kullanıcı hesabı) olarak çalışıyorsa, yan tümcesinde EXECUTE AS belirtilen bir Windows etki alanı hesabının grup üyeliklerini alma ayrıcalıkları olmaz. Bu, modülün yürütülmesinin başarısız olmasına neden olur.
Örneğin, aşağıdaki koşulları varsayın:
CompanyDomain\SQLUsersgrubunun veritabanına erişimiSalesvardır.CompanyDomain\SqlUser1öğesininSQLUsersüyesidir ve bu nedenle veritabanına erişimiSalesvardır.Modülü oluşturan veya değiştiren kullanıcının sorumlu oluşturma izinleri vardır.
Aşağıdaki CREATE PROCEDURE deyim çalıştırıldığında, CompanyDomain\SqlUser1 örtük olarak veritabanında veritabanı sorumlusu Sales olarak oluşturulur.
USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT USER_NAME();
GO
EXECUTE AS CALLER tek başına deyimini kullanma
Yürütme bağlamını EXECUTE AS CALLER modülün çağıranı olarak ayarlamak için modül içindeki tek başına deyimini kullanın.
Aşağıdaki saklı yordamın tarafından SqlUser2çağrıldığını varsayalım.
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ümelerini tanımlamak için EXECUTE AS kullanma
Bir modül için yürütme bağlamı belirtmek, özel izin kümeleri tanımlamak istediğinizde yararlı olabilir. Örneğin, izin verilemez gibi TRUNCATE TABLE bazı eylemler. deyimini bir modüle TRUNCATE TABLE ekleyerek ve bu modülün tabloyu değiştirme izinleri olan bir kullanıcı olarak yürütülmesini belirterek, tabloyu kesme izinlerini modül üzerinde izinler sağladığınız EXECUTE kullanıcıya genişletebilirsiniz.
Modülün tanımını belirtilen yürütme bağlamıyla görüntülemek için sys.sql_modules katalog görünümünü kullanın.
En iyi uygulama
Modülde tanımlanan 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, bu izinler gerekli olmadıkça veritabanı sahibi hesabı belirtmeyin.
Permissions
ile EXECUTE ASbelirtilen bir modülü yürütmek için çağıranın modül üzerinde izinleri olmalıdır EXECUTE .
Ile EXECUTE AS belirtilen ve başka bir veritabanı veya sunucudaki kaynaklara erişen bir CLR modülünü yürütmek için, hedef veritabanı veya sunucu modülün kaynağı olan veritabanının (kaynak veritabanı) doğrulayıcısına güvenmelidir.
Bir modülü oluştururken veya değiştirirken yan tümcesini EXECUTE AS belirtmek için, belirtilen sorumlu üzerinde ve ayrıca modülü oluşturma izinlerine sahip IMPERSONATE olmanız gerekir. İstediğiniz zaman kendinizin kimliğine bürünebilirsiniz. Hiçbir yürütme bağlamı belirtilmediğinde veya EXECUTE AS CALLER belirtilmediğinde izinler IMPERSONATE gerekli değildir.
Windows grup üyeliği aracılığıyla veritabanına örtük erişimi olan bir login_name veya user_name belirtmek için, veritabanında izinlere sahip CONTROL olmanız gerekir.
Örnekler
Aşağıdaki örnek, AdventureWorks2025 veritabanında saklanan bir prosedür oluşturur ve yürütme bağlamını atar.OWNER
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