正在解析 SQL - 来自 table select 的所有 Teradata 关键字
parsing SQL - allTeradata keywords that select from a table
我正在尝试快速解析许多 sql 脚本以确定正在使用的源表和视图。
这个想法是搜索 "FROM" 并获取以下单词。
我知道这也可能导致子查询,但最终也会有一个 "FROM"。
备选方案是连接 dbc 表,但这会让我们快速浏览一下。
我应该寻找哪些关键字?
JOIN 和 FROM 是我目前唯一能想到的。
还有更多关键字吗?
谢谢
查看现有解析器的源代码:
我在看 jOOQ's parser's sources。它至少可以在这些上下文中解析 tables:
SELECT 语句:
FROM
(注意,这里有一个逗号分隔的列表:FROM a, b, c
是完全可能的)
(LEFT, RIGHT, FULL, CROSS) (NATURAL) (INNER, OUTER) JOIN
注意事项:
- Table中的引用
FROM
可以导出tables
- Table
FROM
中的引用可以是常见的 table 表达式(来自 WITH
子句)
插入语句:
INTO
(尽管在 Teradata 中它是可选的)
INSERT
或 INS
(Teradata 支持 INS
作为 INSERT
的别名)
更新语句:
UPDATE
或 UPD
(Teradata 支持 UPD
作为 UPDATE
的别名)
DELETE 语句:
FROM
(但关键字是可选的)
DELETE
或 DEL
(Teradata 支持 DEL
作为 DELETE
的别名)
MERGE 语句:
INTO
(可选)
MERGE
USING
DDL 语句:
不要忘记这些:
TRUNCATE
(TABLE
)
CREATE TABLE
CREATE VIEW
ALTER TABLE
ALTER VIEW
DROP TABLE
DROP VIEW
COMMENT ON TABLE
COMMENT ON VIEW
CREATE INDEX
(ON
子句)
GRANT
(ON
或 ON TABLE
子句)
REVOKE
(FROM
或 FROM TABLE
子句)
使用现有的解析器编写脚本:
如果使用 Java 是一个选项,那么您可以使用 jOOQ's parser, run all scripts through it, re-generate the SQL and plug in a VisitListener
来收集所有 table。像这样:
DSLContext ctx = DSL.using(SQLDialect.TERADATA);
ctx.configuration().set(new DefaultVisitListener() {
@Override
public void visitStart(VisitContext ctx) {
if (ctx.queryPart() instanceof Table)
System.out.println(ctx.queryPart());
}
});
// The toString() call will trigger a re-generation which passes through the VisitListener
ctx.parser().parse(allSQL).toString();
虽然 jOOQ 需要 TERADATA
的商业许可,但您可以使用免费的开源版来完成此特定任务,因为开源版的解析器几乎支持所有语法。
免责声明:我在 jOOQ 背后的公司工作。
您可以使用内置机制 SHOW (QUALIFIED)
:
Use the QUALIFIED option to produce a report that resolves the ambiguous dependencies.
SHOW QUALIFIED SELECT * FROM view_name;
这样您将获得包含视图相关性的报告。然后您可以根据该报告去除 table 名称。
我正在尝试快速解析许多 sql 脚本以确定正在使用的源表和视图。 这个想法是搜索 "FROM" 并获取以下单词。 我知道这也可能导致子查询,但最终也会有一个 "FROM"。
备选方案是连接 dbc 表,但这会让我们快速浏览一下。
我应该寻找哪些关键字? JOIN 和 FROM 是我目前唯一能想到的。 还有更多关键字吗?
谢谢
查看现有解析器的源代码:
我在看 jOOQ's parser's sources。它至少可以在这些上下文中解析 tables:
SELECT 语句:
FROM
(注意,这里有一个逗号分隔的列表:FROM a, b, c
是完全可能的)(LEFT, RIGHT, FULL, CROSS) (NATURAL) (INNER, OUTER) JOIN
注意事项:
- Table中的引用
FROM
可以导出tables - Table
FROM
中的引用可以是常见的 table 表达式(来自WITH
子句)
插入语句:
INTO
(尽管在 Teradata 中它是可选的)INSERT
或INS
(Teradata 支持INS
作为INSERT
的别名)
更新语句:
UPDATE
或UPD
(Teradata 支持UPD
作为UPDATE
的别名)
DELETE 语句:
FROM
(但关键字是可选的)DELETE
或DEL
(Teradata 支持DEL
作为DELETE
的别名)
MERGE 语句:
INTO
(可选)MERGE
USING
DDL 语句:
不要忘记这些:
TRUNCATE
(TABLE
)CREATE TABLE
CREATE VIEW
ALTER TABLE
ALTER VIEW
DROP TABLE
DROP VIEW
COMMENT ON TABLE
COMMENT ON VIEW
CREATE INDEX
(ON
子句)GRANT
(ON
或ON TABLE
子句)REVOKE
(FROM
或FROM TABLE
子句)
使用现有的解析器编写脚本:
如果使用 Java 是一个选项,那么您可以使用 jOOQ's parser, run all scripts through it, re-generate the SQL and plug in a VisitListener
来收集所有 table。像这样:
DSLContext ctx = DSL.using(SQLDialect.TERADATA);
ctx.configuration().set(new DefaultVisitListener() {
@Override
public void visitStart(VisitContext ctx) {
if (ctx.queryPart() instanceof Table)
System.out.println(ctx.queryPart());
}
});
// The toString() call will trigger a re-generation which passes through the VisitListener
ctx.parser().parse(allSQL).toString();
虽然 jOOQ 需要 TERADATA
的商业许可,但您可以使用免费的开源版来完成此特定任务,因为开源版的解析器几乎支持所有语法。
免责声明:我在 jOOQ 背后的公司工作。
您可以使用内置机制 SHOW (QUALIFIED)
:
Use the QUALIFIED option to produce a report that resolves the ambiguous dependencies.
SHOW QUALIFIED SELECT * FROM view_name;
这样您将获得包含视图相关性的报告。然后您可以根据该报告去除 table 名称。