一、开始了解自定义元数据类型
本单元从最基础的问题讲起——什么是元数据(metadata)?——逐步建立对自定义元数据类型(Custom Metadata Types)的理解,包括它们与自定义设置的区别,以及在组织中的应用场景。完成本单元后,你将能够:定义自定义元数据类型;描述自定义设置与自定义元数据类型的区别;识别自定义元数据类型的若干用例。
什么是自定义元数据类型?
元数据(metadata)是描述其他数据的数据。例如,在 Salesforce 组织中有个标准对象叫 Account——该对象的结构就是元数据;当你往 Account 里添加一条包含客户联系信息的记录时,你添加的是数据。字段名(如 first name、last name)是元数据,字段里的值(如 Amy、Lane)是数据。
那么,什么是自定义元数据类型?它是一个用于定义应用元数据结构的对象。自定义元数据类型的字段、以及字段里的值,全都由元数据构成;自定义元数据类型的记录也是元数据,不是数据。
使用元数据非常方便,因为它可以导入到 Salesforce、在界面中修改、并用 Metadata API 操作。与其存储硬编码的数据,自定义元数据类型让你通过构建可复用、基于元数据决定行为的功能来配置应用,而且大部分定制工作都可以用声明式工具完成。
部署带自定义元数据类型的应用时,所有记录和字段都会包含在包安装里,无需额外步骤——你可以用变更集或托管包来部署自定义元数据类型。而与之相反,部署带自定义对象和自定义设置的应用时,这些对象的元数据(表头/结构)会被部署,但记录(定义)会被落下,需要手动加载或写 Apex 脚本插入,相当耗时。
换句话说,自定义元数据类型是「会随应用一起旅行」的应用配置——定义与记录一起打包部署;而自定义对象/自定义设置只部署结构、遗留数据。
自定义元数据类型与自定义设置的区别
自定义元数据类型和自定义设置都可以用于存储列表数据(如增值税率列表或支持等级列表)。自定义设置还可以配置为层级(hierarchy),让值对特定用户、配置文件或组织级别可用。两者的关键区别:
| 维度 | 自定义元数据类型 | 自定义设置 |
|---|---|---|
| 类型 | 处理列表数据,不支持基于用户/配置文件/组织层级的层级数据 | 类似自定义对象,可创建基于列表或基于层级的自定义设置 |
| 部署 | 记录可以打包部署,也可通过 Metadata API 或变更集部署 | 记录无法通过包、Metadata API 或变更集部署 |
| 关系字段 | 支持自定义元数据类型之间的查找(lookup) | 不支持关系字段 |
| 后缀 | __mdt | __c(同自定义对象) |
| Apex 中的 CRUD | 支持完整的 CRU(创建、读取、更新),不支持删除 | 支持完整 CRUD(创建、读取、更新、删除) |
一个重要的技术差异是 Apex 支持:自定义元数据类型支持创建、读取、更新,但不支持删除——这一设计体现了它们的用途:自定义元数据类型是随包发布的持久应用配置,不应被代码意外删除;而自定义设置更灵活,常用于组织特定的、随用户或配置文件变化的运行时数据。
自定义元数据类型的用例
自定义元数据类型有三种主要用途:
- 映射(Mappings):用它创建不同对象之间的关联。例如,创建一个把城市、州或省分配到某国家特定区域的自定义元数据类型。
- 业务规则(Business rules):Salesforce 有很多定义业务规则的方式,其中一种是把配置记录与自定义功能结合。例如,用自定义元数据类型配合 Apex 代码,把付款路由到正确的端点。
- 主数据(Primary data):假设组织使用标准会计应用,你可以创建一个定义自定义费用(如关税、增值税率)的自定义元数据类型。如果把它作为扩展包的一部分包含进来,订阅组织就能引用这些主数据。
每一种模式都用可配置、可部署的元数据取代了硬编码的逻辑。
支持的字段类型、开发者支持与引用方式
自定义元数据类型支持大多数标准字段类型,包括:Metadata Relationships(元数据关系)、Checkbox(复选框)、Date 与 Date/Time、Email 与 Phone、Number、Percent、Picklist、Text 与 Text Area、URL。
开发者支持:开发者可以用 SOQL 读取自定义元数据类型;用 Metadata API 创建或更新元数据记录;Apex 代码可以创建、读取和更新(但不能删除)自定义元数据记录。这个限制不是缺陷,而是一种保护——应用配置元数据不应被代码意外删除。
引用自定义元数据类型:可以直接从以下位置引用自定义元数据类型——Apex(触发器、类、控制器中的程序化访问)、Flows(Flow Builder 的声明式自动化)、公式字段(引用元数据值的动态计算)、验证规则(用元数据阈值强制数据质量)。
总结:自定义元数据类型是可定制、可部署、可打包、可升级的应用元数据。在很多情况下,它比自定义设置和自定义对象更有优势,能让应用生命周期管理与合规更简单、更快、更稳健。
二、创建和管理自定义元数据类型
现在动手。本单元我们创建一个 Support Tier(支持等级)自定义元数据类型,添加自定义字段与记录,全程声明式、无需代码。完成本单元后,你将能够:声明式创建自定义元数据类型;创建自定义元数据类型字段;创建元数据记录。
场景:Acme Services 的支持等级
Acme Services 根据账户的消费金额提供不同等级的支持。更高等级可享受延长保修和额外折扣。作为 Salesforce 管理员,你要创建一个定义「有哪些等级」的应用配置,并把这个应用连同所有配置一起部署到生产组织。这正是自定义元数据类型的用武之地——它同时包含元数据定义(结构)和元数据记录(配置数据)。
我们创建一个 Support Tier 自定义元数据类型,并添加两个自定义字段:Minimum Spending(最低消费)(决定账户要消费多少才能获得某支持等级)和 Default Discount(默认折扣)(自动应用到某等级的折扣)。创建好类型和字段后,再为每个相关等级添加记录。所有东西一起打包部署,无需手动加载数据或写 Apex 脚本。
创建自定义元数据类型
创建自定义元数据类型很直接:
- 从 Setup 进入 Quick Find 输入
Custom Metadata Types,选择 Custom Metadata Types - 点击 New Custom Metadata Type
- Label 输入
Support Tier,Plural Label 输入Support Tiers - 点击 Save
保存后进入 Support Tier 详情页,从这里可以添加自定义字段、添加记录、创建验证规则、编辑页面布局。
添加自定义字段
给自定义元数据类型添加字段,与给标准或自定义对象添加字段完全相同:
- 在 Support Tier 页面的 Custom Fields 区域点击 New,选 Percent,Field Label 输入
Default Discount,Length 输入2,保存 - 再创建一个字段,类型选 Number,Field Label 输入
Minimum Spending,Length 输入6,Field Manageability 选择 Any user with the Customize Application permission(包升级不会覆盖该值),保存
Field Manageability 对 ISV 与托管包开发者至关重要:设为允许拥有相应权限的用户定制后,订阅组织可以根据自身业务调整值,而包升级不会覆盖订阅者的自定义值——应用逻辑保持一致,订阅者又能掌控自己的配置。
创建记录:Bronze、Silver、Gold
自定义元数据记录存储配置数据。在 Support Tier 页面点击 Manage Support Tiers → New,依次创建三个等级(用 Save & New 提高效率):
| Label | Default Discount(自定义字段) | Minimum Spending(自定义字段) |
|---|---|---|
| Bronze(青铜) | 0% | 0 |
| Silver(白银) | 10% | 1,000 |
| Gold(黄金) | 15% | 5,000 |
这些不是普通的数据记录,而是随包一起打包部署的元数据记录。以后想加个 Platinum 等级,只需添加一条新记录。开发者可以用 SOQL 与 Apex 在这些记录之上构建自定义功能。
三、在公式、默认值和验证规则中使用
这是自定义元数据类型真正大放异彩的地方。本单元看如何把它们用在默认值、验证规则和公式字段中——消除硬编码值,让配置真正由元数据驱动。完成本单元后,你将能够:描述在默认值、验证规则或公式中引用自定义元数据类型的用例;声明式定义引用元数据类型的公式;声明式定义设置默认值的公式;声明式定义引用元数据类型的验证规则。
设置默认值
公式能自动完成计算,省时省力;与自定义元数据类型结合后,公式就无需逐个更新硬编码值了。先从给 Account 对象添加一个存储支持等级的选项列表字段开始:所有客户都有一个支持等级,最基础的是 Bronze,所以把它设为默认值。
- 从 Setup 进入 Object Manager,点击 Account → Fields & Relationships → New
- 选 Picklist,Field Label 输入
Support Tier,录入 Bronze / Silver / Gold 三个值(每行一个) - 勾选 Required
- Default Value 输入:
$CustomMetadata.Support_Tier__mdt.Bronze.MasterLabel - 保存
现在创建 Account 记录时,默认值 Bronze 会出现在 Support Tier 字段。语法格式为:$CustomMetadata.{CustomMetadataTypeAPIName}.{RecordAPIName}.{FieldAPIName}。注意后缀:自定义元数据类型用 __mdt,字段用 __c,记录不需要后缀。(提示:默认值选项没有 UI 编辑器,不能点选插入,需直接输入。)
在验证规则中引用
验证规则在用户保存记录前,校验其输入的数据是否符合标准,帮助保持数据准确。我们的目标是确保账户只有在消费达到指定金额后,才能获得更高等级的支持。
先创建一个汇总字段: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。如果之前有多个检查最低消费的规则,用自定义元数据记录后,只改元数据值即可,无需逐个修改规则。
在公式中引用
假设要在账户记录里显示「还需消费多少才能获得更高支持等级」,可以用公式引用自定义元数据类型来实现。步骤: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 中使用
我们已经在公式、默认值和验证规则里见识过自定义元数据类型。本单元更进一步:在 Salesforce Flow 里使用它们,基于元数据驱动的决策自动化业务流程。完成本单元后,你将能够:解释如何在 Flow 中引用自定义元数据类型记录;用 Flow Builder 引用自定义元数据类型并把其记录信息纳入 Flow。
创建引用元数据记录的 Flow
Acme Services 是一家大型跨国服务公司,需要创建可重复的业务流程。它希望在账户达到所需消费阈值时自动更新账户的支持等级——因为从外部系统导入了大量数据,需要用按计划运行的 Flow 来自动化这个过程。
- App Launcher 搜索
auto选择 Automation,在 Flows 面板点击 New - 在 Frequently Used 下选 Record-Triggered Flow
- Object 选 Account,Configure Trigger 选 A record is created or updated
- 条件:Field 选 Total Spending,Operator 选 Is Changed,Value 选 True
- Optimize the Flow for 选 Fast Field Updates
这表示:当 Account 的 Total Spending 发生变化(因为相关商机 Amount 更新、汇总字段级联变化)时,Flow 触发。用「Total Spending Is Changed」作为条件,确保 Flow 只在消费真正变化时运行,避免每次无关更新都触发。
获取 Support Tier 数据并更新账户
在 Record-Triggered Flow 元素之后的路径上,添加一个 Get Records 元素来查询元数据:
- 点击添加元素 → 选 Get Records,Label 输入
Get Support Tier Config(API Name 自动设为 Get_Support_Tier_Config) - Object 选 Support Tier(注意:这是自定义元数据类型,不是自定义对象/自定义设置)
- 过滤: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
点击 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 应用的基础:业务规则变化时,更新元数据记录,而不是改代码。



































