Jas*_*ban 5 parsing sql-server-2005 foreign-key
我正在继承一个有 400 个表和仅注册 150 个外键约束的数据库。知道我对应用程序做了什么并查看了表格列,很容易说应该还有更多。
如果我开始添加丢失的 FK,我担心当前的应用程序软件会崩溃,因为开发人员可能已经开始依赖这种“自由”,但是解决问题的第一步是提出丢失的 FK 的列表,因此我们可以作为一个团队来评估他们。
更糟糕的是,引用列不共享命名约定。
这些关系被非正式地编码到数百个即席查询和存储过程中,所以我希望以编程方式解析这些文件,以寻找实际表(但不是表变量等)之间的联接。
我在这种方法中预见的挑战是:换行符、可选别名和表提示、别名解析。
小智 2
强大的SQL Parser可以帮助自动分析数百个即席查询和存储过程,并且从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
Run Code Online (Sandbox Code Playgroud)
分析这个查询后,你可能会得到这样的结果:
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
Run Code Online (Sandbox Code Playgroud)
您可以查看此演示以获取详细信息。