Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server数据库的版本控制_Sql Server_Database_Svn_Version Control - Fatal编程技术网

Sql server SQL Server数据库的版本控制

Sql server SQL Server数据库的版本控制,sql-server,database,svn,version-control,Sql Server,Database,Svn,Version Control,我想让我的数据库处于版本控制之下。有人有什么建议或推荐文章让我开始吗 我总是希望在那里至少有一些数据(如前所述:用户类型和管理员)。我还经常需要收集大量生成的测试数据以进行性能测量。这是围绕开发的“难题”之一。据我所知,没有完美的解决方案 如果只需要存储数据库结构而不需要存储数据,则可以将数据库导出为SQL查询。(在Enterprise Manager中:右键单击数据库->生成SQL脚本。我建议在“选项”选项卡上设置“为每个对象创建一个文件”),然后您可以将这些文本文件提交给svn,并使用svn

我想让我的数据库处于版本控制之下。有人有什么建议或推荐文章让我开始吗

我总是希望在那里至少有一些数据(如前所述:用户类型和管理员)。我还经常需要收集大量生成的测试数据以进行性能测量。

这是围绕开发的“难题”之一。据我所知,没有完美的解决方案

如果只需要存储数据库结构而不需要存储数据,则可以将数据库导出为SQL查询。(在Enterprise Manager中:右键单击数据库->生成SQL脚本。我建议在“选项”选项卡上设置“为每个对象创建一个文件”),然后您可以将这些文本文件提交给svn,并使用svn的diff和logging功能

我将它与一个批处理脚本绑定在一起,该脚本接受两个参数并设置数据库。我还添加了一些输入默认数据的附加查询,如用户类型和管理员用户。(如果你想知道更多关于这个的信息,发布一些东西,我可以把脚本放在可以访问的地方)


如果还需要保留所有数据,我建议保留数据库的备份,并使用Redgate()产品进行比较。它们不便宜,但它们值每一分钱。

马丁·福勒(Martin Fowler)就这一主题写了我最喜欢的文章。我选择不像alumb和其他人建议的那样将模式转储置于版本控制之下,因为我想要一种升级生产数据库的简单方法

对于只有一个生产数据库实例的web应用程序,我使用两种技术:

数据库升级脚本 序列数据库升级脚本,其中包含将架构从版本N移动到N+1所需的DDL。(这些放在你的版本控制系统中。)一个_version _history _表,类似

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );
每次运行与新版本对应的升级脚本时,获取一个新条目

这确保了很容易看到数据库架构的版本,并且数据库升级脚本只运行一次。同样,这些是而不是数据库转储。相反,每个脚本表示从一个版本移动到下一个版本所需的更改。它们是应用于生产数据库以“升级”它的脚本

开发人员沙盒同步
  • 用于备份、清理和收缩生产数据库的脚本。在每次升级到生产数据库后运行此命令
  • 用于在开发人员工作站上恢复(并在必要时调整)备份的脚本。每个开发人员在每次升级到生产数据库后都会运行此脚本

  • 警告:我的自动测试是针对一个模式正确但为空的数据库运行的,因此此建议将不能完全满足您的需要。

    您没有提到有关目标环境或约束的任何细节,因此这可能不完全适用。。。但是,如果您正在寻找一种有效跟踪不断发展的DB模式的方法,并且不反对使用Ruby,那么ActiveRecord的迁移就是您的拿手好戏

    迁移使用Ruby DSL以编程方式定义数据库转换;每个转换都可以应用或(通常)回滚,允许您在任何给定的时间点跳转到DB模式的不同版本。定义这些转换的文件可以像任何其他源代码一样签入版本控制


    因为迁移是Rails应用程序的一部分,所以它们通常在全堆栈Rails应用程序中使用;但是,您可以独立于Rails使用ActiveRecord,只需花费很少的精力。有关在Rails之外使用AR迁移的更多详细信息,请参阅。

    典型的解决方案是根据需要转储数据库并备份这些文件

    根据您的开发平台,可能有可用的开源插件。滚动您自己的代码来完成这项工作通常相当简单


    注意:您可能希望备份数据库转储,而不是将其置于版本控制中。这些文件在版本控制中可能会变得非常快,并导致整个源代码管理系统变得缓慢(我现在回忆起一个CVS恐怖故事)。

    您还可以看看迁移解决方案。它们允许您在C代码中指定数据库模式,并使用MSBuild上下滚动数据库版本


    我目前正在使用,它一直运行良好。

    我们不存储数据库模式,而是存储对数据库的更改。我们要做的是存储模式更改,以便为数据库的任何版本构建更改脚本,并将其应用于客户的数据库。我编写了一个数据库实用程序,它与我们的主应用程序一起分发,可以读取脚本并知道需要应用哪些更新。它还具有足够的智能,可以根据需要刷新视图和存储过程。

    我们用来管理SQL数据库。然后,您将脚本放在版本控制中构建一个新数据库,它要么构建一个新数据库,要么将任何现有数据库升级到版本控制中的模式。这样,您就不必担心创建更改脚本(尽管您仍然可以这样做,例如,如果您想更改列的数据类型并需要转换数据)。

    如果您有一个小型数据库,并且希望对整个内容进行版本化,可能会有所帮助。它将MSSQL数据库MDF文件分离、压缩并检入Subversion


    如果您主要希望对模式进行版本设置,并且只需要少量的引用数据,则可以使用来处理该问题。好处是,您可以轻松地向上或向下迁移到任何特定版本。

    < P>我们刚刚开始使用Team Foundation Server。如果您的数据库是中等大小的,那么VisualStudio有一些很好的项目集成,包括内置比较、数据比较、数据库重构工具、数据库测试框架,甚至数据生成工具

    但是,这个模型不适合很大的尺寸
      <Relationship RelationshipID="1" InternalName="Manager"/>
      <Relationship RelationshipID="2" InternalName="Delegate"/>
      etc.
    
    IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
    CREATE TABLE last_run_sysversions (
        name varchar(128), 
        id int, base_schema_ver int,
        schema_ver int,
        type char(2)
    )
    
    IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
    CREATE TABLE #tmp (
        name varchar(128), 
        id int, base_schema_ver int,
        schema_ver int,
        type char(2)
    )
    
    SET NOCOUNT ON
    
    -- Insert the values from the end of the last run into #tmp
    INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
    SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions
    
    DELETE last_run_sysversions
    INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
    SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects
    
    -- This next bit lists all differences to scripts.
    SET NOCOUNT OFF
    
    --Renamed.
    SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
    FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
    WHERE o.name <> t.name /*COLLATE*/
    AND o.type IN ('TR', 'P' ,'U' ,'V')
    UNION 
    
    --Changed (using alter)
    SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
           'altered' AS extra_info, 2 AS Priority
    FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
    WHERE (
       o.base_schema_ver <> t.base_schema_ver
    OR o.schema_ver      <> t.schema_ver
    )
    AND  o.type IN ('TR', 'P' ,'U' ,'V')
    AND  o.name NOT IN ( SELECT oi.name 
             FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
             WHERE oi.name <> ti.name /*COLLATE*/
             AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
    UNION
    
    --Changed (actually dropped and recreated [but not renamed])
    SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
    FROM #tmp t
    WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
             WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                               WHERE oi.id = ti.id))
    AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
             WHERE NOT EXISTS (SELECT * FROM #tmp ti
                               WHERE oi.id = ti.id)
             AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
    UNION
    
    --Deleted
    SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
    FROM #tmp t
    WHERE NOT EXISTS (SELECT * FROM sysobjects o
                      WHERE o.id = t.id)
    AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
             WHERE NOT EXISTS (SELECT * FROM #tmp ti
                               WHERE oi.id = ti.id)
             AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
    UNION
    
    --Added
    SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
    FROM sysobjects o
    WHERE NOT EXISTS (SELECT * FROM #tmp t
                      WHERE o.id = t.id)
    AND      o.type  IN ('TR', 'P' ,'U' ,'V')
    AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
             WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                               WHERE oi.id = ti.id))
    ORDER BY Priority ASC
    
    Root ServerName DatabaseName Schema Objects Database Triggers* .ddltrigger.sql Functions ..function.sql Security Roles Application Roles .approle.sql Database Roles .role.sql Schemas* .schema.sql Users .user.sql Storage Full Text Catalogs* .fulltext.sql Stored Procedures ..proc.sql Synonyms* .synonym.sql Tables ..table.sql Constraints ...chkconst.sql ...defconst.sql Indexes ...index.sql Keys ...fkey.sql ...pkey.sql ...ukey.sql Triggers ...trigger.sql Types User-defined Data Types ..uddt.sql XML Schema Collections* ..xmlschema.sql Views ..view.sql Indexes ...index.sql Triggers ...trigger.sql