DCM Projects 的企业用例

本主题介绍如何在企业环境中使用 DCM Projects,包括管理多个项目、使用多个环境以及项目协作等内容。

何时使用多个 DCM 项目

在决定是否以及如何将 DCM project 拆分为多个项目时,需要考虑所有权归属和模板化问题。

所有权

每个项目都有一个所有者角色,该角色能够部署所有已定义的对象。通过权限授予,可以对项目内的单个对象进行精细的访问管理。然而,如果不同用户组分别负责将变更部署到项目中,那么相应地拆分 DCM project 通常是合理的做法。

以下是示例场景:

  • 平台管理员负责部署数据库和仓库,创建团队管理员角色,并为团队管理员授予 CREATE 权限,使其能够管理该数据库内指定的一组对象类型,同时授予其对指定的一组账户级集成的访问权限。

  • 团队管理员现在可以决定如何组织该数据库中的架构和动态表、调整刷新频率,并为团队成员授予更精细的读取权限。

以下是解决方案:

  • 平台管理员为团队部署高级别基础设施,并授予团队管理员在其数据库中创建 DCM project 项目的权限。

  • 团队管理员现在也可以利用 DCM Projects,在团队数据库中创建一个或多个项目,以便管理表结构及团队成员的权限授予。

模板变量

如果 DCM project 定义了一系列相互之间相似且应保持这种相似性的对象,那么将它们定义为参数化模板,一次性定义通常会更加便捷。

以下是示例场景:

  • 平台团队为组织中的每个区域团队部署一个数据库。

  • 未来预计会陆续增加新的区域。

  • 所有区域所需的架构、登录表、角色和仓库配置基本相同。

  • 对该数据库模板的变更(例如添加只读角色)应同步应用到所有团队。

以下是解决方案:

  • 您可以通过循环方式,为清单配置文件中列出的每个区域团队执行同一组定义。

当该模板中的更多元素开始出现差异,且模板化条件的数量逐渐增多时,阅读和维护具有各自对象定义的独立 DCM 项目就会变得更容易。

在多个环境中使用 DCM Projects

下图展示了将 DCM project 部署到多个环境的典型工作流程。

变更的审核与合并

多账户方案与多数据库方案

Snowflake 通常建议将每个环境设置为独立的 Snowflake 账户。这样可以确保生产基础设施与任何试验性开发完全隔离,并保证开发者对生产数据的访问受到严格限制。

不过,通过精细的访问管理,您也可以在一个 Snowflake 账户中成功管理多个环境。当数据库之间界限清晰时,这种做法相对简单;但如果涉及账户级对象和集成,则会更具挑战性。

单账户设置的优势在于,可以轻松克隆生产基础设施和数据,从而在将变更部署到生产环境之前进行测试。但是,将部分生产数据和基础设施复制到其他账户(例如通过组织内部数据共享)的成本可能会更高。

对 DCM project 模板化的影响

在单账户方案中,需要为每个环境设置不同的对象名称,例如将 EMEA_DBEMEA_ADMINEMEA_DB_DEVEMEA_ADMIN_DEV 区分开来。Snowflake 也建议在多账户方案中采用这种做法。通过模板化名称,可以使 EMEA_DB_DEV_JOHNEMEA_DB_DEV_MARY 等实体的多个实例共存,以支持独立开发,并可快速创建和销毁沙盒环境来测试不同的解决方案。

这一点适用于所有账户级对象,例如数据库、角色和仓库。然后,您需要将这些模板化名称应用到嵌套对象的所有完全限定名称中。

DCM Projects 协作

共享开发环境

多名开发人员通常共享同一个开发账户,并行构建和迭代数据产品。但是,如果多名用户在同一个项目上并行工作,且未使用模板化来创建唯一名称,则他们的 PLAN 和 DEPLOY 操作可能会引发冲突。

以下是示例场景:

  • 用户 A 和用户 B 正在对已在生产环境中运行的项目 TASTYBYTES 的不同部分进行变更测试。

  • 每个用户都创建了自己的 prod-main 功能分支,并开始编辑实体定义。

  • 每个用户都创建了自己的 |dcm-object|(TASTYBYTES_DEV_ATASTYBYTES_DEV_B)。

  • 如果两个用户都使用相同的 DEV 模板化配置部署到同一个 Snowflake 账户,则会出现以下情况:

    • 用户 A 先部署了所有实体的新 _DEV 实例,其中包括 TB_WAREHOUSE_DEV,因此这些实体由其项目 TASTYBYTES_DEV_A 管理。

    • 当用户 B 尝试部署一个或多个相同名称的对象(例如 TB_WAREHOUSE_DEV)时,由于该仓库已被 TASTYBYTES_DEV_A 管理,因此 TASTYBYTES_DEV_B 的部署会失败。

  • 另一种情况是,两个用户可能拥有并使用同一个项目 TASTYBYTES_DEV 进行部署,但各自指向不同的分支文件夹。这将导致用户 B 覆盖用户 A 已部署的所有实体版本,反之亦然。

以下是解决方案:

  • 在同一个开发环境中并行工作时,Snowflake 建议始终使用不同的实体名称,以避免对象名称冲突。您可以通过在数据库、仓库和角色名称的模板中添加唯一后缀来实现这一点。例如,DEFINE DATABASE DCM_PROJECT_{{db}};

  • 在使用如下例所示的配置文件时,多名开发人员都可以使用 DEV 配置将其仓库设置为 X-SMALL

  • 为避免数据库名称冲突,开发者应使用唯一字符串覆盖 db 变量。该唯一字符串可以基于用户名、功能名称、工单号或分支名称等。

    例如,snow dcm deploy --variable "db='DEV_JS'" 将解析为一个唯一的 DEFINE DATABASE DCM_PROJECT_DEV_JS; 操作。

    templating:
      defaults:
        wh_size: "X-SMALL"
    
      configurations:
        DEV:
          db: "DEV"
    
        TEST:
          db: "TEST"
    
        PROD:
          db: "PROD"
          wh_size: "LARGE"
    
  • 当一名开发者同时处理多个项目时,也可以采用相同的模板化方案。

  • 以下是一个适用于团队的可扩展项目设置示例。

    开始新的 Jira 工单时,请完成以下步骤:

    1. CREATE GIT BRANCH {{ticket_number}} FROM REPO

    2. CREATE DCM PROJECT {{ticket_number}}

    3. EXECUTE DCM PROJECT {{ticket_number}} PLAN USING CONFIGURATION "DEV" (db => '{{ticket_number}}') FROM @REPO/BRANCHES/{{ticket_number}}/DCM_PROJECT/