2

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

所以,现在,我们正在考虑一种方法来找出哪些对象被使用APP1,以便删除APP0.

APP1在不必打开每个类和表单的情况下发现所有对象的最佳方法是什么?

一旦我们有了这些对象的完整列表,就可以很容易地使用我们购买的程序来检测直接从 SQL 指定的所有 SQL 对象的所有依赖关系,并删除不从任何依赖关系返回的对象。有什么想法可以让我得到这个列表,而不必经历我们所有有很多很多类和表单的程序?

谢谢,

注意:我知道,在一个完美的世界里,所有对 PS 和表的调用都应该在 DAL 中,但对于我们目前正在处理的应用程序......这不是我们的情况!嘻嘻!(讽刺的嬉皮士);)

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

4

3 回答 3

1

您提到您拥有来自 APP0 的所有表格、Sprocs 等。大概有其中的一个 BAK,或者您可以通过在新 PC 上安装 APP0 来获取原始 SQL 对象。

然后使用RedGate 的SQL Compare将 APP1 使用的数据库与原始 APP0 数据库进行比较,然后您可以看到您添加了哪些对象,并可以剥离所有多余的 APP0 db 对象。

于 2012-05-11T02:45:44.317 回答
0

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

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

于 2012-05-10T18:51:19.797 回答
0

我没有一个简单的答案,但这就是我如何攻击它。我事先承认这需要相当长的时间,所以我很乐意让给有更好答案的人。

这是一个两步的问题。

第 1 步:查找 SQL 中的所有依赖项。即查找所有用于制作视图的表,并查找所有用于存储过程和函数的表和视图。MS SQL 服务器具有为您执行此操作的功能。对于其他数据库,您可以针对 information_schema(或任何它们的专有等价物)编写一些查询。

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

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

如果您确实即时生成 SQL,我认为复杂程度会大大增加。然后,您必须按照自己的方式编写生成 SQL 的代码并挑选表名。如果在某些地方将表名从函数传递到函数,这可能会变得非常困难。(我可以想象真正的噩梦场景,比如你要求用户输入一个表名,或者你从片段中构建一个表名。比如,“dim tablename = if(dept="B17","accounting", "manufacturing") & “_“ & 年”。)

于 2012-05-10T21:31:25.510 回答