我正在继承一个有400个表的数据库,只注册了150个外键约束.知道我对应用程序的处理方式并查看表格列,很容易说应该有更多.
如果我开始添加缺少的FK,我担心当前的应用程序软件将会中断,因为开发人员可能已经开始依赖这种“自由”了,但解决问题的第一步是提出缺少FK的列表,以便我们可以将它们评估为一个团队.
更糟糕的是,引用列不共享命名约定.
这些关系是非正式编码到数百个特殊查询和存储过程中的,所以我希望以编程方式解析这些文件,寻找实际表之间的JOINS(但不是表变量等).
我在这种方法中预见的挑战是:换行符,可选别名和表提示,别名解析.
>还有更好的想法吗? (除了戒烟)
>是否有任何预先构建的工具可以解决这个问题?
>我不认为正则表达式可以解决这个问题.你不同意吗?
> sql解析器?我尝试使用Microsoft.sqlServer.Management.sqlParser.Parser,但所有暴露的是词法分析器 – 无法从中获取AST – 所有内容都是内部的.
解决方法
强大的sql Parser可以帮助自动分析数百个ad-hoc查询和存储过程,并且从sql Parser生成的查询解析树中,可以轻松找到变量表/列的关系.
这是样本:
SELECT a.ASSMT_NO,b.LINK_PARAM,c.EXPL AS LINK_PG,(SELECT count() FROM GRAASPST t WHERE t.ASSMT_NO = a.ASSMT_NO AND t.ROLE != '02') AS PSN_CNT,(SELECT count() FROM GRAASPST t WHERE t.ASSMT_NO = a.ASSMT_NO AND t.ROLE != '02' AND ASSMT_FIN_YN = 'Y') AS PSN_FIN_CNT,(SELECT Avg(assmt_pts) FROM GRAASSMT t WHERE t.ASSMT_NO = a.ASSMT_NO AND t.ASSMT_TGT_SEQ_NO = a.ASSMT_TGT_SEQ_NO) AS ASSMT_PTS_AVG,a.ASSMT_RES,a.ASSMT_RPT_SUB_TITLE FROM GRAASTAT a JOIN GRAASRET b ON b.DELIB_REQ_NO = a.DELIB_REQ_NO JOIN GRTCODDT c ON c.DIV_CD = 'GR013' AND c.CD = b.DELIB_SLCT JOIN CMUSERMT d ON d.USERID = a.REGID WHERE a.ASSMT_NO = :ASSMT_NO ORDER BY a.ASSMT_TGT_SEQ_NO
JoinTable1 JoinColumn1 JoinTable2 JoinColumn2 GRAASRET DELIB_REQ_NO GRAASTAT DELIB_REQ_NO GRTCODDT CD GRAASRET DELIB_SLCT CMUSERMT USERID GRAASTAT REGID GRAASPST ASSMT_NO GRAASTAT ASSMT_NO GRAASSMT ASSMT_NO GRAASTAT ASSMT_NO GRAASSMT ASSMT_TGT_SEQ_NO GRAASTAT ASSMT_TGT_SEQ_NO