Öğretici: Sahiplik chains ve içeriği değiştirme
Bu öğretici bir senaryo göstermek için kullanır. SQL Server güvenlik kavramlarını sahipliği zincirlerini ve kullanıcı bağlamını değiştirme. Sahiplik zincirlerini hakkında daha fazla bilgi için bkz: Sahiplik chains. Bağlam geçişi hakkında daha fazla bilgi için bkz: Içerik (Veritabanı Altyapısı) değiştirme.
Not
Kodu her iki karma mod güvenliği, yapılandırılmış olması gerekir, bu öğreticide çalıştırmak için AdventureWorks veritabanı yüklü.Karma mod güvenliği hakkında daha fazla bilgi için bkz: Kimlik Doğrulaması Modu Seçme.
Senaryosu
Bu senaryoda, iki kullanıcı hesaplarını depolanan bir satınalma siparişi verilerine erişmek için gereken AdventureWorks veritabanıdır.Gereksinimleri aşağıdaki gibidir:
Ilk hesap (TestManagerUser) her satınalma siparişindeki tüm ayrıntıları görebilmeniz gerekir.
Ikinci hesabı (TestEmployeeUser) Satınalma siparişi numarası, sipariş tarihini, sevkiyat tarih, ürün KIMLIK numaraları ve alınan ve sipariş edilen maddelerin her satınalma siparişi, satınalma siparişi numarasına göre kısmi bir sevk irsaliyesi alınmış olan maddeler için görebilmeniz gerekir.
Diğer tüm hesapların geçerli izinlerinin saklamanız gerekir.
Bu senaryo gereksinimlerini karşılamak için , örnek sahipliği zincirlerini ve içerik geçiş kavramlarını gösteren dört bölüme ayrılır:
Ortam yapılandırılıyor.
saklı yordam verilere erişmek için satınalma siparişi oluşturma.
saklı yordam verilere.
Ortam sıfırlanıyor.
Bu örnekte, her kod blok satırı açıklanmıştır.Tam örnek kopyalamak için , bkz: Tam bir örneği Bu öğreticinin sonunda.
1.Configure the Environment
Kullanımı SQL Server Management Studio ve açmak için aşağıdaki kod AdventureWorks veritabanı ve kullanım örnein Transact-SQL deyim, denetlenecek dbo kullanıcı bağlamı görüntülenir.
USE AdventureWorks;
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
Örnein hakkında daha fazla bilgi için deyim, bkz: Örnein (Transact-SQL).
Bu kodu olarak kullanın dbo kullanıcı iki kullanıcı için sunucu ve oluşturmak içinAdventureWorks veritabanıdır.
CREATE LOGIN TestManagerUser
WITH PASSWORD = '340$Uuxwp7Mcxo7Khx';
GO
CREATE USER TestManagerUser
FOR LOGIN TestManagerUser
WITH DEFAULT_SCHEMA = Purchasing;
GO
CREATE LOGIN TestEmployeeUser
WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';
GO
CREATE USER TestEmployeeUser
FOR LOGIN TestEmployeeUser;
GO
CREATE USER deyim hakkında daha fazla bilgi için bkz: USER (Transact-SQL) CREATE. CREATE LOGIN ekstresi daha fazla bilgi için bkz: Oturum AÇMA (Transact-SQL) CREATE.
Sahipliğini değiştirmek için şu kodu kullanın Purchasing şemaya TestManagerUser Hesap. Böylece, bu hesabı (örneğin, tüm veri işleme Language (DML) deyim erişim kullanmak için SELECT ve INSERT izinleri) içerdiği nesneler. Bu yana, veri tanımlama dili (DDL) izinlerini içermez TestManagerUser hakları, açıkça verilen PurchaseOrderHeader ve PurchaseOrderDetail Tablo olarak saklı yordamlar oluşturma yeteneği.
/* Change owner of the Purchasing Schema to TestManagerUser */
ALTER AUTHORIZATION
ON SCHEMA::Purchasing
TO TestManagerUser;
GO
/* Grant permissions to TestManagerUser on these objects with GRANT option */
GRANT ALL
ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderHeader
TO TestManagerUser
WITH GRANT OPTION;
GO
GRANT ALL
ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderDetail
TO TestManagerUser WITH GRANT OPTION;
GO
/* Note: DML works fine with Schema owner, but not DDL. */
GRANT CREATE PROCEDURE
TO TestManagerUser
WITH GRANT OPTION;
GO
GRANT deyim hakkında daha fazla bilgi için bkz: GRANT (Transact-SQL). Veritabanı şemaları hakkında daha fazla bilgi için bkz: Şemalar (Veritabanı Altyapısı). Saklı yordamlar hakkında daha fazla bilgi için bkz: Saklı yordamlar (Veritabanı Altyapısı).
2.Create a Stored Procedure to Access Data
Bir veritabanı içinde bağlamları geçiş yapmak için bir kullanıcının iki yolu vardır: SETUSER ya da yürütmek AS SETUSER kullanarak deyim üyeliğine sahip arayanın gerektirir sysadmin olması ya da sabit sunucu rolüdbo hesabıdır.yürütmek AS özelliklerini AL izinleri gerektirir.Bu kavramlar hakkında daha fazla bilgi için bkz: yürütmek AS SETUSER, karşılaştırması.
Use EXECUTE AS deyim Aşağıdaki kodda içeriğine değiştirmek için TestManagerUser ve yalnızca gereken verileri gösteren bir saklı yordam oluşturma TestEmployeeUser. saklı yordam gereksinimlerini karşılamak için , satınalma siparişi numarası için bir değişken kabul eder ve mali bilgileri görüntülemek ve WHERE yan tümce, kısmi sevkiyatlar sonuçlar sınırlar.
EXECUTE AS LOGIN = 'TestManagerUser'
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
/* Note: The user that calls the EXECUTE AS statement must have IMPERSONATE permissions on the target principal */
CREATE PROCEDURE usp_ShowWaitingItems @ProductID int
AS
BEGIN
SELECT a.PurchaseOrderID, a.OrderDate, a.ShipDate
, b.ProductID, b.OrderQty, b.ReceivedQty
FROM Purchasing.PurchaseOrderHeader a
INNER JOIN Purchasing.PurchaseOrderDetail b
ON a.PurchaseOrderID = b.PurchaseOrderID
WHERE b.OrderQty > b.ReceivedQty
AND @ProductID = b.ProductID
ORDER BY b.ProductID ASC
END
GO
Şu anda TestEmployeeUser herhangi bir veritabanı nesnelerine erişimi yok. Aşağıdaki kodu (yine de TestManagerUser Kullanıcı hesabının, içerik) aracılığıyla saklı yordam sorgu temel tablo bilgileri yeteneğini verir.
GRANT EXECUTE
ON OBJECT::Purchasing.usp_ShowWaitingItems
TO TestEmployeeUser;
GO
saklı yordam parçası olan Purchasing Şema, hiçbir şema açıkça, çünkü belirtilmiş olsa bile TestManagerUser Varsayılan olarak atanmış Purchasing Schema. Aşağıdaki kodda gösterildiği gibi nesneleri bulmak için sistem kataloğunu bilgileri kullanabilirsiniz.
SELECT a.name AS 'Schema'
, b.name AS 'Object Name'
, b.type AS 'Object Type'
FROM sys.schemas a
INNER JOIN sys.objects b
ON a.schema_id = b.schema_id
WHERE b.name = 'usp_ShowWaitingItems';
GO
Sistem kataloğu hakkında daha fazla bilgi için bkz: SQL Server Sistem kataloğu sorgulanıyor..
Bu bölümü örneğin, tamamlanmış içerik yedeklemek için Kod anahtarlarını dbo geri DÖNDÜRME deyimini kullanarak.
REVERT;
GO
GERI bildirimi hakkında daha fazla bilgi için bkz: (Transact-SQL) REVERT.
3.Access Data Through the Stored Procedure
TestEmployeeUser hiçbir izinlere sahip AdventureWorks veritabanı nesnelerini farklı bir oturum açma ve için atanan haklarıOrtak veritabanı rolü.Aşağıdaki kod bir hata döndürür, TestEmployeeUser temel tablolarına erişmeyi dener.
EXECUTE AS LOGIN = 'TestEmployeeUser'
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
/* This won't work */
SELECT *
FROM Purchasing.PurchaseOrderHeader;
GO
SELECT *
FROM Purchasing.PurchaseOrderDetail;
GO
Son bölümünde oluşturduğunuz bir saklı yordam tarafından başvurulan nesnelerin sahibi için TestManagerUser sayesinde Purchasing Şema sahip olma TestEmployeeUser temel tabloları saklı bir yordam erişebilirsiniz. Aşağıdaki kod, kullanmaya devam TestEmployeeUser içerik, satınalma siparişi 952 parametre olarak geçirir.
EXEC Purchasing.usp_ShowWaitingItems 952
GO
4.Reset the Environment
Aşağıdaki kullandığı kod REVERT Cari hesap için bağlamında verilecek komut dbove ortam'ı sıfırlar.
REVERT;
GO
ALTER AUTHORIZATION
ON SCHEMA::Purchasing TO dbo;
GO
DROP PROCEDURE Purchasing.usp_ShowWaitingItems
GO
DROP USER TestEmployeeUser;
GO
DROP USER TestManagerUser;
GO
DROP LOGIN TestEmployeeUser;
GO
DROP LOGIN TestManagerUser;
GO
Tam bir örneği
Bu bölüm, tam bir örnek kodunu görüntüler.
Not
Bu kod, yüklenememesi gösteren iki beklenen hataları içermez TestEmployeeUser temel tablodan seçmek için .
/*
Script: UserContextTutorial.sql
Author: Microsoft
Last Updated: Books Online
Conditions: Execute as DBO or sysadmin in the AdventureWorks database
Section 1: Configure the Environment
*/
USE AdventureWorks;
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
/* Create server and database users */
CREATE LOGIN TestManagerUser
WITH PASSWORD = '340$Uuxwp7Mcxo7Khx';
GO
CREATE USER TestManagerUser
FOR LOGIN TestManagerUser
WITH DEFAULT_SCHEMA = Purchasing;
GO
CREATE LOGIN TestEmployeeUser
WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';
GO
CREATE USER TestEmployeeUser
FOR LOGIN TestEmployeeUser;
GO
/* Change owner of the Purchasing Schema to TestManagerUser */
ALTER AUTHORIZATION
ON SCHEMA::Purchasing
TO TestManagerUser;
GO
/* Grant permissions to TestManagerUser on these objects with GRANT option */
GRANT ALL
ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderHeader
TO TestManagerUser
WITH GRANT OPTION;
GO
GRANT ALL
ON OBJECT::AdventureWorks.Purchasing.PurchaseOrderDetail
TO TestManagerUser WITH GRANT OPTION;
GO
/* Note: DML works fine with Schema owner, but not DDL */
GRANT CREATE PROCEDURE
TO TestManagerUser
WITH GRANT OPTION;
GO
/*
Section 2: Switch Context and Create Objects
*/
EXECUTE AS LOGIN = 'TestManagerUser'
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
/* Note: The user that calls the EXECUTE AS statement must have IMPERSONATE permissions on the target principal */
CREATE PROCEDURE usp_ShowWaitingItems @ProductID int
AS
BEGIN
SELECT a.PurchaseOrderID, a.OrderDate, a.ShipDate
, b.ProductID, b.OrderQty, b.ReceivedQty
FROM Purchasing.PurchaseOrderHeader a
INNER JOIN Purchasing.PurchaseOrderDetail b
ON a.PurchaseOrderID = b.PurchaseOrderID
WHERE b.OrderQty > b.ReceivedQty
AND @ProductID = b.ProductID
ORDER BY b.ProductID ASC
END
GO
/* Give the employee the ability to run the procedure */
GRANT EXECUTE
ON OBJECT::Purchasing.usp_ShowWaitingItems
TO TestEmployeeUser;
GO
/* Notice that the stored procedure is located in the Purchasing
schema. This also demonstrates system catalogs */
SELECT a.name AS 'Schema'
, b.name AS 'Object Name'
, b.type AS 'Object Type'
FROM sys.schemas a
INNER JOIN sys.objects b
ON a.schema_id = b.schema_id
WHERE b.name = 'usp_ShowWaitingItems';
GO
/* Go back to being the dbo user */
REVERT;
GO
/*
Section 3: Switch Context and Observe Security
*/
EXECUTE AS LOGIN = 'TestEmployeeUser'
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
EXEC Purchasing.usp_ShowWaitingItems 952
GO
/*
Section 4: Clean Up Example
*/
REVERT;
GO
ALTER AUTHORIZATION
ON SCHEMA::Purchasing TO dbo;
GO
DROP PROCEDURE Purchasing.usp_ShowWaitingItems
GO
DROP USER TestEmployeeUser;
GO
DROP USER TestManagerUser;
GO
DROP LOGIN TestEmployeeUser;
GO
DROP LOGIN TestManagerUser;
GO
See Also