4

我有一个 Visual Studio sql 项目,其表定义如下:

CREATE TABLE [dbo].[Hoerses]
(
   [HoersId] INT NOT NULL PRIMARY KEY,
   [DatePurchased] datetime NOT NULL CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT DATETIMEFROMPARTS(1985,01,01,0,0,0,0)
)

当我使用“脚本”命令定位预先存在的 SQL 数据库时

sqlpackage.exe /Action:Script /SourceFile:DatabaseProject1.dacpac  /Profile:publish.xml /OutputPath:deployscript_test.sql /TargetPassword:redacted

然后我得到以下生成的 SQL,即使约束在之前和之后具有相同的名称和定义:

PRINT N'Dropping [dbo].[DF_Hoerses_DatePurchased]...';


GO
ALTER TABLE [dbo].[Hoerses] DROP CONSTRAINT [DF_Hoerses_DatePurchased];


GO
PRINT N'Creating [dbo].[DF_Hoerses_DatePurchased]...';


GO
ALTER TABLE [dbo].[Hoerses]
    ADD CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT DATETIMEFROMPARTS(1985,01,01,0,0,0,0) FOR [DatePurchased];


GO
PRINT N'Update complete.';


GO

(我试图防止这种多余的重新创建的主要担心是因为我偶尔会看到“超过锁定请求超时期限。”在实际部署/发布期间尝试删除约束时出现错误)

4

3 回答 3

3

问题显然出在使用DATETIMEFROMPARTS.

如果我改为将表声明为

CREATE TABLE [dbo].[Hoerses]
(
   [HoersId] INT NOT NULL PRIMARY KEY,
   [DatePurchased] datetime NOT NULL CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT '1985-01-01'
) 

然后 SqlPackage.exe 不再尝试删除并重新添加约束。

于 2015-12-16T21:14:57.940 回答
2

Dacpac 部署通过将数据库模式的 XML 构造与 VS 项目中的 XML 构造进行比较来工作。有时,此过程会被语法细节混淆,从而导致重复更改,例如您所描述的。我的建议是您转到已部署的数据库,编写出有问题的对象的脚本并将其粘贴回您的 Visual Studio 文件中该对象的实现。这解决了明显的差异,因此部署不再被愚弄,相信它有一个改变要实施。

于 2017-03-07T10:55:23.570 回答
1

我还找到了一篇对我有帮助的文章。 http://johnnydba.blogspot.com/2015/07/are-your-vs-database-projects-dropping.html

基本上这些是文章中提到的可能问题:

  1. 一些系统函数在 SQL Server 中以小写形式表示,例如getdate()sysutcdatetime()getutcdate()newid().
myDate datetime2 DF_myTable_myDate DEFAULT(getdate()) NOT NULL
  1. 默认约束中的标量数值需要用双括号括起来((0)),但我注意到字符串值不需要。
myBit bit DF_myTable_myBit DEFAULT((0)) NOT NULL
  1. 过滤后的索引和检查约束条件必须用括号括起来(),列名必须用方括号括起来,比较运算符左右不能有空格。
-- Column check
CONSTRAINT CH_myTable_someCheck CHECK ([myColumn]>(0))
-- Function check
CONSTRAINT CH_myTable_anotherCheck CHECK ([dbo].[someFunc]([myColumn],[myAnotherColumn])=(1))
  1. 某些列必须用方括号括起来[]
于 2020-06-13T13:56:11.367 回答