【问题标题】:SSDT publish script recreates procedures with no changesSSDT 发布脚本无需更改即可重新创建过程
【发布时间】:2017-02-21 03:57:50
【问题描述】:

我有一个导入到.sqlproj 的数据库和一个.publish.xml 发布配置文件,该配置文件将更改发布到远程数据库。

我的理解是,当我右键->发布->生成脚本时,应该计算本地定义和远程数据库之间的差异,并生成一个脚本来使远程数据库对齐。

这一切似乎都可以正常工作,但是,它生成的脚本总是包含 ALTER FUNCTIONALTER PROCEDURE 语句,用于相同的 40 个左右的函数和过程(总共定义了大约 1000 个),是否他们有没有改变。当我将ALTER 语句与 Script Function as -> ALTER to script in SSMS 进行比较时,它们完全相同。

所以我的问题是:为什么 VS 认为这些是不同的,或者如果它们相同,为什么要重新创建它们?

注意事项:

  • 这些函数并不特殊 - 其中一些就像定义一个 varchar、将其设置为一个值并返回它一样简单。
  • 我尝试将ALTER 脚本运行到数据库中,但它们会继续生成。
  • 我检查了 SSMS 中的属性(右键单击 -> 属性),但看不到它总是重新创建的那些和不重新创建的那些明显不同的地方。
  • 我的发布配置文件是沼泽标准配置文件。

谢谢

【问题讨论】:

  • 你能在 SSDT 中使用“模式比较”来查看它“认为”的差异是什么吗?这样做通常很有帮助,然后将“目标”脚本粘贴到源文件中;这样您就可以确定您拥有脚本的“规范”形式。公平地说,与存储过程相比,我更经常看到约束和触发器。谷歌搜索“SSDT 规范形式”可能会有所帮助。

标签: visual-studio-2015 sql-server-data-tools sqlproj


【解决方案1】:

更新:

通过将 .dacpac 重命名为 .zip 并提取 model.xml,我可以看到某些程序的 <HeaderContents> 中有 
(LF - 换行符)。

这让我意识到,出于某种原因,我所有的 .SQL 文件都有 unix 行尾 (LF) 而不是 windows 行尾 (CR LF)。将所有文件转换为窗口行尾 (using notepad++) 解决了这个问题。

原文:

好的,看起来大部分是由于脚本中的字符串常量包含换行符。用手动定义的字符替换它们意味着它们不再被重新部署。 即

SET @doesnt_work = 
'FOO
BAR'

可以替换为

SET @works = 'FOO'  + CHAR(13) + CHAR(10) + 'BAR'

注意:这与其说是解决方案,不如说是一种解决方法,希望有人能提出更好的方法来做到这一点......

【讨论】:

  • 如果我创建的数据库只包含过程 ```` CREATE PROCEDURE [dbo].[spReturnsEmbeddedCR] AS DECLARE @mystring varchar(100);设置@mystring = '一些文字';选择@mystring;返回 0 ```` 它不会被重新部署。有问题的 procs 是否以某种方式生成?架构比较对看似无害的更改非常敏感。
  • 你说得对,还有更多的事情要做。我现在正在尝试使用 sqlpackage 来部署更改,它似乎会因我是从本地计算机还是 TFS 服务器部署而有所不同。两者都是 Windows 机器 - 知道为什么它们会以不同的方式处理新行吗?
【解决方案2】:

我遇到了这个问题并且能够通过以下方式解决它:

  1. 将我的全局 Git 配置更改为使用 Windows 行尾:
    git config --global core.autocrlf true

  2. 删除本地 repo 并重新克隆它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多