更新: November 2007
在某些案例中,相較於單純地授與、撤銷或拒絕資料的權限,您需要以更細微的層級來控制存取。例如,醫院的資料庫應用程式可能會將病患資訊儲存在單一資料表中。此時,您可能需要限制醫生檢視與各自病患相關的資訊。類似的案例存在許多環境中,包括財務、法律、政府和軍事應用程式中。不過,SQL Server 不支援實作列層級安全性。您必須在資料表中建立定義資料列篩選機制的其他資料行。
實作列層級權限
列層級權限會用於將資訊儲存在單一資料表中的應用程式。每個資料列都具有一個定義區別參數的資料行,例如使用者名稱、標籤或其他識別碼。然後,您可以建立參數化預存程序,並傳入適當的值。使用者只能看見符合提供值的資料列。
下列步驟將說明如何根據使用者或登入名稱來設定列層級權限。
建立資料表,並加入儲存名稱的額外資料行。
根據使用者名稱資料行來建立具有 WHERE 子句的檢視。這會將傳回的資料列限制為具有指定值的資料列。您可以使用其中一個內建函式來指定資料庫使用者或登入名稱。這樣會排除針對不同使用者建立不同檢視的需要。
' Returns the login identification name of the user.
WHERE UserName = SUSER_SNAME()
' USER_NAME or CURRENT_USER Return the database user name.
WHERE UserName = CURRENT_USER()
根據檢視 (而非基底資料表),建立要選取、插入、更新和刪除資料的預存程序。此檢視會提供限制傳回或修改之資料列的篩選。
若為插入資料的預存程序,請使用在檢視之 WHERE 子句中指定的相同函式來擷取使用者名稱,然後將該值插入 UserName 資料行。
針對 public 角色拒絕資料表和檢視的所有權限。使用者將無法從其他資料庫角色中繼承權限,因為 WHERE 子句是以使用者或登入名稱 (而非角色) 為基礎。
將預存程序的 EXECUTE 授與資料庫角色。使用者只能透過提供的預存程序來存取資料。
外部資源
如需詳細資訊,請參閱下列資源。
使用 SQL Server 2005 在分類資料庫中實作列和資料格層級安全性 (英文) (位於 SQL Server TechCenter 網站上)。 |
說明如何使用列和資料格層級安全性來符合分類資料庫的安全性需求。 |
請參閱
概念
SQL Server 中的應用程式安全性案例 (ADO.NET)
在 SQL Server 中使用預存程序管理權限 (ADO.NET)
在 SQL Server 中撰寫安全的動態 SQL (ADO.NET)