SQL Server 提供多層次安全性機制:作業系統 → 伺服器登入 → 資料庫使用者 → 結構描述/物件權限。本文說明如何結合視圖、預存程序、角色、應用程式角色建構纵深防禦體系。
SELECT/INSERT/UPDATE/DELETE 權限於視圖,不授予基底表權限。CREATE VIEW vw_Sales_DeptA AS SELECT * FROM Sales WHERE DeptID = 'A'; → 授予 DeptA 使用者 SELECT ON vw_Sales_DeptA。CREATE VIEW vw_Emp_Public AS SELECT EmpID, Name, Dept FROM Employee; → 隱藏薪資/身分證等敏感欄位。-- 基底表 sales 含 payterms 欄位,使用者 A 無 SELECT 權限
CREATE VIEW vw_Sales_NoPayterms AS
SELECT SaleID, CustID, Amount, SaleDate FROM sales; -- 排除 payterms
GRANT SELECT ON vw_Sales_NoPayterms TO UserA;
-- UserA 可執行 SELECT * FROM vw_Sales_NoPayterms,無需知曉基底表結構
EXECUTE ON usp_GetSales。CREATE PROCEDURE usp_GetSales
AS
SELECT SaleID, CustID, Amount, SaleDate FROM sales;
GO
GRANT EXECUTE ON usp_GetSales TO UserA;
sysadmin, securityadmin, dbcreator 等,跨資料庫權限。db_datareader, db_datawriter, db_ddladmin 等固定角色;自訂角色 CREATE ROLE AppReaders; GRANT SELECT ON Schema::Sales TO AppReaders;。sp_setapprole 'AppRole', 'Password',應用程式連線後啟用,完全取代使用者權限,防止使用者透過其他工具 (SSMS/Excel) 繞過應用邏輯存取資料。sa、設定強密碼、啟用密碼原則。BUILTIN\Administrators 自動 sysadmin (SQL 2008+ 預設不加入)。guest 使用者:僅在 master/msdb 啟用,其他資料庫 REVOKE CONNECT。public 角色:預設權限最小化,不授予額外權限。sys.server_permissions, sys.database_permissions、腳本輸出所有 GRANT/DENY。「最小權限原則」+「視圖/預存程序封裝」+「角色分層」+「應用程式角色隔離」= 纵深防禦。安全性非一次設定,需持續審計與演練。