Snowflake数据仓库中的架构版本控制

时间:2019-12-10 16:54:56

标签: snowflake-data-warehouse

我对通过使用模式版本控制可以保护雪花数据库用户免受更改的方式感兴趣。我一直在研究使用连接语法定义一个架构,在该架构中,将为每个版本创建一个包含指向核心表的视图的新架构,将复制未更改的任何视图,将其修改后的其他视图向后兼容。在用户连接时,理想情况下,将为他们提供所需版本的正确连接语法。

我遇到的问题是,有多个团队各自拥有与核心业务领域相关联的架构,而且我认为不可能在连接语法中定义多个架构。

有人在拥有多个用户,架构和开发团队的环境中实现这一目标吗?

此致

卢克

2 个答案:

答案 0 :(得分:2)

我们将Alembic用于Snowflake的数据库版本控制。 Alembic是一个“迁移”工具,您可以在其中运行对数据仓库的多次更改(或迁移)。它本质上是Python中SQLAlchemy库的一个附加组件。

在本地进行开发时,我们将创建数据库的克隆,并测试对克隆数据库的迁移更改。知道它可行后,我们将其推送到GitLab,获得批准,然后我们可以运行具有accountadmin凭据的CI / CD管道来进行生产更改。

由于它是用Python编写的,因此可以将其连接到Git工具(例如GitHub或GitLab),并在“合并请求”中提交更改并获得批准,然后才能在生产数据库中运行它。

以下是文档:https://alembic.sqlalchemy.org/en/latest/

根据Snowflake文档:https://docs.snowflake.net/manuals/user-guide/sqlalchemy.html#alembic-support

,这也得到正式支持

一个示例Alembic迁移可能看起来像:


Revision ID: 78a3acc7fbb2
Revises: 3f2ee8d809a6
Create Date: 2019-11-06 11:40:38.438468

"""

# revision identifiers, used by Alembic.
revision = '78a3acc7fbb2'
down_revision = '3f2ee8d809a6'
branch_labels = None
depends_on = None

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.create_table('test_table',
    sa.Column('op', sa.String(length=255), nullable=True),
    sa.Column('id', sa.String(length=255), nullable=False),
    sa.Column('amount', sa.BigInteger(), nullable=True),
    sa.Column('reason', sa.String(length=255), nullable=True),
    sa.Column('deleted', sa.Boolean(), nullable=True),
    sa.Column('user_id', sa.Integer(), nullable=True),
    sa.Column('company_id', sa.Integer(), nullable=True),
    sa.Column('inserted_at', sa.DateTime(), nullable=True),
    sa.Column('updated_at', sa.DateTime(), nullable=True),
    sa.Column('dw_import_filename', sa.String(length=255), nullable=True),
    sa.Column('dw_import_file_row_number', sa.Integer(), nullable=True),
    sa.Column('dw_import_timestamp', sa.TIMESTAMP(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    schema='test_schema'
    )

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('test_table', schema='test_schema')

如您所见,您必须提供升级并具有降级的能力,这会逆转升级。如果您对Alembic有其他疑问,或者您对此有兴趣,那么我很乐于解释更多。

答案 1 :(得分:0)

作为发布过程的第一步,您可以将“当前版本”架构克隆为新的“ x版本”架构,然后使用原始名称部署新架构。

示例:

创建模式MY_DB.MY_SCHEMA_20200103复制MY_DB.MY_SCHEMA;

...部署发布步骤...

重要说明

  • 您必须小心所有引用,以确保它们指向正确的对象,无论是版本化架构中的对象还是当前架构中的对象。
  • 这将复制对架构内所有对象的授权,但是将需要授予对新创建的架构的特权