Row-Level Security (RLS):資料表層級的安全謂詞函數,根據執行上下文(用戶/角色/應用上下文)自動過濾/阻擋資料列存取,無需修改應用查詢代碼。
FILTER PREDICATE(查詢過濾)與/或 BLOCK PREDICATE(寫入阻擋:AFTER INSERT/UPDATE/DELETE)。WITH (STATE = ON)。CREATE TABLE Sales (
OrderID INT, SalesRep SYSNAME, Product VARCHAR(10), Qty INT
)
INSERT Sales VALUES
(1, 'Sales1', 'Valve', 5), (2, 'Sales1', 'Wheel', 2), (3, 'Sales1', 'Valve', 4),
(4, 'Sales2', 'Bracket', 2), (5, 'Sales2', 'Wheel', 5), (6, 'Sales2', 'Seat', 5)
SELECT * FROM Sales

CREATE USER Manager WITHOUT LOGIN CREATE USER Sales1 WITHOUT LOGIN CREATE USER Sales2 WITHOUT LOGIN GRANT SELECT, DELETE ON Sales TO Manager GRANT SELECT, DELETE ON Sales TO Sales1 GRANT SELECT, DELETE ON Sales TO Sales2
CREATE FUNCTION fn_securitypredicate(@SalesRep AS SYSNAME) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager'
邏輯:當前用戶 = 資料列 SalesRep,或用戶 = Manager → 可見。
CREATE SECURITY POLICY SalesFilter ADD FILTER PREDICATE dbo.fn_securitypredicate(SalesRep) ON dbo.Sales WITH (STATE = ON)
EXECUTE AS USER = 'Sales1'; SELECT * FROM Sales; REVERT; EXECUTE AS USER = 'Sales2'; SELECT * FROM Sales; REVERT; EXECUTE AS USER = 'Manager'; SELECT * FROM Sales; REVERT;

✅ Sales1 僅見 1-3 筆,Sales2 僅見 4-6 筆,Manager 見全部 6 筆。
EXECUTE AS USER = 'Sales1' DELETE FROM Sales WHERE OrderID = 4 -- 屬於 Sales2 的資料 -- 錯誤:The row cannot be deleted because it does not satisfy the block predicate. REVERT
RLS 同時阻擋 UPDATE/INSERT 違反謂詞的操作。
WHERE @TenantId = CAST(SESSION_CONTEXT(N'TenantId') AS INT),應用設定 sp_set_session_context,無需建資料庫用戶。ADD BLOCK PREDICATE dbo.fn_securitypredicate(SalesRep) ON dbo.Sales AFTER INSERT 防止跨租戶寫入。WHERE SalesRep = USER_NAME(),無額外開銷。SELECT * FROM Sales WITH (NOLOCK) 仍受 RLS 限制;唯有 sysadmin / db_owner / 擁有 SELECT ALL 權限者可繞過。| 功能 | 核心價值 |
|---|---|
| PolyBase | T-SQL 查詢 Hadoop/Blob 非關聯資料 |
| AlwaysOn 增強 | 3 同步副本、DTC 支援、次要副本 Round-Robin 讀取負載均衡 |
| Dynamic Data Masking | 敏感欄位動態遮罩(信用卡、身分證),無需修改應用 |
| 原生 JSON 支援 | FOR JSON / OPENJSON / JSON_VALUE / JSON_MODIFY |
| Temporal Tables | 系統版本控制表,自動記錄歷史變更,時間旅行查詢 |
| Stretch Database | 冷資料透明延伸至 Azure,本地熱資料高效查詢 |
| In-Memory OLTP 增強 | 更高並發、更大記憶體表、原生編譯預存程序擴展 |
| Always Encrypted | 客戶端加密,資料庫內僅存密文,金鑰不離開應用 |