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

时间:2017-06-02 19:53:48

标签: sql-server visual-studio-2012 database-project

我目前正在维护一个超过17年的SQL Server数据库,并且其中包含大量未使用和过时的工件。

在过去几个月中,我们一直在分析数据库,以确定实际使用的1800多个存储过程中的哪一个,以及我们可以安全删除哪些存储过程。截至目前,我们有一份大约1300个清单,我们计划将其删除。

此数据库也在SQL Server数据库项目的源代码管理下签入。

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

我尝试过Import> Script并使用.sql命令导入DROP PROCEDURE文件,但是如果不从项目中删除该过程,则会引发以下错误:

  

在您为导入操作提供的脚本中,未完全理解一个或多个语句。这些语句被移动到ScriptsIgnoredOnImport.sql文件。查看文件内容以获取更多信息。

测试文件的内容如下:

Drop Procedure spProcedureName;

可以完成项目并逐个删除每个程序......但有超过1300个删除......

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

其他信息:

  • 从项目创建一个shell数据库并对其进行更新将证明与逐个手动删除1,300个存储过程一样多的努力。这是因为我们计划删除的许多存储过程包含对表,视图,函数,OPENROWSET连接和其他过程的过时/无效引用。因此,部署脚本失败,如果不修改脚本中的各个无效对象,则无法创建shell数据库。
  • 获取当前数据库的备份/恢复也不是一个可行的解决方案,因为当前数据库的大小略大于3 TB。

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

2 个答案:

答案 0 :(得分:1)

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

    替代方式:

    1. 将项目部署到新数据库(DB_Temp)
    2. 通过TSQL删除旧存储过程
    3. 在VS中,运行工具 - > SQL Server - >架构比较(来源:DB_Temp,目标:您的项目)
    4. 按"更新"从项目中删除旧的SP
    5. 将项目部署到DEV和测试环境,并进行测试。
    6. 删除DB_Temp

答案 1 :(得分:0)

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

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

有许多VS扩展可以运行EnvDTE命令,例如:https://vlasovstudio.com/visual-commander/index.html

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

步骤1。将SP列表分配给变量:

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

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

如果您的SP项目路径类似于" Database2 \ dbo \ Stored Procedures \",那么它就像:

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