从脚本中的 JOINS 发现预期的外键

Jas*_*ban 5 parsing sql-server-2005 foreign-key

我正在继承一个有 400 个表和仅注册 150 个外键约束的数据库。知道我对应用程序做了什么并查看了表格列,很容易说应该还有更多。

如果我开始添加丢失的 FK,我担心当前的应用程序软件会崩溃,因为开发人员可能已经开始依赖这种“自由”,但是解决问题的第一步是提出丢失的 FK 的列表,因此我们可以作为一个团队来评估他们。

更糟糕的是,引用列不共享命名约定。

这些关系被非正式地编码到数百个即席查询和存储过程中,所以我希望以编程方式解析这些文件,以寻找实际表(但不是表变量等)之间的联接。

我在这种方法中预见的挑战是:换行符、可选别名和表提示、别名解析。

  • 有什么更好的想法吗?(除了放弃)
  • 是否有任何预先构建的工具可以解决这个问题?
  • 我不认为正则表达式可以处理这个。你不同意吗?
  • SQL 解析器?我尝试使用 Microsoft.SqlServer.Management.SqlParser.Parser 但暴露的只是词法分析器 - 无法从中获得 AST - 所有这些都是内部的。

小智 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)

您可以查看此演示以获取详细信息。