我正在继承一个有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
原文地址:https://www.jb51.cc/mssql/80671.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。