首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2016 新功能 Row-Level Security (RLS) 實戰:資料列級安全策略零代碼隔離租戶資料

     編輯:關於SqlServer

功能定位

Row-Level Security (RLS):資料表層級的安全謂詞函數,根據執行上下文(用戶/角色/應用上下文)自動過濾/阻擋資料列存取,無需修改應用查詢代碼。

核心組件

  1. 安全謂詞函數:內嵌資料表值函數 (Inline TVF),回傳 1 表示「可見」,Schema-bound。
  2. 安全原則:綁定謂詞函數至目標資料表,指定 FILTER PREDICATE(查詢過濾)與/或 BLOCK PREDICATE(寫入阻擋:AFTER INSERT/UPDATE/DELETE)。
  3. 啟用狀態:WITH (STATE = ON)。

完整實戰範例

1. 建立測試資料

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

2. 建立測試用戶

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

3. 定義安全謂詞函數

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 → 可見。

4. 建立並啟用安全原則

CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE dbo.fn_securitypredicate(SalesRep) ON dbo.Sales
WITH (STATE = ON)

5. 驗證效果

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 筆。

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 違反謂詞的操作。

進階用法

  • 應用上下文隔離 (Multi-tenant): WHERE @TenantId = CAST(SESSION_CONTEXT(N'TenantId') AS INT),應用設定 sp_set_session_context,無需建資料庫用戶。
  • BLOCK PREDICATE: 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 權限者可繞過。

SQL Server 2016 其他亮點功能速覽

總結

RLS 將「資料授權」從應用層下沉至資料庫核心,實現零代碼改造、中心化管理、效能零損耗的資料列級隔離,是多租戶 SaaS、多部門共享資料庫的終極利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
功能核心價值
PolyBaseT-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客戶端加密,資料庫內僅存密文,金鑰不離開應用