Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
部署dacpac时,如何防止SqlPackage.exe删除和重新创建约束?_Sql_Sql Server_Sqlpackage - Fatal编程技术网

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

部署dacpac时,如何防止SqlPackage.exe删除和重新创建约束?,sql,sql-server,sqlpackage,Sql,Sql Server,Sqlpackage,我有一个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) ) 当我使用“Script”命令将一个预先存在的SQ

我有一个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)
)
当我使用“Script”命令将一个预先存在的SQL数据库作为目标时

然后,即使约束在前后具有相同的名称和定义,我也会得到以下生成的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

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

问题显然是在使用
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不再尝试删除和重新添加约束。

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

我还找到了一篇帮助我的文章。

基本上,本文中提到了以下可能的问题:

  • 某些系统函数在SQL Server中表示为小写,如
    getdate()
    sysutcdatetime()
    getutcdate()
    ,以及
    newid()
  • myDate datetime2 DF_myTable_myDate默认值(getdate())不为空
    
  • 默认约束中的标量数值需要用双括号括起来
    ((0))
    ,但我注意到字符串值没有
  • 筛选的索引和检查约束条件必须用括号括起来,列名必须用方括号括起来,比较运算符的左右两侧不能有空格
  • 某些列必须用方括号括起来
    []

  • 非常感谢。我的索引需要所有的2,3和4!
    CREATE TABLE [dbo].[Hoerses]
    (
       [HoersId] INT NOT NULL PRIMARY KEY,
       [DatePurchased] datetime NOT NULL CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT '1985-01-01'
    ) 
    
    myBit bit DF_myTable_myBit DEFAULT((0)) NOT NULL
    
    -- Column check
    CONSTRAINT CH_myTable_someCheck CHECK ([myColumn]>(0))
    -- Function check
    CONSTRAINT CH_myTable_anotherCheck CHECK ([dbo].[someFunc]([myColumn],[myAnotherColumn])=(1))