Sql server SQL Server数据库的版本控制
我想让我的数据库处于版本控制之下。有人有什么建议或推荐文章让我开始吗 我总是希望在那里至少有一些数据(如前所述:用户类型和管理员)。我还经常需要收集大量生成的测试数据以进行性能测量。这是围绕开发的“难题”之一。据我所知,没有完美的解决方案 如果只需要存储数据库结构而不需要存储数据,则可以将数据库导出为SQL查询。(在Enterprise Manager中:右键单击数据库->生成SQL脚本。我建议在“选项”选项卡上设置“为每个对象创建一个文件”),然后您可以将这些文本文件提交给svn,并使用svn的diff和logging功能 我将它与一个批处理脚本绑定在一起,该脚本接受两个参数并设置数据库。我还添加了一些输入默认数据的附加查询,如用户类型和管理员用户。(如果你想知道更多关于这个的信息,发布一些东西,我可以把脚本放在可以访问的地方)Sql server SQL Server数据库的版本控制,sql-server,database,svn,version-control,Sql Server,Database,Svn,Version Control,我想让我的数据库处于版本控制之下。有人有什么建议或推荐文章让我开始吗 我总是希望在那里至少有一些数据(如前所述:用户类型和管理员)。我还经常需要收集大量生成的测试数据以进行性能测量。这是围绕开发的“难题”之一。据我所知,没有完美的解决方案 如果只需要存储数据库结构而不需要存储数据,则可以将数据库导出为SQL查询。(在Enterprise Manager中:右键单击数据库->生成SQL脚本。我建议在“选项”选项卡上设置“为每个对象创建一个文件”),然后您可以将这些文本文件提交给svn,并使用svn
如果还需要保留所有数据,我建议保留数据库的备份,并使用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