Aracılığıyla paylaş


Öğretici: Sahiplik Chains ve bağlam geçişi

Bu öğretici, göstermek için bir senaryo kullanır SQL Server sahiplik chains ve bağlam kullanıcı geçişi ilgili güvenlik kavramlarını.Sahiplik chains hakkında daha fazla bilgi için bkz: Sahiplik Chains.İçerik Geçişi hakkında daha fazla bilgi için bkz: Bağlam geçişi (veritabanı altyapısı).

Not

Yapılandırılan her iki karma mod güvenliği olması gerekir Bu öğreticide kod çalıştırmak için ve AdventureWorks2008R2 veritabanı yüklü.Karma mod güvenliği hakkında daha fazla bilgi için bkz: Kimlik Doğrulaması Modu Seçme.

Senaryo

Bu senaryoda, iki kullanıcı hesapları depolanan satınalma siparişi verilere erişmek için gereken AdventureWorks2008R2 veritabanı.Gereksinimleri aşağıdaki gibidir:

  • İlk hesap (TestManagerUser) her satınalma siparişi tüm ayrıntıları görebilmek gerekir

  • İkinci hesabı (TestEmployeeUser) satınalma siparişi numarasını, sipariş tarihini, sevkiyat tarih, ürün kimlik numaraları ve başına satınalma siparişi, satınalma siparişi numarasına göre burada kısmi sevkiyat alınan maddeler için alınan ve sipariş edilen maddelerin görebilmeniz gerekir.

  • Tüm hesapları geçerli izinlerini korumanız gerekir.

Bu senaryoda gereksinimlerini karşılamak için örnek sahiplik chains ve bağlam geçişi kavramlarını gösteren dört kısma ayrılır:

  1. Ortamı yapılandırma.

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

  3. Saklı yordam verilere erişme.

  4. Ortamı sıfırlanıyor.

Her kod blok Bu örnekte satırında açıklanmaktadır.Örneğin tamamını kopyalamak için bkz: Tam örnek sonunda, Bu öğretici.

1.Configure the Environment

Use SQL Server Management Studio and the following code to open the AdventureWorks2008R2 database, and use the CURRENT_USER Transact-SQL statement to check that the dbo user is displayed as the context.

USE AdventureWorks2008R2;
GO
SELECT CURRENT_USER AS 'Current User Name';
GO

Örnein deyim hakkında daha fazla bilgi için bkz: Örnein (Transact-sql).

Bu kodu olarak kullanmak dbo sunucu ve de iki kullanıcı oluşturmak için kullanıcı AdventureWorks2008R2 veritabanı.

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: Kullanıcı (Transact-sql) oluştur.create LOGIN'i deyim hakkında daha fazla bilgi için bkz: LOGIN (Transact-sql) oluştur.

Sahipliğini değiştirmek için aşağıdaki kodu kullanın Purchasing şeması'na TestManagerUser hesabı.Böylece, tüm veri düzenleme dili (dml) deyim erişimi kullanmak için o hesabı (gibi SELECT ve INSERT izinleri) içerdiği nesneleri üzerinde.Bu veri tanımlama dili (ddl) izinlerini içermez bu yana TestManagerUser açıkça üzerinde hakkı PurchaseOrderHeader ve PurchaseOrderDetail tablolar, yanı sıra yeteneği oluşturmak saklı yordamlar.

/* 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 kapsamları geçiş kullanıcı izin vermenin iki yolu vardır: setuser veya execute ASsetuser deyim kullanmak gerekir üye arayan sysadmin sabit sunucu rolü ya da dbo hesabı.execute as özelliklerini Al izni gerektirir.Bu kavramlar hakkında daha fazla bilgi için bkz: execute as vs. SETUSER.

Kullanım EXECUTE AS deyim için içeriğini değiştirmek için aşağıdaki kodda TestManagerUser ve yalnızca verileri gerektirdiği gösteren bir saklı yordam oluşturmak 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 sonuçlar kısmi sevkiyat için where yan tümce tümce tümce 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 erişim için tüm veritabanı nesneleri.Aşağıdaki kod (yine de TestManagerUser İçerik) kullanıcı hesabı için saklı yordam temel tablo bilgileri sorgulama yeteneği verir

GRANT EXECUTE
   ON OBJECT::Purchasing.usp_ShowWaitingItems
   TO TestEmployeeUser;
GO

saklı yordam Parçası olan Purchasing şema dahi hiçbir şema açıkça belirtildi, çünkü TestManagerUser Varsayılan olarak atanan Purchasing şema.Aşağıdaki kodda gösterildiği gibi nesneleri bulmak için sistem katalog 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 kataloglar hakkında daha fazla bilgi için bkz: sql Server sistem Kataloğu sorgulama.

Bu bölümde tamamlandı, örneğin içerik yedeklemek için kod anahtarları ile dbo kullanarak REVERT deyim.

REVERT;
GO

Geri DÖNDÜRME hakkında daha fazla bilgi için deyim, bkz: DÖNMEK (Transact-sql).

3.Access Data Through the Stored Procedure

TestEmployeeUserizin yok sahip AdventureWorks2008R2 veritabanı nesnelerinin bir oturum açma adı ve atanan hakları dışında public veritabanı rolü.Aşağıdaki kod bir hata döndürür, TestEmployeeUser erişmeye temel tablolar.

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

Çünkü son bölümünde oluşturulan bir saklı yordam tarafından başvurulan nesneler tarafından sahip olunan TestManagerUser sayesinde Purchasing şema sahipliğini TestEmployeeUser erişim temel tabloları aracılığıyla saklı yordamı.Aşağıdaki kod, kullanmaya devam TestEmployeeUser içeriği, ileten satınalma siparişi 952 olarak bir parametre.

EXEC Purchasing.usp_ShowWaitingItems 952
GO

4.Reset the Environment

Aşağıdaki kod REVERT dönmek için Cari hesabın bağlamı için 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 örnek

Bu bölüm tam örnek kodunu görüntüler.

Not

Bu kod bağlanamaması gösteren iki beklenen hataları içermez TestEmployeeUser seçme temel tablolar.

/* 
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 AdventureWorks2008R2;
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::AdventureWorks2008R2.Purchasing.PurchaseOrderHeader
    TO TestManagerUser 
   WITH GRANT OPTION;
GO
GRANT ALL 
   ON OBJECT::AdventureWorks2008R2.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