Snowflake DCM Projects¶
Snowflake DCM Projects (Database Change Management Projects) 支持以声明式方法将 Snowflake 对象作为代码进行管理。您可以在定义文件中定义数据库、架构、表和其他对象所需的目标状态,Snowflake 会确定并应用必要的更改以达到该状态。它通过“先规划再部署”的工作流程,实现跨环境(如开发、测试和生产)的版本可控、可重复部署,这种流程在基础设施即代码工具中非常常见。
如果定义包含重复模式,则可以使用 Jinja 模板(包括字典、循环、条件和宏)对代码进行参数化。
用于管理 DCM project 的高级工作流程如下:
在 Snowflake 工作区、远程 Git 仓库或本地目录中创建 DCM project 文件(
manifest.yml和 SQL 定义文件)。为每个目标环境创建一个新的 DCM project。
在 DCM project 文件中定义 Snowflake 对象。
转换现有的 SQL 部署脚本,方法是使用 DEFINE 关键字(适用于支持的对象类型)。
(可选)添加共享或替代模板变量和宏。
执行 DCM PLAN 命令来模拟部署并预览变更。
部署项目版本以在 Snowflake 中应用变更。
监控项目执行情况。
迭代您的 DCM 项目。更新项目文件,查看计划输出,并根据需要部署新版本。
此生命周期可帮助您以受控、版本化和可审计的方式构建、测试、部署和监控数据库变更。
下图说明了上面概述的 DCM Projects 生命周期。
关键术语¶
以下是使用 DCM Projects 时应了解的关键术语。
- 声明性定义
在 DCM Projects 中,您可以定义 Snowflake 环境的所需状态,例如应存在哪些表、架构或角色,而与对象的当前状态无关。您不必指定创建或修改它们的每个步骤。您描述自己想要 什么,Snowflake 会找出 如何 实现它。
具体来说,DCM Projects 利用具有模板功能的 DEFINE 语句。这使得项目文件可重复使用,并可针对不同环境进行自定义。项目中 DEFINE 语句的顺序和位置不会影响结果。Snowflake 会在应用变更之前收集所有语句并对其进行排序,因此您无需手动处理排序或依赖关系。
- DCM 项目文件
DCM project 基于一组 SQL 和 YAML 源文件,通常在 Git 存储库或本地工作区中管理。您在项目定义文件(SQL 文件)中为 DCM project 定义 Snowflake 对象、它们的属性、关系和约束。您可以在开发工作区中更新项目文件。只有在通过 DCM project 对象部署变更后,变更才会在 Snowflake 中生效。
- DCM 项目对象
DCM project 是 Snowflake 中的架构级对象,用于部署和管理 DCM project 文件中定义的对象。每个目标环境都需要一个 DCM project 对象。
DCM project 对象用于执行 DCM 命令,并存储所有已执行部署的不可变工件和定义文件。
虽然 DCM project 是架构级对象,您可以使用它来创建和管理其他数据库中的对象。您还可以执行 DCM project,以对工作流的更改进行演练,从而在部署前预览这些变更。
要求¶
使用 Snowsight、Snowflake CLI、SQL 或 Cortex CLI 管理 DCM Projects。
您需要一个数据库和一个架构,您可以在其中创建 DCM project 对象。
在本地或 Snowflake Workspace 中存储您的 DCM project 定义。
使用 Git 进行协作、版本控制和同步变更。
如果要执行本地定义,请使用 Snowflake CLI,您还需要在目标 DCM project 对象的架构中创建临时暂存区的权限。
注意事项和限制¶
项目规模
目前,DCM Projects 最多支持 1,000 个源文件和 10,000 个渲染后的对象定义或授权。
超过 1,000 个文件或 10,000 个定义时,性能可能会下降,在某些情况下还会出现执行失败。
将定义合并到更少的文件中,通常可以让 PLAN 和 DEPLOY 命令的执行速度更快。
随着性能和可扩展性的不断提高,此限制将在公开预览期间提高。
变更集
PLAN 和 DEPLOY 命令列出
plan_result.json文件内的所有 DDL 更改。变更集列出了已执行或计划的操作(CREATE、ALTER、DROP)以及受影响的各个属性,例如注释、计划和超时。重要
在 DCM Projects 预览阶段时,不能保证变更集捕获每个对象所有属性的每个精细变更。
模板化
由于定义文件是 Jinja2 模板,因此适用于 Jinja2 模板的所有限制。
DCM 模板变量不适用于凭据等敏感信息。渲染的 SQL 定义不会脱敏环境变量插入的任何值。
DCM Projects 关键用例¶
本节介绍 DCM Projects 关键用例,以及它们如何帮助解决数据企业大规模面临的挑战。根据团队的职责,这些用例分为两大类:
用于管理基础设施的 DCM Projects¶
DCM Projects 帮助解决平台团队经常遇到的以下挑战:
当平台团队想要为多个业务部门部署和维护标准化基础设施时,他们可以使用 DCM Projects 将代码中的一组标准对象定义为 SQL 文件。借助 Jinja,此模板可以参数化(例如按团队名称),并可多次部署。
示例:为每个业务部门创建专用 DCM project¶
一种方法是为每个业务部门创建专用 DCM project,所有项目都引用相同的参数化定义文件,如以下 definitions.sql 示例所示:
使用以下命令执行 DCM project:
示例:创建适用于多个业务部门的单个 DCM project¶
这种方法通过在 Jinja 模板中使用循环,让您能够在一个 DCM project 中管理多个业务单元的基础设施,如下方的 definitions.sql 示例所示:
使用以下命令执行 DCM project:
这使得平台团队和管理员能够轻松执行如下变更:
将新团队添加到列表中,以部署该团队的现有基础设施模板。
从列表中移除团队以停用该团队的基础设施。
为所有团队添加一个新的 READ_ONLY 角色。
更改所有团队或特定团队的特定配置,例如权限或仓库大小。
运行 PLAN 以将当前状态与预期标准进行比较,并重新部署以恢复标准。
用于数据管道的 DCM Projects¶
DCM Projects 有助于应对功能团队经常遇到的以下挑战:
希望轻松编写和管理数据管道的业务部门可以使用 DCM Projects 定义、测试、部署和迭代其业务逻辑。
您可以:
在一个项目中统一管理 Snowflake 对象类型,包括表、动态表、视图、仓库、角色、权限、数据指标函数和期望。
测试增量变更并将其部署到管道。您可以更改配置、实施转换逻辑以及添加列和视图。
在部署对象之前预览数据样本以验证转换逻辑。
将相同的管道定义部署到多个环境。
在将变更部署到生产环境之前,在预生产环境中测试数据质量预期。
DCM Projects 提供用于创作和管理数据管道的附加功能。有关详细信息,请参阅 用于数据管道的 DCM Projects。