Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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_Version Control - Fatal编程技术网

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

Sql server 如何控制SQL Server数据库的版本?,sql-server,database,version-control,Sql Server,Database,Version Control,我有SQL Server数据库,并在其中进行更改。某些数据库表中的记录正在启动我的应用程序运行所需的记录。我想对数据库和这些记录(行)进行版本控制。有没有可能做到这一点,并将其捆绑到SVN版本控制我的源代码或有其他解决方案?我希望完成这项工作,以便能够返回到数据库的早期版本,并比较数据库修订之间的更改。如果这方面的工具是免费的、开源的或者不是很贵,那就太好了 我的环境是Visual C#Express、SQL Server 2008 Express和Tortoise SVN。您可以获得SQL S

我有SQL Server数据库,并在其中进行更改。某些数据库表中的记录正在启动我的应用程序运行所需的记录。我想对数据库和这些记录(行)进行版本控制。有没有可能做到这一点,并将其捆绑到SVN版本控制我的源代码或有其他解决方案?我希望完成这项工作,以便能够返回到数据库的早期版本,并比较数据库修订之间的更改。如果这方面的工具是免费的、开源的或者不是很贵,那就太好了


我的环境是Visual C#Express、SQL Server 2008 Express和Tortoise SVN。

您可以获得SQL Server Express的SQL Management Studio版本。我相信您将能够使用它生成数据库模式的脚本。我认为这将使您可以手动创建脚本来插入起始记录

然后,将所有脚本与按正确顺序运行各个脚本的主脚本一起放入源代码管理


您可以使用windiff(Visual Studio SDK免费)运行diff,或者价格便宜,而且是一个很棒的diff/merge/sync工具。

MS Visual Studio Team System for Database Developers具有为整个架构轻松生成创建脚本的功能。唯一的缺点是成本


您考虑过使用亚音速吗?

我们刚刚开始在一些项目中执行以下操作,对于填充“静态”表格来说,它似乎工作得很好

我们的脚本遵循一种模式,即构造一个临时表,然后用我们希望实际表类似的内容填充临时表。我们只在此处放置人类可读的值(即,我们不包括标识/GUID列)。脚本的其余部分获取临时表并执行适当的INSERT/UPDATE/DELETE语句,以使实际表与临时表相似。当我们必须更改这个“静态”数据时,我们需要更新的只是临时表的填充。这意味着不同版本之间的差异按预期工作,回滚脚本与从源代码管理获取以前的版本一样简单


插入/更新/删除只需写入一次。事实上,我们的脚本稍微复杂一些,在实际的DML语句之前运行了两组验证。一组验证临时表数据(即,我们不会因为试图使数据库与临时表相似而违反任何约束)。另一种方法验证临时表和目标数据库(即外键可用)。

您应该使用特定于数据库的版本控制

当 读取已提交的快照或 允许\u快照\u隔离数据库 选项处于打开状态,逻辑副本 为所有数据维护(版本) 在中执行的修改 数据库每次修改一行时 通过特定的交易 数据库引擎存储的实例 以前提交的版本 tempdb中的行的图像。每个 版本被标记为事务 事务的序列号 这就改变了。版本 修改的行使用链接链接 列表最新的行值始终为 存储在当前数据库中,并且 链接到存储的版本化行 在tempdb中


有一个免费的microsoft产品,名为,您可以使用它编写整个数据库(模式和数据)的脚本。它非常适合拍摄数据库当前状态的快照,并使您能够在任何时候从头开始重新创建数据库(架构)版本控制。我们使用自定义属性,这些属性在安装程序运行时添加到数据库中。这些脚本的内容是使用我们的构建脚本生成的

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

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
我使用它(批量加载实用程序,标准SQL Server安装的一部分,包括Express edition)

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

作为我的生成批处理的一部分(有关更多信息,请参阅),我会像这样迭代每个控制文件:

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
    )
  )
)

此脚本当前的一个限制是,文件名必须是表名,如果表名包含特定的特殊字符,则可能无法实现此限制。

静态数据支持正在添加到SQL Source Control 2.0中,目前在beta版中可用。有关如何尝试此操作的更多信息,请参见:


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

后期解答,希望对其他读者有用

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

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

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

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

完成后,只需单击“完成”按钮,就会显示“操作中心”窗口,提供将提交到存储库(thi)的对象