Visual Studio 2015 年发布时如何避免从数据库中删除图表

How to avoid deleting diagrams from database when publishing in Visual Studio 2015

我在 VS 2015 中有一个 SQL Server 2014 数据库项目。我还在 SSMS 中创建了几个模式图(因为 VS 没有我知道的任何模式图的)。它处于项目生命周期的早期,并且发生了大量重构。 SSMS 图善于在面对变化时自我更新——这真的很棒。我想在开发环境中保留(重新)发布的图表。

问题是,为了跟上重构的步伐,我需要删除目标数据库中不再存在于项目中的内容(或者只是在开发环境中重新创建目标数据库)...但是这将导致我的图表被吹走。我还没有想出一个干净的方法来避免这种情况,重建图表是一种刺激。有没有人想出一个相当干净的方法来增量发布,同时删除项目 cruft 但保留图表?

在重新创建开发数据库之前,将图表暂存到另一个数据库中的全局临时文件 table 或 table。您可以通过 运行 这样做:

IF (OBJECT_ID(N'tempdb..##TempTable') IS NOT NULL) DROP TABLE ##TempTable ;

SELECT  * 
INTO ##TempTable
FROM    sysdiagrams

不幸的是,如果您删除并重新创建开发数据库,​​您将无法通过预部署脚本成功 运行。预部署脚本 运行s 后下降。因此,我会考虑创建一个发布 dacpac 的 powershell 脚本,并在 dacpac 部署步骤之前执行上述语句来暂存图表。

部署 dacpac 后,运行 像这样重新创建图表:

INSERT INTO dbo.sysdiagrams (name, principal_id, version, definition)
SELECT name, principal_id, version, definition
FROM ##TempTable AS tt

我在 visual studio 数据库开发方面没有太多经验,所以这更像是一个想法,而不是实际答案。

如果您创建了 dbo.sysdiagrams 的物化(索引)视图并将其包含在 VS 项目中,是否可以防止 dbo.sysdiagrams 在部署时被炸毁?

create view test with schemabinding as select name, principal_id,diagram_id,version, definition from dbo.sysdiagrams 

CREATE UNIQUE CLUSTERED INDEX CIX_test_diag 
    ON dbo.test(name, principal_id,diagram_id,version)

任何仍想处理图表的人都应该查看此博客 Scripting an SSMS Diagram。基本上它提供了将任何图表转换为 SSMS 脚本的代码。编写脚本后,您可以做任何您想做的事情,包括将其恢复到另一个系统。

请记住,图表仅引用数据库中的对象。他们不存储任何对象数据,除了他们的名字。因此只有具有相同类型和名称的对象才会出现在图中,其他对象将给出 'will be removed from the diagram' 警告。

它是一个 WordPress link,因此它不应更改,但如果由于某种原因更改了,您可以 Google Rick Bielawski Script Diagram 找到它,无论它在哪里。