我背负着一个没有任何外键的ERP数据库,因此缺乏参照完整性。
我正在编写一个脚本来检查数据库中的大多数主要表以查找ophaned记录。
例如,在这种情况下,我正在使用Sales表。
SLCDPM - Customer Master Table
SOMAST - Sales Order Master
SOITEM - Sales Order Items
SORELS - Sales Order Releases
基本上,对于这些(以及一大堆其他表),我需要检查SORELS中是否有记录显示在它上面的任何表中。然后拿SOITEM并检查它上面。等等。
我开始编写脚本,但行数变得有些荒谬。这是我从这4张桌子开始的地方。
select 'Sales Order Master',* from somast where fcustno not in (select fcustno from slcdpm where ftype <> 'P')
SELECT 'Sales Order Item',* FROM soitem WHERE fsono NOT IN (SELECT fsono FROM somast)
select 'Sales Order Release',* from sorels where (fsono+finumber) not in (select (fsono+finumber) from SOITEM)
我停下来的原因是我刚刚意识到SORELS(底层表)只检查它之前的表,而不是它之前的所有表。
任何人都知道我可以使用一个脚本来实现更自动化或更好的方法吗?
答案 0 :(得分:2)
人们像这样出售数据库垃圾;我总是惊讶于我在商业产品中看到的东西。
我认为这是动态sql和游标的真实案例。这正是一种一次性管理功能,这就是为什么存在这些技术的原因(它们实际上并不是主要用于生产代码,而是用于管理任务)。
我创建了一个表格,显示每个表格和表格,我认为它应该有一个foriegn键。 (如果它们至少具有良好的命名约定,您甚至可以从系统表中填充它。)
然后我会使用游标遍历表并以动态方式创建sql,以查看FK表是否有孤立记录。
它仍然有很多代码,但至少你不需要全部编写代码。