我们通过TFS、TFS数据库项目和vsdbcmd实现了自动构建过程。在将数据库项目部署到数据库服务器时,生成的SQL脚本会尝试“更改”某些存储过程,即使这些存储过程在目标数据库中还不存在。取而代之的是,SQL脚本应该包含这些存储过程的“CREATE”语句。这显然会导致数据库部署失败,因为无法“更改”不存在的存储过程。
有没有人知道可能是什么原因造成的,或者如何修复它?
发布于 2012-07-18 05:03:25
找出问题所在:在TFS中,表定义没有模式前缀。所以不是(例如)
CREATE TABLE [dbo][TableName]确实是
CREATE TABLE [TableName]缺少指定的模式意味着当QA运行vsdbcmd时,分配给表的模式是运行vsdbcmd的个人的默认模式。因此,实际创建的内容实际上就像我们指定的那样:
CREATE TABLE [QAUser_SCHEMA].[TableName]这导致vsdbcmd在稍后由默认模式为dbo的另一个人运行时收到我们看到的错误,基本上生成了一条ALTER语句,因为存储过程已经创建,尽管使用的是不同的模式。
人们可能会认为,即使最初指定了不正确的模式,一旦为过程指定了dbo模式,它就会被认为是一个“不同”的过程,但事实并非如此。删除该过程的原始版本(包含QAUser_SCHEMA的版本),然后重新运行vsdbcmd解决了这个问题。
始终为数据库项目中的数据库对象添加架构名称前缀。
发布于 2012-07-16 23:36:24
您是否正在使用VSDBCMD部署到目标数据库?VSDBCMD应该接受一个.dbschema文件和一个连接字符串作为输入,并生成一个适当的SQL文件。如果您在指向不同的DB时生成SQL文件,那么它将不能在处于不同状态的DB服务器上工作。
发布于 2012-07-17 15:56:41
我们在我们的TFS构建中使用了类似的过程,我非常确定这可以成功地处理新插入的元素(表、列、SP、索引等)。
首先,我们通过调用VSDBCMD生成旧数据库的.dbschema:
/a:import /dsp:sql /model:C:\PATH\old.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=OLDDB;User=username;Password=password;然后我们生成DB的最新状态的.dbschema,它在前面的步骤中已经被部署(通过MSBuild):
/a:import /dsp:sql /model:C:\PATH\new.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=NEWDB;User=username;Password=password;最后,我们第三次调用VSDBCMD,这样它就会生成ALTER:
/a:deploy /dsp:sql /model:C:\PATH\new.dbschema /targetmodelfile:C:\PATH\old.dbschema /DeploymentScriptFile:C:\PATH\DB_Alter.sql /p:Targetdatabase="DB" 这个生成的DB_Alter.sql可以应用于运行DB的前一个状态的production-SQL,以便将其调整为最新的状态。
您所暗示的要么可以追溯到您没有正确形成VSDBCMD参数,要么可以直接追溯到该工具的bug。在您的位置上,我将手动试验该工具,以确保两种方法中的哪一种适用。
据我所知,上面介绍的过程运行正常,所以我倾向于认为您的实现有问题。
https://stackoverflow.com/questions/11507267
复制相似问题