如何强制Unity Catalog中创建的表必须添加必填标签?
在Unity Catalog中强制表添加必填标签的实现方案
一、先定义必填的表级自定义属性
首先在Unity Catalog中创建需要强制的表级自定义属性(也就是你说的标签),比如business_unit、data_classification这类必填项:
- CLI操作示例:
databricks unity-catalog custom-properties create --name business_unit --type STRING --entity-type TABLE --description "必填业务单元标签" databricks unity-catalog custom-properties create --name data_classification --type STRING --entity-type TABLE --description "必填数据分类标签" - UI操作:进入Unity Catalog的「自定义属性」页面,选择「表」作为实体类型,添加对应属性并补充描述。
二、创建表创建的强制策略
利用Unity Catalog的**策略(Policies)**拦截不符合要求的表创建操作,规则基于SQL语法编写:
- 核心策略规则示例(强制必须包含指定自定义属性):
这条规则的作用是:仅允许在所有目录、架构下创建/替换表,当表的自定义属性中同时存在ALLOW CREATE TABLE, REPLACE TABLE ON *.*.* WHEN EXISTS(custom_properties.business_unit) AND EXISTS(custom_properties.data_classification)business_unit和data_classification时才放行。 - 创建策略的方式:
- CLI操作:
databricks unity-catalog policies create --name "强制表必填标签" --description "所有表必须带有business_unit和data_classification自定义属性" --definition "ALLOW CREATE TABLE, REPLACE TABLE ON *.*.* WHEN EXISTS(custom_properties.business_unit) AND EXISTS(custom_properties.data_classification)" - UI操作:进入Unity Catalog的「策略」页面,新建策略,目标对象选择「表」,输入上述规则定义。
- CLI操作:
三、将策略应用到目标范围
把创建好的策略分配到需要生效的范围:
- 如果要全局强制所有表,就将策略应用到
*.*.*(所有目录、架构、表); - 如果只针对特定目录/架构,替换为对应的路径(比如
my_catalog.my_schema.*); - 注意调整策略优先级,确保这条强制规则的优先级高于其他允许创建表的策略,避免被覆盖。
四、验证效果
- 尝试创建不带必填属性的表,会触发权限错误:
CREATE TABLE test_db.test_table (id INT); - 创建带必填属性的表,操作会成功:
CREATE TABLE test_db.test_table (id INT) TBLPROPERTIES ( 'business_unit' = 'sales', 'data_classification' = 'public' );
进阶调整
如果需要更严格的校验,比如限制属性值的可选范围,可以修改策略规则:
ALLOW CREATE TABLE, REPLACE TABLE ON *.*.* WHEN EXISTS(custom_properties.business_unit) AND custom_properties.data_classification IN ('public', 'internal', 'confidential')
如果需要给管理员开例外,也可以添加规则:
ALLOW CREATE TABLE, REPLACE TABLE ON *.*.* WHEN EXISTS(custom_properties.business_unit) AND EXISTS(custom_properties.data_classification) OR is_account_group_member('account admins')
内容的提问来源于stack exchange,提问作者user25060582
相关产品推荐
相关产品推荐

