我们通过TFS,TFS数据库项目和vsdbcmd实现了自动构建过程。将数据库项目部署到数据库服务器时,生成的SQL脚本会尝试“更改”某些存储过程,即使这些存储过程在目标数据库中尚未存在。相反,SQL脚本应包含那些存储过程的“CREATE”语句。这显然会导致数据库部署失败,因为无法“更改”不存在的存储过程。
有没有人对可能导致这种情况的原因或如何解决这个问题有任何想法?
答案 0 :(得分:2)
您使用VSDBCMD部署到目标数据库吗? VSDBCMD应该将.dbschema文件和连接字符串作为输入,并生成适当的SQL文件。如果在指向其他数据库的同时生成SQL文件,则它将无法在处于不同状态的数据库服务器上运行。
答案 1 :(得分:1)
我们在TFS Build中使用了类似的过程,我很确定这会成功处理新插入的元素(表格,列,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;
然后我们生成数据库最新状态的.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之前状态的生产SQL,以便将其形成最新状态。
您所暗示的可以追溯到你没有正确地形成VSDBCMD参数,或者是工具的直接错误。在你的位置,我会手动试验这个工具,以确保两者中的哪一个适用。
据我所知,上面介绍的程序运行正常,所以我倾向于认为你的实现有问题。
答案 2 :(得分:0)
发现错误: 在TFS中,表定义没有模式前缀。而不是(例如)
CREATE TABLE [dbo][TableName]
是
CREATE TABLE [TableName]
缺少指定的模式意味着当QA运行vsdbcmd时,分配给表的模式是运行vsdbcmd的个人的默认模式。所以实际创建的是有效,就好像我们已经指定:
CREATE TABLE [QAUser_SCHEMA].[TableName]
这导致了vsdbcmd,当稍后由另一个人运行时,其默认模式为[dbo]以接收我们看到的错误,基本上生成一个ALTER语句,因为已经创建了存储过程,尽管在不同的模式下。
有人会认为,即使最初指定的模式不正确,一旦为该过程指定了[dbo]模式,它将被视为“不同”的过程,但事实并非如此。删除原始版本的程序(带有[QAUser_SCHEMA]的程序),然后重新运行vsdbcmd解决了这个问题。
TLDR; 始终使用模式名称为数据库项目中的数据库对象添加前缀。