Sql 从VB.net应用程序中查找用于删除未使用表的表

Sql 从VB.net应用程序中查找用于删除未使用表的表,sql,database,vb.net,winforms,Sql,Database,Vb.net,Winforms,我们目前正在开发一个应用程序,我们称之为APP1,它使用一个SQL数据库,该数据库有大约800个存储过程、600个表等。APP1最初是为了替换另一个应用程序APP0,我们没有源代码,只有SQL表、存储过程、视图,等。APP1以前的编程人员使用了来自同一数据库的一些DB对象,并添加了一些特定于APP1的其他对象,因为它比APP0大。我们不再需要APP0,因为APP1做了我们想要的一切,还有更多 因此,现在,我们正在考虑一种方法,找出APP1使用的对象,以便删除APP0仅使用的对象 不必打开每个类和

我们目前正在开发一个应用程序,我们称之为
APP1
,它使用一个SQL数据库,该数据库有大约800个存储过程、600个表等。
APP1
最初是为了替换另一个应用程序
APP0
,我们没有源代码,只有SQL表、存储过程、视图,等。
APP1
以前的编程人员使用了来自同一数据库的一些DB对象,并添加了一些特定于
APP1
的其他对象,因为它比
APP0
大。我们不再需要
APP0
,因为
APP1
做了我们想要的一切,还有更多

因此,现在,我们正在考虑一种方法,找出
APP1
使用的对象,以便删除
APP0
仅使用的对象

不必打开每个类和表单,发现APP1使用的所有对象的最佳方法是什么

一旦我们有了这些对象的完整列表,就可以很容易地使用我们购买的程序,该程序可以检测直接从SQL指定的所有SQL对象的所有依赖项,并删除不从任何依赖项返回的对象。你知道我怎样才能在不必经过我们所有课程的情况下得到这个列表吗?我们有很多很多课程和表格

谢谢

注意:我知道,在一个完美的世界中,所有对PSs和表的调用都应该在DAL中,但是对于我们目前正在开发的应用程序来说。。。这不是我们的情况!哎呀!(讽刺的耶皮);)


注2:此应用程序未使用任何ORM。因此,所有查询都直接使用SqlCommand。因此,对任何DB对象的任何调用都是字符串格式的。

当应用程序正在使用时,您可以在数据库上运行跟踪。这可能会创建大量的数据,但从中可以将其简化为应用程序执行的过程和/或SQL语句


你能保证你会或者可以使用所有的功能吗?您可能还想运行NCover之类的程序来检查您在使用它时使用了多少应用程序代码。

我没有一个简单的答案,但下面是我攻击它的方法。我承认这会花费相当长的时间,所以我会很乐意向有更好答案的人让步

这是一个两步问题

步骤1:查找SQL中的所有依赖项。也就是说,查找用于生成视图的所有表,并查找存储过程和函数中使用的所有表和视图。MS SQL server具有为您执行此操作的功能。对于其他数据库,您可以针对信息模式(或其专有等价物)编写一些查询

步骤2:获取代码中执行的所有SQL语句和存储过程的列表。如果不动态构建SQL语句,这应该相对简单。只需搜索所有SQLCommand对象并找到您设置查询的目的。您可以编写一个小程序来扫描源代码并将其转储

然后解析这个转储,并列出引用的存储过程、表和视图。按字母顺序排序并消除重复项。然后添加从存储过程引用的任何表或视图以及从视图引用的任何表。再次排序并消除重复项。那你就有你的名单了


如果您在运行中生成SQL,我认为复杂性会大大增加。然后,您必须通过生成SQL的代码找到表名。如果在某些地方表名从一个函数传递到另一个函数,这可能会变得非常困难。(我可以想象真实的噩梦场景,比如你要求用户输入一个表名,或者你从片段中构建一个表名。比如,“dim tablename=if(dept=“B17”,“accounting”,“manufacturing”)&“年”。

你提到过你拥有APP0中的所有表、存储过程等。大概有很多这样的对象,或者你可以通过在一台新电脑上安装APP0来获取原始SQL对象


然后使用将APP1使用的数据库与原始APP0数据库进行比较,然后可以查看已添加的对象,并可以删除所有冗余的APP0DB对象。

是否使用SQL Server?如果是这样,您应该了解依赖关系系统表。我很确定以自动化的方式这样做是一个NP完全问题。然而,对于代码如何与数据库交互,您是否可以做出任何假设?它是通过预先准备好的语句、字符串构建的查询、什么来实现的吗?有趣的问题是,您可以查看表的统计信息,并查看它们上次更新的时间。如果你有一个好的测试套件,你可以像下面建议的那样运行一个跟踪。@Nathaniel Ford:这是唯一一个通过字符串构建直接运行SQLCommand的命令。其他一些对象在SQL中是独占使用的(来自触发器等)。我们的APP1中只剩下几张表需要查找。存储过程很容易找到,因为它们都是以“SP_%”开头的。我在另一个案例中考虑过这一点,但我不知道你怎么能从中得到任何信任。您很可能拥有每年只运行一次的功能,例如,在会计系统中,您可以进行年终结账。可能有一些逻辑分支在任何给定的运行集合中都不会被执行,但它们是必需的,因为它们可能有一天会发生。我认为通过源代码进行搜索比跟踪方法更好。sql server依赖关系非常有用,但不是确定的。例如,某些依赖项可能不包含在使用动态sql的存储过程中。但是,我很惊讶在整个解决方案中搜索
SqlCommand
将导致大量的结果。。。我明天会试试看,然后带着结果的数量回来,就为了这个