- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 TeamCity 为我们的测试环境创建 .NET 应用程序的 CI 和自动部署(通过 SVN 进行源代码控制),一切进展顺利。我正处于想要自动执行数据库脚本的阶段。我做了一些搜索并阅读了几篇文章,例如 http://www.troyhunt.com/2011/02/automated-database-releases-with.html (troyhunt 的博客非常宝贵!),许多人似乎都指出使用 RedGate 软件来管理和部署更改。我有点担心让新工具处理脚本生成,所以我想知道是否还有其他可接受的方法值得研究。
我们当前的解决方案设计标准包括一个包含数据库相关文件(例如我们的 orm 数据库)的项目。它还包含一系列文件夹,其中包含我们的更改脚本,如下所示。
MySolution
> MySolution.Data
> 3.0 Scripts
* 01 - UpdateUserTable.sql
* 02 - UpdateRoleTable.sql
> 3.1 Scripts
* 01 - CreateJobTable.sql
* 02 - InsertJobTypes.sql
* 03 - AndSoOn.sql
我相信这种结构很重要,因为虽然我们希望在 checkin 时自动部署到我们的测试环境,但我们部署实际版本的频率要低得多,而且我不确定 RedGate 的比较工具是否可以处理有时发生的更改级别。这就是为什么我更喜欢使用脚本的版本文件夹,然后在发布时增加次要版本以保持脚本版本整齐地包含。
有了这个预先存在的结构,我倾向于保留它并添加一个 TeamCity 构建定义,该定义可以在成功部署时应用数据库脚本。我想象我可以让 TeamCity 在预期路径内识别新添加到 SVN 的 .sql 文件,然后在服务器上执行这些文件,但也许我对开箱即用的期望太多。我过去曾使用 TFS 和 MSBUILD 以及自定义构建步骤实现过此类解决方案,但对 TeamCity 方式完全陌生。
是否已经有实现类似目标的流程?在我看来,这是一个相当正常的实现,我只是还无法找出如何实现。或者 RedGate 解决方案是我们应该追求的标准吗?
最佳答案
我两年前读过 Troy Hunt 的同一篇文章。这是一个启示,我很快就开始使用 SQL Source Control + SQL Compare + TC 来运行。这是一个很好的解决方案,但是有一些事情没有像我想要的那样工作。其中最主要的是 SQL 源代码控制不能(或不能)很好地配合分支/合并策略。此外,SQL 源代码控制是一个带外流程,需要开发人员接受培训、采用并了解其怪癖。它从未 Root 。我们的团队最终放弃了 RedGate,转而支持 TeamCity 驱动的 Entity Framework 迁移,并且我们没有回头。
对于您直接提出的问题:我认为您在这里尝试做的事情是可能的,尽管我认为寻找新添加的 SQL 脚本不一定是 TeamCity 的工作。 Red Gate 和 Entity Framework 都识别数据库本身中最近部署的脚本/迁移,并在确定应该开始应用更改的位置时引用该脚本/迁移。您可以在数据库中存储类似的值(“3.0”),或作为 TC 构建参数,然后使用 powershell 迭代较新的文件夹并使用 sqlcmd 应用最新的脚本。
不过,您可能会考虑考虑基于 EF 的迁移,特别是如果您采用了代码优先模型。如果您有兴趣,我可以更新此答案以更多地讨论我们如何做到这一点。
更新:
EF 代码优先迁移通过捕获迁移类中一组离散的数据库架构更改来工作。这个类有一个Up
和一个 Down
可以应用/反转特定批处理的架构更改的方法。这或多或少相当于 Ruby 和其他人的做法。
当您对实体模型进行更改(添加表、删除列、更改约束等)时,您可以通过调用 Add-Migration <DescriptionOfSchemaChange>
创建新的迁移类。在包管理器控制台中。这将生成名为 <timestamp>_<DescriptionOfSchemaChange>.cs
的新类。然后,您可以通过调用 Update-Database
在本地应用该迁移。 。 Entity Framework 为您管理具体细节,但您可以根据需要将任意 SQL 注入(inject)到迁移步骤中。 PluralSight 提供 great course涵盖这些概念。
迁移由可执行文件 migrate.exe
管理,它作为 Entity Framework NuGet 包的一部分进行部署。在 TeamCity 中,您可以使用 migrate.exe
针对指定数据库运行迁移。首先,您必须复制migrate.exe
位于保存迁移类的程序集的本地。然后你只需运行 migrate.exe
使用数据库连接字符串作为参数针对该程序集。工作目录是迁移程序集的工作目录。
copy ..\..\packages\EntityFramework.5.0.0\tools\migrate.exe .
migrate.exe ASSEMBLY.dll /connectionString="CONNECTION_STRING" /connectionProviderName="System.Data.SqlClient"
关于.net - AutoDeploy SQL 随 TeamCity 进行更改(Redgate 的替代方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18589906/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!