如何使用sqlpackage.exe生成重命名表的脚本?

Posted

技术标签:

【中文标题】如何使用sqlpackage.exe生成重命名表的脚本?【英文标题】:How to generate the script of rename table using sqlpackage.exe? 【发布时间】:2019-11-02 02:36:21 【问题描述】:

我有两个数据库 some-db-dev 和 some-db-qa。两个数据库彼此相同。

我已经为这两个数据库创建了一个 DACPAC 文件。 some-db-dev.dacpac 和 some-db-qa.dacpac 分别。(它的表为“A”,列为“Test”。它也有一些虚拟记录。)

在此之后,我执行了以下步骤:

    将来自 some-db-dev 数据库的表“A”重命名为“ANamed”。

    生成“some-db-dev”的DACPAC并以“some-db-dev”的名称存储

    我在命令下着火了:-

    sqlpackage /a:Script /sf:"C:\Users\some.user\Desktop\some-db-dev.dacpac" /tf:"C:\Users\some.user\Desktop\some-db-qa.dacpac" /tdn:"some-db-qa" /op:"C:\Users\some.user\Desktop\diffscript.sql"

    观察:-

而不是重命名在步骤1中修改的表。它生成了创建表的脚本,如下所示。

`GO
PRINT N'Creating [dbo].[ARenamed]...';


GO
CREATE TABLE [dbo].[ARenamed] (
    [Id]   NCHAR (10) NULL,
    [Name] NCHAR (10) NULL,
    [Test] NCHAR (10) NULL
);`

我使用的命令有问题吗??

任何帮助都将不胜感激。

【问题讨论】:

您是否使用 SQL Server 数据库项目重命名重构来执行重命名?如果没有,dacpac 将不知道意图是重命名而不是删除/创建。 @DanGuzman 不,我没有从 SSDT 项目执行重命名操作。我从 sql server 手动重命名了表,然后报告了 DACPAC。表确实在 SQL Server 数据库中重命名。 由于您没有使用重构操作进行更改,SSDT 无法区分重命名和删除/创建。它只能比较源模式和目标模式,不知道你的意图。 【参考方案1】:

要重命名 SSDT 中的表,您需要使用重构工具“右键单击表并执行重构重命名”。发生的情况是这会在“RefactorLog.xml”中添加一个条目 - 如果您有其中一个条目,那么在创建部署时会生成一个 sp_rename,其他的您将在这里看到您看到的内容,然后创建。

见:https://the.agilesql.club/2016/09/refactoring-in-sql-server-data-tools-ssdt/

最后一节“重命名对象”展示了如何做到这一点。

埃德

【讨论】:

【参考方案2】:

我认为您需要改用MSBuild。这是一个如何生成脚本项目与数据库的示例。

MsBuild.exe "PATH_TO_SQL_PROJ_FILE" ^
  /p:SqlPublishProfilePath="PATH_TO_PUBLISH_PROFILE" ^
  /p:UpdateDatabase=False ^
  /t:Build,Publish

【讨论】:

以上是关于如何使用sqlpackage.exe生成重命名表的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CLI 工具 (sqlpackage.exe / PS dbatools) 时通过 BACPAC / DACPAC 导入数据库在用户上失败

sqlpackage.exe 忽略 DevOps 发布管道中的特定架构

Azure Devops 无法从计算机上的注册表中找到 Dac Framework (SqlPackage.exe) 的位置

升级数据库时是不是有导致 SqlPackage.exe 执行数据移动(表重新创建)的完整列表?

SqlPackage.exe 发布可以删除目标数据库上不存在的对象的 .dacpac 文件的正确参数是啥?

如何在 Access 2016 中重命名本地表(而不是本地表的快捷方式)?