【 使用环境 】生产环境 or 测试环境
测试环境
【 OB or 其他组件 】
4.1
【 使用版本 】
【问题描述】清晰明确描述问题
相关链接:OceanBase分布式数据库-海量数据 笔笔算数
SA_SESSION.SET_ROW_LABEL
ROW_LABEL 描述
SA_SESSION.SET_ROW_LABEL
用于设置当前数据库会话的默认行标签值。
设置 LABEL_DEFAULT
选项时,如果用户未明确指定标签,则在插入时使用此行标签值。
如果未使用 SA_SESSION.SET_ROW_LABEL
设置默认行标签值,则该值将自动从会话标签派生。它包含会话标签的级别。
如果会话标签更改,则行标签将自动重置。 例如,如果将会话级别从 HIGHLY_SENSITIVE
更改为 SENSITIVE
,则行标签的级别组件将自动更改为 SENSITIVE
。
用户可以独立设置行标签,但只能小于或等于会话标签的级别,并且大于或等于用户的最小级别。
如果用户尝试将行标签设置为无效值,则不允许该操作,并且行标签值不变。
测试
这里在进行为用户指定标签时,符合(用户可以独立设置行标签,但只能小于或等于会话标签的级别,并且大于或等于用户的最小级别)
obclient [LBACSYS]> CALL SA_USER_ADMIN.SET_LEVELS('MY_POLICY', 'user10', 'HIGH','PUBLIC', 'PUBLIC', 'HIGH');
ORA-12470: NULL or invalid user label
at oceanbase.SA_USER_ADMIN.SET_LEVELS , line : 123, col : 1
obclient [LBACSYS]> CALL SA_USER_ADMIN.SET_LEVELS('MY_POLICY', 'user10', 'HIGH','PUBLIC', 'HIGH', 'HIGH');
Query OK, 0 rows affected (0.024 sec)
但是直接使用SA_SESSION.SET_ROW_LABEL的语法处理时并不满足上述描述
obclient [TEST3]> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'INTERNAL');
Query OK, 0 rows affected (0.001 sec)
obclient [TEST3]> CALL SA_SESSION.SET_ROW_LABEL('MY_POLICY', 'HIGH');
Query OK, 0 rows affected (0.001 sec)
obclient [TEST3]> SELECT SA_SESSION.LABEL('MY_POLICY') FROM DUAL;
+-------------------------------+
| SA_SESSION.LABEL('MY_POLICY') |
+-------------------------------+
| INTERNAL |
+-------------------------------+
1 row in set (0.001 sec)
obclient [TEST3]> SELECT SA_SESSION.ROW_LABEL('MY_POLICY') FROM DUAL;
+-----------------------------------+
| SA_SESSION.ROW_LABEL('MY_POLICY') |
+-----------------------------------+
| HIGH |
+-----------------------------------+
1 row in set (0.001 sec)
这个现象符合预期吗
另外测试行级锁功能问题
obclient [TEST3]> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'PUBLIC');
Query OK, 0 rows affected (0.001 sec)
obclient [TEST3]> SELECT * FROM tbl1;
+------+------+----------+
| COL1 | COL2 | MY_LABEL |
+------+------+----------+
| 1 | 1 | 10000 |
| 2 | NULL | 10000 |
| 1 | 1 | 10000 |
| 3 | 1 | 10000 |
+------+------+----------+
4 rows in set (0.001 sec)
obclient [TEST3]> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'HIGH');
Query OK, 0 rows affected (0.001 sec)
obclient [TEST3]> SELECT * FROM tbl1;
+------+------+----------+
| COL1 | COL2 | MY_LABEL |
+------+------+----------+
| 1 | 1 | 10000 |
| NULL | NULL | 20000 |
| 2 | NULL | 10000 |
| 3 | 1 | 30000 |
| 1 | 1 | 10000 |
| NULL | NULL | 20000 |
| 3 | 1 | 10000 |
| 3 | 2 | 30000 |
+------+------+----------+
8 rows in set (0.001 sec)
目前看起来结果只跟SESSION.label的级别相关,SESSION.row_label的作用是什么,