从数据库项目中批量删除数据库对象

Bulk Remove Database Objects From Database Project

我目前正在维护一个超过 17 年的 SQL 服务器数据库,其中有大量未使用和过时的工件。

在过去的几个月里,我们一直在对数据库进行分析,以确定 1800 多个存储过程中的哪些正在实际使用,哪些我们可以安全地删除。截至目前,我们有大约 1300 个计划删除的列表。

此数据库也在我们的源代码管理下签入 SQL 服务器数据库项目。

现在,我想做的是生成一个脚本来删除 1300 个过程,并先将该脚本应用于数据库项目,然后再将该脚本应用于我们的开发环境。但我似乎无法找到一种通过脚本更新项目的方法。

我已经尝试执行 Import > Script 并使用 DROP PROCEDURE 命令导入 .sql 文件,但在未删除过程的同时抛出了以下错误来自项目:

In the script that you provided to the import operation, one or more statements were not fully understood. These statements were moved to the ScriptsIgnoredOnImport.sql file. Review the file contents for additional information.

测试的文件内容如下:

Drop Procedure spProcedureName;

可以检查项目并逐一删除每个过程...但是有 1300 多个要删除...

有没有办法对数据库项目进行批量更新(通过脚本或其他方式)以删除多个数据库对象?


附加信息:

由于以上限制,我只是在寻找一种可以直接应用于数据库项目的解决方案,而不依赖于辅助物理数据库。

  1. 将您的项目部署到新数据库 (DB_Temp)
  2. 通过 TSQL
  3. 删除旧的存储过程
  4. 创建一个新的数据库项目并从 DB_Temp 中导入数据库模式。
  5. Update/check 项目设置,包括发布设置以删除不在项目中的 SP。
  6. 将项目部署到开发和测试环境,并进行测试。
  7. 放弃旧项目
  8. 放弃 DB_Temp

更新:

备选方式:

  1. 将您的项目部署到新数据库 (DB_Temp)
  2. 通过 TSQL
  3. 删除旧的存储过程
  4. 在 VS 中,运行 工具-->SQL 服务器--> 模式比较(来源:DB_Temp,目标:你的项目)
  5. 按 "Update" 从项目中删除旧的 SP
  6. 将项目部署到开发和测试环境,并进行测试。
  7. 放弃 DB_Temp

要以编程方式从项目中删除对象,您可以使用 EnvDTE.ProjectItem class、Remove() 方法。

https://msdn.microsoft.com/en-us/library/envdte.projectitem.remove.aspx

有很多 VS 扩展可以 运行 EnvDTE 命令,像这样:https://vlasovstudio.com/visual-commander/index.html

或者您可以使用包管理控制台(工具--> NuGet 包管理器--> 包管理控制台)

第一步。将 SP 列表分配给变量:

$IncludeList = "SP1.sql", "SP2.sql"

第二步。如果 SP 在列表中,则从项目中删除它。

如果您的 SP 项目路径类似于 "Database2\dbo\Stored Procedures\",则类似于:

$DTE.Solution.Projects | ForEach { 如果($.Name -eq "Database2"){$.ProjectItems | ForEach { 如果($.Name -eq "dbo"){$.ProjectItems | ForEach { 如果($.Name -eq "Stored Procedures"){$.ProjectItems | ForEach {if ($IncludeList -contains $.Name) {$.Remove()}}}}}}}