自定义元数据类型基础(Custom Metadata Types Basics)

自定义元数据类型是可定制、可部署、可打包、可升级的应用元数据。本文从元数据概念讲起,说明它与自定义设置的区别(部署、关系字段、Apex CRUD、后缀),介绍映射、业务规则、主数据三大用例;并动手创建一个 Support Tier 类型,添加 Minimum Spending 与 Default Discount 字段和 Bronze/Silver/Gold 记录,再把它引用到默认值、验证规则、公式字段与 Record-Triggered Flow 中,实现全声明式的元数据驱动配置。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, headless

一、开始了解自定义元数据类型

slide_2

本单元从最基础的问题讲起——什么是元数据(metadata)?——逐步建立对自定义元数据类型(Custom Metadata Types)的理解,包括它们与自定义设置的区别,以及在组织中的应用场景。完成本单元后,你将能够:定义自定义元数据类型;描述自定义设置与自定义元数据类型的区别;识别自定义元数据类型的若干用例。

什么是自定义元数据类型?

slide_5
slide_6

元数据(metadata)是描述其他数据的数据。例如,在 Salesforce 组织中有个标准对象叫 Account——该对象的结构就是元数据;当你往 Account 里添加一条包含客户联系信息的记录时,你添加的是数据。字段名(如 first name、last name)是元数据,字段里的值(如 Amy、Lane)是数据。

那么,什么是自定义元数据类型?它是一个用于定义应用元数据结构的对象。自定义元数据类型的字段、以及字段里的值,全都由元数据构成;自定义元数据类型的记录也是元数据,不是数据。

使用元数据非常方便,因为它可以导入到 Salesforce、在界面中修改、并用 Metadata API 操作。与其存储硬编码的数据,自定义元数据类型让你通过构建可复用、基于元数据决定行为的功能来配置应用,而且大部分定制工作都可以用声明式工具完成。

部署带自定义元数据类型的应用时,所有记录和字段都会包含在包安装里,无需额外步骤——你可以用变更集或托管包来部署自定义元数据类型。而与之相反,部署带自定义对象和自定义设置的应用时,这些对象的元数据(表头/结构)会被部署,但记录(定义)会被落下,需要手动加载或写 Apex 脚本插入,相当耗时。

换句话说,自定义元数据类型是「会随应用一起旅行」的应用配置——定义与记录一起打包部署;而自定义对象/自定义设置只部署结构、遗留数据。

自定义元数据类型与自定义设置的区别

slide_7
slide_8

自定义元数据类型和自定义设置都可以用于存储列表数据(如增值税率列表或支持等级列表)。自定义设置还可以配置为层级(hierarchy),让值对特定用户、配置文件或组织级别可用。两者的关键区别:

维度自定义元数据类型自定义设置
类型处理列表数据,不支持基于用户/配置文件/组织层级的层级数据类似自定义对象,可创建基于列表或基于层级的自定义设置
部署记录可以打包部署,也可通过 Metadata API 或变更集部署记录无法通过包、Metadata API 或变更集部署
关系字段支持自定义元数据类型之间的查找(lookup)不支持关系字段
后缀__mdt__c(同自定义对象)
Apex 中的 CRUD支持完整的 CRU(创建、读取、更新),不支持删除支持完整 CRUD(创建、读取、更新、删除)

一个重要的技术差异是 Apex 支持:自定义元数据类型支持创建、读取、更新,但不支持删除——这一设计体现了它们的用途:自定义元数据类型是随包发布的持久应用配置,不应被代码意外删除;而自定义设置更灵活,常用于组织特定的、随用户或配置文件变化的运行时数据。

自定义元数据类型的用例

slide_9

自定义元数据类型有三种主要用途:

  • 映射(Mappings):用它创建不同对象之间的关联。例如,创建一个把城市、州或省分配到某国家特定区域的自定义元数据类型。
  • 业务规则(Business rules):Salesforce 有很多定义业务规则的方式,其中一种是把配置记录与自定义功能结合。例如,用自定义元数据类型配合 Apex 代码,把付款路由到正确的端点。
  • 主数据(Primary data):假设组织使用标准会计应用,你可以创建一个定义自定义费用(如关税、增值税率)的自定义元数据类型。如果把它作为扩展包的一部分包含进来,订阅组织就能引用这些主数据。

每一种模式都用可配置、可部署的元数据取代了硬编码的逻辑。

支持的字段类型、开发者支持与引用方式

slide_10
slide_11
slide_12

自定义元数据类型支持大多数标准字段类型,包括:Metadata Relationships(元数据关系)、Checkbox(复选框)、Date 与 Date/Time、Email 与 Phone、Number、Percent、Picklist、Text 与 Text Area、URL。

开发者支持:开发者可以用 SOQL 读取自定义元数据类型;用 Metadata API 创建或更新元数据记录;Apex 代码可以创建、读取和更新(但不能删除)自定义元数据记录。这个限制不是缺陷,而是一种保护——应用配置元数据不应被代码意外删除。

引用自定义元数据类型:可以直接从以下位置引用自定义元数据类型——Apex(触发器、类、控制器中的程序化访问)、Flows(Flow Builder 的声明式自动化)、公式字段(引用元数据值的动态计算)、验证规则(用元数据阈值强制数据质量)。

总结:自定义元数据类型是可定制、可部署、可打包、可升级的应用元数据。在很多情况下,它比自定义设置和自定义对象更有优势,能让应用生命周期管理与合规更简单、更快、更稳健。

二、创建和管理自定义元数据类型

slide_13

现在动手。本单元我们创建一个 Support Tier(支持等级)自定义元数据类型,添加自定义字段与记录,全程声明式、无需代码。完成本单元后,你将能够:声明式创建自定义元数据类型;创建自定义元数据类型字段;创建元数据记录。

场景:Acme Services 的支持等级

slide_15
slide_16

Acme Services 根据账户的消费金额提供不同等级的支持。更高等级可享受延长保修和额外折扣。作为 Salesforce 管理员,你要创建一个定义「有哪些等级」的应用配置,并把这个应用连同所有配置一起部署到生产组织。这正是自定义元数据类型的用武之地——它同时包含元数据定义(结构)和元数据记录(配置数据)。

我们创建一个 Support Tier 自定义元数据类型,并添加两个自定义字段:Minimum Spending(最低消费)(决定账户要消费多少才能获得某支持等级)和 Default Discount(默认折扣)(自动应用到某等级的折扣)。创建好类型和字段后,再为每个相关等级添加记录。所有东西一起打包部署,无需手动加载数据或写 Apex 脚本。

创建自定义元数据类型

slide_17

创建自定义元数据类型很直接:

  1. 从 Setup 进入 Quick Find 输入 Custom Metadata Types,选择 Custom Metadata Types
  2. 点击 New Custom Metadata Type
  3. Label 输入 Support Tier,Plural Label 输入 Support Tiers
  4. 点击 Save

保存后进入 Support Tier 详情页,从这里可以添加自定义字段、添加记录、创建验证规则、编辑页面布局。

添加自定义字段

slide_18
slide_19

给自定义元数据类型添加字段,与给标准或自定义对象添加字段完全相同:

  1. 在 Support Tier 页面的 Custom Fields 区域点击 New,选 Percent,Field Label 输入 Default Discount,Length 输入 2,保存
  2. 再创建一个字段,类型选 Number,Field Label 输入 Minimum Spending,Length 输入 6,Field Manageability 选择 Any user with the Customize Application permission(包升级不会覆盖该值),保存

Field Manageability 对 ISV 与托管包开发者至关重要:设为允许拥有相应权限的用户定制后,订阅组织可以根据自身业务调整值,而包升级不会覆盖订阅者的自定义值——应用逻辑保持一致,订阅者又能掌控自己的配置。

创建记录:Bronze、Silver、Gold

slide_20
slide_21

自定义元数据记录存储配置数据。在 Support Tier 页面点击 Manage Support Tiers → New,依次创建三个等级(用 Save & New 提高效率):

LabelDefault Discount(自定义字段)Minimum Spending(自定义字段)
Bronze(青铜)0%0
Silver(白银)10%1,000
Gold(黄金)15%5,000

这些不是普通的数据记录,而是随包一起打包部署的元数据记录。以后想加个 Platinum 等级,只需添加一条新记录。开发者可以用 SOQL 与 Apex 在这些记录之上构建自定义功能。

三、在公式、默认值和验证规则中使用

slide_22

这是自定义元数据类型真正大放异彩的地方。本单元看如何把它们用在默认值、验证规则和公式字段中——消除硬编码值,让配置真正由元数据驱动。完成本单元后,你将能够:描述在默认值、验证规则或公式中引用自定义元数据类型的用例;声明式定义引用元数据类型的公式;声明式定义设置默认值的公式;声明式定义引用元数据类型的验证规则。

设置默认值

slide_25

公式能自动完成计算,省时省力;与自定义元数据类型结合后,公式就无需逐个更新硬编码值了。先从给 Account 对象添加一个存储支持等级的选项列表字段开始:所有客户都有一个支持等级,最基础的是 Bronze,所以把它设为默认值。

  1. 从 Setup 进入 Object Manager,点击 Account → Fields & Relationships → New
  2. 选 Picklist,Field Label 输入 Support Tier,录入 Bronze / Silver / Gold 三个值(每行一个)
  3. 勾选 Required
  4. Default Value 输入:$CustomMetadata.Support_Tier__mdt.Bronze.MasterLabel
  5. 保存

现在创建 Account 记录时,默认值 Bronze 会出现在 Support Tier 字段。语法格式为:$CustomMetadata.{CustomMetadataTypeAPIName}.{RecordAPIName}.{FieldAPIName}。注意后缀:自定义元数据类型用 __mdt,字段用 __c,记录不需要后缀。(提示:默认值选项没有 UI 编辑器,不能点选插入,需直接输入。)

在验证规则中引用

slide_26
slide_27
slide_28
slide_29
slide_30

验证规则在用户保存记录前,校验其输入的数据是否符合标准,帮助保持数据准确。我们的目标是确保账户只有在消费达到指定金额后,才能获得更高等级的支持。

先创建一个汇总字段:Account → Fields & Relationships → New → 选 Roll-Up Summary → Field Label 输入 Total Spending → Summarized Object 选 Opportunities → Roll-Up Type 选 SUM → Field to Aggregate 选 Amount → 保存。这个字段汇总该账户所有商机金额,作为验证规则的输入。

然后创建验证规则:Account → Validation Rules → New → Rule Name 输入 Minimum Spending Validation,错误条件公式引用自定义元数据类型记录(用 Insert Field 逐级钻取到 Minimum Spending 字段),Error Message 输入 Dollar value too low for this support tier,保存。

验证逻辑是:如果选了某支持等级,但账户 Total Spending 低于该等级在 Support Tier 元数据中定义的最低消费,就报错。关键在于:最低消费阈值存放在元数据记录里,而不是硬编码在规则中——以后把 Gold 的最低消费从 5000 改成 10000,只需更新一条元数据记录,所有引用它的规则/公式/Flow 立即生效。

测试:创建 Beebs Publishing 账户(默认商机金额较低),试着把 Support Tier 改成 Gold → 报错;再把商机 Amount 改成 $10,000 → 现在就能改成 Gold。如果之前有多个检查最低消费的规则,用自定义元数据记录后,只改元数据值即可,无需逐个修改规则。

在公式中引用

slide_31
slide_32
slide_33

假设要在账户记录里显示「还需消费多少才能获得更高支持等级」,可以用公式引用自定义元数据类型来实现。步骤:Account → Fields & Relationships → New → 选 Formula → Field Label 输入 Amount Until Next Tier → Formula Return Type 选 Currency、Decimal Places 设 2 → 在 Advanced Formula 中粘贴以下嵌套 IF 公式(它引用元数据类型记录):

IF( Total_Spending__c < $CustomMetadata.Support_Tier__mdt.Bronze.Minimum_Spending__c, $CustomMetadata.Support_Tier__mdt.Bronze.Minimum_Spending__c - Total_Spending__c, IF( Total_Spending__c < $CustomMetadata.Support_Tier__mdt.Silver.Minimum_Spending__c, $CustomMetadata.Support_Tier__mdt.Silver.Minimum_Spending__c - Total_Spending__c, IF( Total_Spending__c < $CustomMetadata.Support_Tier__mdt.Gold.Minimum_Spending__c, $CustomMetadata.Support_Tier__mdt.Gold.Minimum_Spending__c - Total_Spending__c, 0)))

点击 Check Syntax 检查语法,设置字段对所有配置文件可见、加到 Account Layout,保存。

测试:把 Beebs Publishing 的 Support Tier 设为 Bronze,商机 Amount 改为 $700,刷新账户页面,Amount Until Next Tier 应显示 $300(Bronze 最低 0 → Silver 最低 1000,差距 300)。想象一下,如果一个组织有几十个公式字段都引用这些阈值,用自定义元数据类型只需更新记录一次;订阅包的用户也能自定义阈值而无需改动公式逻辑。

四、在 Flow 中使用

slide_34

我们已经在公式、默认值和验证规则里见识过自定义元数据类型。本单元更进一步:在 Salesforce Flow 里使用它们,基于元数据驱动的决策自动化业务流程。完成本单元后,你将能够:解释如何在 Flow 中引用自定义元数据类型记录;用 Flow Builder 引用自定义元数据类型并把其记录信息纳入 Flow。

创建引用元数据记录的 Flow

slide_37
slide_38

Acme Services 是一家大型跨国服务公司,需要创建可重复的业务流程。它希望在账户达到所需消费阈值时自动更新账户的支持等级——因为从外部系统导入了大量数据,需要用按计划运行的 Flow 来自动化这个过程。

  1. App Launcher 搜索 auto 选择 Automation,在 Flows 面板点击 New
  2. 在 Frequently Used 下选 Record-Triggered Flow
  3. Object 选 Account,Configure Trigger 选 A record is created or updated
  4. 条件:Field 选 Total Spending,Operator 选 Is Changed,Value 选 True
  5. Optimize the Flow for 选 Fast Field Updates

这表示:当 Account 的 Total Spending 发生变化(因为相关商机 Amount 更新、汇总字段级联变化)时,Flow 触发。用「Total Spending Is Changed」作为条件,确保 Flow 只在消费真正变化时运行,避免每次无关更新都触发。

获取 Support Tier 数据并更新账户

slide_39
slide_40

在 Record-Triggered Flow 元素之后的路径上,添加一个 Get Records 元素来查询元数据:

  1. 点击添加元素 → 选 Get Records,Label 输入 Get Support Tier Config(API Name 自动设为 Get_Support_Tier_Config)
  2. Object 选 Support Tier(注意:这是自定义元数据类型,不是自定义对象/自定义设置)
  3. 过滤:Field 选 Label,Operator 选 Equals,Value 输入 Gold

这样就取到了 Gold 等级的元数据记录(含 Minimum Spending 阈值)。接着在 Get Support Tier Config 之后添加 Update Records 元素:Label 输入 Update Gold Account,选择「使用触发该 Flow 的账户记录」,设置条件 Total Spending ≥ Minimum Spending(来自 Get Support Tier Config),并设置字段 Support Tier → Gold。

逻辑是:如果账户 Total Spending 达到或超过 Gold 等级的最低消费,就升级为 Gold。关键:阈值不是硬编码在 Flow 里,而是来自元数据记录——Gold 最低消费从 5000 改成 10000,只需改元数据记录,Flow 自动用新值。

保存、激活并验证 Flow

slide_41
slide_42
slide_43
slide_44

点击 Save,Flow Label 输入 Update Gold Support Tier,再 Save,然后点击 Activate(此前激活的版本会自动停用)。现在每当账户 Total Spending 变化,Flow 就会检查是否达到 Gold 阈值。

验证:从 App Launcher 选 Sales,打开 Beebs Publishing 账户,确认 Support Tier 是 Bronze;到 Related 选项卡编辑 Beebs Publishing Q1 商机,把 Amount 改成 5,500 保存;刷新账户页面,Support Tier 应变为 Gold(因为 $5,500 ≥ Gold 最低 $5,000,Flow 自动升级)。

模块回顾:本模块全程无需编码就完成了——创建自定义元数据类型并添加字段与记录;在 Account 上引用元数据设置默认值;用元数据阈值驱动验证规则;用公式计算 Amount Until Next Tier;用 Record-Triggered Flow 自动升级支持等级。自定义元数据类型是构建可配置、可部署、可升级 Salesforce 应用的基础:业务规则变化时,更新元数据记录,而不是改代码。


文章来源:Trailhead - Custom Metadata Types Basics