首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止SqlPackage.exe在部署dacpac时删除和重新创建约束?

如何防止SqlPackage.exe在部署dacpac时删除和重新创建约束?
EN

Stack Overflow用户
提问于 2015-12-16 21:14:57
回答 4查看 3.5K关注 0票数 5

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

代码语言:javascript
复制
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)
)

当我用"Script“命令瞄准一个预先存在的SQL数据库时

代码语言:javascript
复制
sqlpackage.exe /Action:Script /SourceFile:DatabaseProject1.dacpac  /Profile:publish.xml /OutputPath:deployscript_test.sql /TargetPassword:redacted

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

代码语言:javascript
复制
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

(我主要关注的是试图阻止这种多余的再创造,因为我偶尔会看到“锁定请求超时超过了”。在实际部署/发布期间试图删除约束时出错)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-16 21:14:57

问题显然在于DATETIMEFROMPARTS的使用。

如果我将表声明为

代码语言:javascript
复制
CREATE TABLE [dbo].[Hoerses]
(
   [HoersId] INT NOT NULL PRIMARY KEY,
   [DatePurchased] datetime NOT NULL CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT '1985-01-01'
) 

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

票数 3
EN

Stack Overflow用户

发布于 2017-03-07 10:55:23

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

票数 2
EN

Stack Overflow用户

发布于 2020-06-13 13:56:11

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

基本上,这些都是该条中提到的可能问题:

  1. 一些系统功能在Server中表示为小写,如getdate()sysutcdatetime()getutcdate()newid()
代码语言:javascript
复制
myDate datetime2 DF_myTable_myDate DEFAULT(getdate()) NOT NULL
  1. 默认约束中的标量数值需要用双括号((0))括起来,但我注意到字符串值不包括在内。
代码语言:javascript
复制
myBit bit DF_myTable_myBit DEFAULT((0)) NOT NULL
  1. 筛选的索引和检查约束条件必须用圆括号()括起来,列名必须放在方括号中,比较运算符不能在左和右之间有空格。
代码语言:javascript
复制
-- Column check
CONSTRAINT CH_myTable_someCheck CHECK ([myColumn]>(0))
-- Function check
CONSTRAINT CH_myTable_anotherCheck CHECK ([dbo].[someFunc]([myColumn],[myAnotherColumn])=(1))
  1. 某些列必须用方括号[]括起来。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34322210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档