資料列層級安全性 (RLS) 是 OneLake 安全性 (預覽) 的一項功能,它允許針對儲存在 OneLake 中的表格資料定義資料列層級的資料限制。 使用者可以在 OneLake 中定義角色,這些角色包含用於針對該角色成員篩選資料列的規則。 當 RLS 角色的成員去查詢該資料時,會評估 RLS 規則且只會傳回允許的資料列。
先決條件
- OneLake 中已開啟 OneLake 安全性的項目。 如需詳細資訊,請參閱 開始使用 OneLake 資料存取角色。
- 透過 [ 安全性 ] 索引標籤,將 Lakehouse 上的 SQL 分析端點切換為「使用者身分識別」模式。
- 若要建立語意模型,請使用步驟來建立 DirectLake 模型。
- 如需完整的限制清單,請參閱 已知限制一節。
強制執行資料列層級安全性保護
OneLake 安全性中的行列級安全(Row-Level Security,RLS)會透過以下兩種方式之一加以執行:
- Fabric 引擎中篩選的資料表: 對受支援的 Fabric 引擎 (如 Spark Notebooks) 清單的查詢會導致使用者只能看到根據 RLS 規則允許他們查看的資料列。
- 封鎖對資料表的存取: 套用了 RLS 規則的資料表無法在受支援的 Fabric 引擎之外讀取。
對於已篩選的資料表,會套用下列行為:
- RLS 規則不會限制對系統管理員、成員和參與者角色中的使用者的存取權。
- 如果 RLS 規則與其所定義的資料表不符,則查詢會失敗,而且不會傳回任何資料列。 例如,若 RLS 規則參考的資料行並非該資料表的一部分。
- 如果使用者屬於兩個不同角色的一部分,且其中一個角色具有資料行層級安全性 (CLS),則 RLS 資料表的查詢會失敗並出現錯誤。
- RLS 規則只能在 Delta Parquet 資料表的物件上強制執行。
- 套用至非 Delta 資料表物件的 RLS 規則反而會封鎖該角色的成員對整個資料表的存取。
- 如果 RLS 陳述式包含阻止其被評估的語法錯誤,則對資料表的存取可能會被封鎖。
定義資料列層級安全性規則
您可以將資料列層級安全性規則定義為任何授與 Delta parquet 格式表格資料存取權的 OneLake 安全性角色的一部分。 資料列是一個僅與表格資料相關的概念,因此不允許針對非表格資料夾或非結構化資料定義 RLS。
RLS 規則會使用 SQL 語法來指定使用者可以查看的資料列。 此語法會採用 SQL SELECT 陳述式的形式,並在 WHERE 子句中定義 RLS 規則。 RLS 規則僅支援語法規則中所定義的 SQL 語言子集。 具有無效 RLS 語法或與基礎資料表不符的 RLS 語法的查詢,會導致使用者看不到任何資料列,或在 SQL 分析端點中產生查詢錯誤。
最佳做法是避免使用模糊或過於複雜的 RLS 運算式。 具有整數或字串查找的強類型表達式將是最安全且易於理解的。
使用下列步驟來定義 RLS 規則:
流覽至您的 Lakehouse,然後選取 [管理 OneLake 安全性 (預覽版)]。
選取您要為其定義資料表或資料夾安全性的現有角色,或選取 [新增] 以建立新角色。
在 [角色詳細資料] 頁面上,選取您要為其定義 RLS 的資料表旁邊的更多選項 (...),然後選取 [資料列安全性 (預覽)]。
在程式碼編輯器中,輸入 SQL 陳述式,以定義您希望使用者看到的資料列。 使用語法規則一節來取得指導。
選擇[儲存]以確認資料列安全性規則。
為 SQL 分析端點啟用 OneLake 安全性
您必須先啟用其 使用者的身分識別模式,才能搭配 SQL 分析端點使用 OneLake 安全性。 新建立的 SQL 分析端點會預設為使用者的身分識別模式,因此必須針對現有的 SQL 分析端點遵循這些步驟。
備註
切換至 使用者的身分識別 模式只需要針對每個 SQL 分析端點完成一次。 未切換至使用者身分識別模式的端點會繼續使用委派的身分識別來評估許可權。
流覽至 SQL 分析端點。
在 SQL 分析端點體驗中,選取頂端功能區中的 [ 安全性 ] 索引標籤。
選擇 使用者身分識別 在 OneLake 存取模式 下。
在提示中,選取 [ 是],使用使用者的身分識別。
現在,SQL 分析端點已準備好搭配 OneLake 安全性使用。
語法規則
所有列層級的安全性規則均採用以下形式:
SELECT * FROM {schema_name}.{table_name} WHERE {column_level_boolean_1}{column_level_boolean_2}...{column_level_boolean_N}
例如:
SELECT * FROM Sales WHERE Amount>'50000' AND State='CA'
資料列層級安全性規則中的最大字元數為 1000 個。
| 佔位符 | 說明 |
|---|---|
| {schema_name} | {table_name} 所在的資料庫結構名稱。 如果工件支援結構描述,則需要 {schema_name}。 |
| {table_name} | RLS 述詞欲套用的資料表名稱。 這個值必須與資料表的名稱完全相符,否則 RLS 將不會顯示任何資料列。 |
| {欄位層級布林值} | 包含下列元件的布林陳述式: * 資料行名稱:Delta 記錄結構描述中所指定的 {table_name} 中的資料行名稱。 資料行名稱可以格式化為 {column_name} 或 {table_name}.{column_name}。 * 運算子:其中一個支援的運算子,會將欄位名稱和值評估為布林值。 * 值:要針對其進行評估的靜態值或一組值。 您可以擁有以 AND 或 OR 分隔的一或多個布林陳述式。 |
支援的運算子
資料列層級安全性規則支援下列運算子和關鍵字:
| 操作員 | 說明 |
|---|---|
| = (等於) | 如果兩個值是相同的資料類型且完全相符,則會評估為 true。 |
| <> (不等於) | 如果兩個值不是相同的資料類型且不完全相符,則會評估為 true。 |
| > (大於) | 如果資料行值大於評估值,則會評估為 true。 對於字串值,此運算子會使用位元比較來判斷一個字串是否大於另一個字串。 |
| >= (大於或等於) | 如果資料行值大於或等於評估值,則會評估為 true。 對於字串值,此運算子會使用位元比較來判斷一個字串是否大於或等於另一個字串。 |
| < (小於) | 如果資料行值小於評估值,則會評估為 true。 對於字串值,此運算子會使用位元比較來判斷一個字串是否小於另一個字串。 |
| <= (小於或等於) | 如果資料行值小於或等於評估值,則會評估為 true。 對於字串值,此運算子會使用位元比較來判斷一個字串是否小於或等於另一個字串。 |
| 在內 | 如果任一評估值是相同的資料類型且完全符合資料行值,則會評估為 true。 |
| 否 | 如果任一評估值不是相同的資料類型或與資料行值不完全相符,則會評估為 true。 |
| 和 | 使用布林運算的 AND 操作結合前一個陳述式和下一個陳述式。 兩個陳述都必須為真,整個命題才會為真。 |
| 或者 | 使用布林 OR 運算結合上一個陳述式和後續陳述式。 其中一個陳述必須為真,整個命題才會為真。 |
| 是真的 | 表示 true 的布林運算式。 |
| 錯誤 | 表示「False」的布林邏輯表達式。 |
| 空白 | 空白資料類型,其可與 IS 運算子一起使用。 例如: row IS BLANK 。 |
| 零 | Null 資料類型,其可與 IS 運算子一起使用。 例如: row IS NULL 。 |
結合列層級和行層級安全性
資料列層級和資料行層級安全性可以一起使用,以限制使用者對資料表的存取。 不過,這兩個原則必須使用單一 OneLake 安全性角色來加以套用。 在本例中,會根據在一個角色中設定的規則來限制對資料的存取。
OneLake 安全性不支援兩個或多個角色的組合,其中一個角色包含 RLS 規則,而另一個角色包含 CLS 規則。 嘗試存取屬於不受支援角色組合的一部分的資料表的使用者會收到查詢錯誤。