我在一个团队中工作,在 VS 环境中开发 .NET 代码以及在 PL/SQL 中开发 Oracle 数据库。现在我们想使用 Team Foundation Server 作为版本控制,借助 Oracle Developer Tool,这样我们就可以将数据库和代码存储在一个地方。我的问题是,是否有可能仅通过一个标签“签入”数据库和代码的更改?以便我们将来意识到这些更改与一个错误有关。
3 回答
如果您使用的是 SQL Server,则可以使用 Visual Studio 中内置的数据库项目功能(又名 SSDT / sqlproj)。
对于 Oracle,有 3rd 方工具可以做类似的事情。最受欢迎的可能是 RedGate 工具。
一个简单的事实是,您不能像对待 Java、C# 或其他文件一样对待数据库对象。
有很多原因,我将仅举几例:
文件本地存储在开发人员的 PC 上,他/她所做的更改不会影响其他开发人员。同样,开发人员也不会受到同事所做更改的影响。在数据库中(通常)情况并非如此,开发人员共享相同的数据库环境,因此提交给数据库的任何更改都会影响其他人。
发布代码更改是使用签入/提交更改等完成的(取决于您使用的源代码控制工具)。此时,来自开发人员本地目录的代码被插入到源代码控制存储库中。想要获取最新代码的开发人员需要从源代码管理工具中请求它。在数据库中,更改已经存在并影响其他数据,即使它没有签入到存储库中。
在文件签入期间,源代码控制工具会执行冲突检查,以查看在您修改本地副本期间,同一文件是否被其他开发人员修改和签入。再次在数据库中没有检查这个。如果您从本地 PC 更改程序,同时我使用本地 PC 的代码修改相同的程序,那么我们会覆盖彼此的更改。
代码的构建过程是通过将代码的标签/最新版本放到一个空目录中,然后执行构建-编译来完成的。输出是我们复制和替换现有的二进制文件。我们不在乎以前的情况。在数据库中,我们无法重新创建数据库,因为我们需要维护数据!部署还执行在构建过程中生成的 SQL 脚本。
在执行 SQL 脚本(使用 DDL、DCL、DML(用于静态内容)命令)时,您假定环境的当前结构与创建脚本时的结构相匹配。如果没有,那么您的脚本可能会在您尝试添加已经存在的新列时失败。
将 SQL 脚本视为代码并手动生成它们会导致语法错误、数据库依赖关系错误、不可重用的脚本,从而使开发、维护和测试这些脚本的任务变得复杂。此外,这些脚本可能运行在与您想运行的环境不同的环境中。
有时版本控制存储库中的脚本与被测试对象的结构不匹配,然后在生产中会发生错误!
还有很多,但我想你明白了。
我发现有效的方法如下:
使用强制版本控制系统对数据库对象强制执行签出/签入操作。这将确保版本控制存储库与签入的代码相匹配,因为它在签入操作中读取对象的元数据,而不是作为手动完成的单独步骤
使用影响分析,利用基线作为比较的一部分来识别冲突并确定更改(在比较源控制存储库和数据库之间的对象结构时)是源自开发的真正更改还是源自不同的路径,然后应该跳过它,例如不同的分支或紧急修复。
我写的一篇文章在这里发表,欢迎阅读。
TFS 将允许您签入任何文件,如果它是一个 Sql Server 数据库,那么您可以将您的 c# 代码放在一个项目中,并将您的 sql 代码放在同一解决方案中的另一个项目中,然后签入所有代码将非常简单一起。
因为 PL/SQL 没有项目类型,所以您应该将架构 / 代码导出到单独的文件中,您可以将这些文件添加到不同类型的项目中,或者根本不包含它们,而只是将它们放在文件夹下的文件系统中解决方案内。
在 TFS (VS 2013) 中,挂起的更改允许您查看解决方案中的更改,即项目中包含的文件或解决方案下文件系统中发生的所有更改,以便您可以查看所有更改,然后将它们签入一次办理登机手续。
我经常在 Visual Studio 解决方案下创建额外的文件夹,其中包含无法使用 Visual Studio 打开的项目,并使用其他工具来管理它们,但使用 Visual Studio 将它们检入源代码控制,并且效果非常好。
对于 VS2013 - 要添加的一件事是,当您签入时,如果更改未显示在“包含的更改”中 - 在“排除的更改”下有一个按钮“检测到:XX 添加(s)” - 如果您进入您可以在解决方案之外促进更改,以便将它们包含在内。