首页 文章

如何控制SQL Server数据库的版本?

提问于
浏览
15

我有SQL Server数据库并对其进行更改 . 某些数据库表的记录是我的应用程序运行所需的起始记录 . 我想对数据库和这些记录(行)进行版本控制 . 有可能这样做并将其捆绑到我的源代码的SVN版本控制或是否有其他解决方案?我想实现这一点,以便能够返回到以前版本的数据库并比较数据库修订版之间的更改 . 如果这个工具是免费的,开源的或者不是非常昂贵,那将是很好的 .

我的环境是Visual C#Express,SQL Server 2008 Express和Tortoise SVN .

10 回答

  • 0

    我们刚刚开始对我们的一些项目进行以下操作,并且它似乎工作得很好,用于填充“静态”表 .

    我们的脚本遵循构造临时表的模式,然后填充我们希望真实表格类似的东西 . 我们在这里只提供人类可读的值(即我们不包括IDENTITY / GUID列) . 该脚本的其余部分获取临时表并执行适当的INSERT / UPDATE / DELETE语句以使真实表类似于临时表 . 当我们必须更改这个“静态”数据时,我们必须更新的是临时表的填充 . 这意味着版本之间的DIFF可以按预期工作,并且回滚脚本就像从源代码控制获取以前的版本一样简单 .

    INSERT / UPDATE / DELETE只需要写一次 . 实际上,我们的脚本稍微复杂一些,并且在实际的DML语句之前运行了两组验证 . 一组验证临时表数据(即,我们不会通过尝试使数据库类似于临时表来违反任何约束) . 另一个验证临时表和目标数据库(即外键可用) .

  • 3

    迟到的答案,但希望对其他读者有用

    我建议使用名为ApexSQL Source Control的SSMS加载项 . 通过使用此加载项,开发人员可以通过向导直接从SSMS轻松地使用源控制系统映射数据库对象 . 它包括对Git,TFS,Mercurial,Subversion,TFS(包括Visual Studio Online)和其他源代码控制系统的支持 . 它还包括对源控制静态数据的支持(因此您也可以控制版本控制记录) .

    下载并安装ApexSQL Source Control后,只需右键单击要进行版本控制的数据库,然后导航到SSMS中的ApexSQL Source Control子菜单 . 单击“将数据库链接到源控件”选项,然后选择源控制系统和数据库开发模型,例如:

    enter image description here

    之后,您可以排除不希望链接到源代码管理的对象 . 可以按所有者或类型排除特定对象 .

    在下一步中,系统将提示您提供源控制管理系统的登录信息:

    enter image description here

    完成后,只需单击“完成”按钮,将显示“操作中心”窗口,提供将提交到存储库的对象(默认情况下,如果存储库为空) .

    将数据库链接到源控件后,可以从“对象资源管理器”窗格中获取可从源控件客户端执行的所有操作 . 其中包括:

    • 检查是否锁定版本化对象,

    • 查看该对象的历史记录并应用特定修订版,

    • 查看已创建的对象的更改

    • 使用“链接静态数据”将数据从表格放置到源代码管理

    您可以阅读本文以获取更多信息:http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/

  • 2

    SQL Source Control 2.0中添加了静态数据支持,目前可在beta版中使用 . 有关如何尝试此操作的更多信息,请访问:

    http://www.red-gate.com/messageboard/viewtopic.php?t=12298

  • 4

    有一个名为Database Publishing Wizard的免费微软产品,您可以使用它来编写整个数据库(模式和数据)的脚本 . 它非常适合拍摄数据库当前状态的快照,并且可以让您随时从头开始重新创建

  • 1

    对于数据库(模式)版本控制,我们使用自定义属性,这些属性在运行安装程序时添加到数据库中 . 这些脚本的内容是使用我们的构建脚本生成的 .

    设置属性的脚本如下所示:

    DECLARE @AssemblyDescription sysname
    SET @AssemblyDescription = N'DailyBuild_20090322.1'
    
    DECLARE @AssemblyFileVersion sysname
    SET @AssemblyFileVersion = N'0.9.3368.58294'
    
    -- The extended properties DatabaseDescription and DatabaseFileVersion contain the
    -- AssemblyDescription and AssemblyFileVersion of the build that was used for the
    -- database script that creates the database structure.
    -- 
    -- The current value of these properties can be displayed with the following query:
    -- SELECT * FROM sys.extended_properties
    
    IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseDescription')
    BEGIN
        EXEC sys.sp_updateextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
    END
    ELSE
    BEGIN
        EXEC sys.sp_addextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
    END
    
    IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseFileVersion')
    BEGIN
        EXEC sys.sp_updateextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
    END
    ELSE
    BEGIN
        EXEC sys.sp_addextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
    END
    GO
    
  • 0

    您可以获得SQL Server Express的SQL Management Studio版本 . 我相信你可以用这个来制作数据库架构的脚本 . 我认为这将让您手动创建脚本以插入起始记录 .

    然后,将所有脚本以及以正确顺序运行各个脚本的主脚本放入源代码控制中 .

    您将能够使用windiff运行差异(使用Visual Studio SDK免费),否则Beyond Compare便宜,并且是一个很棒的差异/合并/同步工具 .

  • 0

    MS Visual Studio Team System for Database Developers具有轻松生成整个模式的创建脚本的功能 . 唯一的缺点是成本!

    你考虑过使用SubSonic吗?

  • 0

    您应该使用特定于DB的版本控制 .

    http://msdn.microsoft.com/en-us/library/ms189050.aspx

    当READ_COMMITTED_SNAPSHOT或ALLOW_SNAPSHOT_ISOLATION数据库选项为ON时,将为数据库中执行的所有数据修改维护逻辑副本(版本) . 每次特定事务修改行时,数据库引擎的实例都会在tempdb中存储该行的先前提交的映像的版本 . 每个版本都标有进行更改的事务的事务序列号 . 使用链接列表链接已修改行的版本 . 最新的行值始终存储在当前数据库中,并链接到tempdb中存储的版本化行 .

  • 0

    我使用bcp(批量加载实用程序,标准SQL Server安装的一部分,包括Express版本) .

    每个包含数据的表都需要一个控制文件 Table.ctl 和一个数据文件 Table.csv (这些是可以使用 bcp 从现有数据库生成的文本文件) . 作为文本文件,这些文件很容易被版本化 .

    作为我的代批次的一部分(有关更多信息,请参阅my answer there),我遍历每个控制文件,如下所示:

    SET BASE_NAME=MyDatabaseName
    SET CONNECT_STRING=.\SQLEXPRESS
    
    FOR /R %%i IN (.) DO (
      FOR %%j IN ("%%~fi\*.ctl") DO (
        ECHO +   %%~nj
        bcp %BASE_NAME%..%%~nj in "%%~dpsj%%~nj.csv" -T -E -S %CONNECT_STRING% -f "%%~dpsj%%~nj.ctl" >"%TMP%\%%~nj.log"
        IF %ERRORLEVEL% GTR 0 (
          TYPE "%TMP%\%%~nj.log"
          GOTO ERROR_USAGE
        )
      )
    )
    

    此脚本的当前限制是文件的名称必须是表的名称,如果表名包含特定的特殊字符,则可能无法使用该名称 .

  • 1

    这个project有一个很好的部署和回滚示例

相关问题