SQL Server 2016 前無原生 RLS (2016+ 有 `CREATE SECURITY POLICY`)。歷史版本或不想升級時,**TVF + View 模式**是經典、零侵入、高效能的替代方案。
訂單系統:經理僅能看自己部門及子部門訂單。資料表:
CREATE FUNCTION dbo.GetOrderSummary(@User_ID VARCHAR(20))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (
SELECT COUNT(*) AS OrderCount,
SUM(OrderTotal) AS Receipts
FROM dbo.Orders o
JOIN dbo.UserAccess ua ON o.Department = ua.Department
WHERE ua.UserID = @User_ID
);
關鍵點:
CREATE VIEW dbo.OrderSummary WITH SCHEMABINDING AS SELECT OrderCount, Receipts FROM dbo.GetOrderSummary(USER_NAME()); -- 或 SUSER_SNAME() / 原生應用傳入
-- 遞迴 CTE 取得使用者可存取的所有部門 (含子孫)
WITH UserDepts AS (
SELECT Department FROM UserAccess WHERE UserID = @User_ID
UNION ALL
SELECT d.Department
FROM Departments d
JOIN UserDepts ud ON d.ParentDepartment = ud.Department
)
SELECT COUNT(*), SUM(OrderTotal)
FROM Orders o
JOIN UserDepts ud ON o.Department = ud.Department;
| 維度 | TVF + View 方案 | 應用層過濾 | 原生 RLS (2016+) |
|---|---|---|---|
| 效能 | 優 (內聯、索引求取) | 差 (全撈再過濾) | 優 (Predicate Pushdown) |
| 安全性 | 高 (資料庫層強制) | 低 (繞過應用即失效) | 最高 (引擎層) |
| 維護成本 | 低 (邏輯集中) | 高 (分散各處) | 中 (策略管理) |
| 應用侵入性 | 零 (View 介面不變) | 高 (需修改所有查詢) | 零 |
**Inline TVF + View + SCHEMABINDING** 是 SQL Server 實現列級安全的經典模式:邏輯集中於資料庫層、效能零損耗、應用零侵入、權限最小化。即使 2016+ 有原生 RLS,此模式在舊版本、跨版本相容、複雜階層授權場景下依然極具價值。核心口訣:**資料不出庫、邏輯不上層、權限不外洩**。