SQL Server 提供多層次防護:OS → SQL Server → 資料庫 → 物件。善用視圖、預存程序、應用程式角色可構建深度防禦體系。
視圖是虛擬資料表,僅暴露定義查詢的結果集。授與視圖權限而不授與基底表權限,即可實現:
CREATE VIEW vw_Sales_ByOutlet
AS
SELECT * FROM sales
WHERE outlet_id = SUSER_SNAME(); -- 或對應應用程式傳入的據點代碼

問題:使用者對 sales.payterms 無 SELECT 權限,若執行 SELECT * FROM sales 會報錯,但要求使用者逐一列出允許欄位不現實。
解法:建立排除敏感欄位的視圖,授與視圖 SELECT 權限:
CREATE VIEW vw_Sales_Safe
AS
SELECT sale_id, outlet_id, cust_id, amount, sale_date -- 排除 payterms
FROM sales;
GRANT SELECT ON vw_Sales_Safe TO UserA;
-- UserA 即可執行 SELECT * FROM vw_Sales_Safe
使用者**完全無表/視圖權限**,僅擁有 SP EXECUTE 權限:
CREATE PROCEDURE usp_GetSalesSummary
AS
SELECT outlet_id, COUNT(*) AS cnt, SUM(amount) AS total
FROM sales
GROUP BY outlet_id;
GRANT EXECUTE ON usp_GetSalesSummary TO UserB;
-- UserB 執行 EXEC usp_GetSalesSummary 即可取得彙總資料
| 維度 | 視圖 + 權限 | 預存程序 + EXEC |
|---|---|---|
| 資料暴露範圍 | 可見視圖定義的所有欄位/列 | 僅見 SP 回傳的結果集 |
| 業務邏輯封裝 | 無 (純查詢投影) | 完整 (可含複雜運算、多表聯結、交易控制) |
| 參數化輸入 | 不支援 | 原生支援,防注入 |
| 維護彈性 | 修改視圖需審查相依報表 | 修改 SP 內部邏輯不影響呼叫端 |
| 效能 | 查詢計畫可重用 | 計畫重用 + 參數嗅探優化 |
guest 使用者與 public 角色 (最小權限原則)sp_setapprole) 在連線池環境下的可控性優勢sp_helprotect、fn_my_permissions、稽核日誌