Aracılığıyla paylaş


Öğ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:

  1. Ortam yapılandırılıyor.

  2. saklı yordam verilere erişmek için satınalma siparişi oluşturma.

  3. saklı yordam verilere.

  4. 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