本文介绍了 OneLake 安全中定义 行级安全(RLS) 规则的语法。 要将RLS规则应用于表格,请参见 创建和管理OneLake安全角色。
RLS 规则使用 SQL 语法来指定用户可以查看的行。 语法以SQL SELECT 语句的形式出现,并定义了该条款中 WHERE 定义的RLS规则。 RLS 规则仅支持本文定义的 SQL 子集。 带有无效RLS语法的查询,或RLS语法与底层表不符,会导致用户无法显示任何行,或在SQL分析端点中出现查询错误。
在撰写RLS表达式时,请牢记以下最佳实践:
- 避免使用模糊或过于复杂的RLS表达。
- 带有整数或字符串查找且使用“=”的强类型表达式是最安全且最易理解的。
- 使用整数列进行排序和大于或小于运算。
- 如果你不知道输入数据的格式,尤其是Unicode字符或重音敏感度,避免字符串等价。
行级安全通过以下排序和比较方法评估字符串数据大小写不分: Latin1_General_100_CI_AS_KS_WS_SC_UTF8。
Syntax
行级安全性规则中的最大字符数为 1000。
所有行级安全性规则均采用以下形式:
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'
| 占位符 | 说明 |
|---|---|
| {schema_name} | 包含{table_name}的模式名称。 如果项目支持模式,必须包含{schema_name}。 |
| {table_name} | RLS 谓词所适用的表格名称。 该值必须与表名完全一致,否则RLS将显示无行。 使用方括号 [] 来避免带有特殊字符的表格名称。 例如,SELECT * FROM [dbo].[Secret.Table]。 |
| {column_level_boolean} | 一个布尔语句,其中包含以下组件: * 列名:{table_name} 中的列名,在 Delta 日志模式中出现。 你可以将列名格式化为{column_name}或{table_name}。{column_name}。 * 操作符: 支持的操作 符之一,将列名和值计算为布尔值。 * 价值:用于评估的静态值或一组值。 可以有一个或多个由 AND 或 OR 分隔的布尔语句。 |
支持的运算符
行级安全规则支持以下操作符和关键词:
| Operator | 说明 |
|---|---|
= (等于) |
当两个值的数据类型相同且完全匹配时,计算结果为 true。 |
<>(不等于) |
当两个值的数据类型不同且不完全匹配时,计算结果为 true。 |
>(大于) |
当列值大于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否大于另一个字符串。 |
>=(大于或等于) |
当列值大于或等于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否大于或等于另一个字符串。 |
<(小于) |
当列值小于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否小于另一个字符串。 |
<=(小于或等于) |
当列值小于或等于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否小于或等于另一个字符串。 |
IN |
当任何评估值的数据类型与列值相同且完全匹配时,计算结果为 true。 |
NOT |
当任何评估值的数据类型与列值不同或不完全匹配时,计算结果为 true。 |
AND |
通过使用布尔 AND 操作将前述语句和后续语句结合起来。 只有两个语句都为真,整个谓词才为真。 |
OR |
通过使用布尔或运算将前述语句和后续语句结合起来。 只要其中一个语句为 true,整个谓词就为 true。 |
TRUE |
表示 true 的布尔表达式。 |
FALSE |
表示 false 的布尔表达式。 |
BLANK |
空白数据类型,你可以用 IS 操作符使用。 例如,row IS BLANK。 |
NULL |
空数据类型,你可以用 IS 操作符。 例如,row IS NULL。 |