如何从Teradata QryLog提取INSERT/UPDATE/DELETE语句的目标表名
从Teradata提取DML操作目标表名的可行方法
方法一:利用DBC.DBQLObjTbl表(推荐)
Teradata的DBQL(Query Log)组件里的DBC.DBQLObjTbl专门记录了查询涉及的所有对象及操作类型,这是最可靠的方式,无需解析SQL或XML:
SELECT q.SessionId, q.QueryId, q.QueryText, CONCAT(o.DatabaseName, '.', o.ObjName) AS TargetTable FROM DBC.DBQLQryTbl q JOIN DBC.DBQLObjTbl o ON q.SessionId = o.SessionId AND q.QueryId = o.QueryId WHERE -- 匹配INSERT/UPDATE/DELETE对应的操作类型码 o.ObjActionType IN ('I', 'U', 'D') -- 仅筛选表对象(排除视图、存储过程等) AND o.ObjType = 'T' ORDER BY q.SessionId, q.QueryId;
关键说明:
ObjActionType取值:I对应INSERT,U对应UPDATE,D对应DELETEObjType = 'T'确保只返回表对象,避免误取视图、索引等其他对象- 该表会记录所有被DML修改的目标表,不受LockOperation是否存在的影响
方法二:解析DBQLXMLTbl的DML节点
如果偏好XML解析,可以直接提取DBC.DBQLXMLTbl中DML操作对应的Table节点,比LockOperation更精准:
SELECT SessionId, QueryId, QueryText, -- 提取INSERT目标表 XMLCAST( XMLQUERY('declare namespace ns="http://www.teradata.com/DBQL"; /ns:DBQL/ns:Query/ns:DML/ns:Insert/ns:Table/text()' PASSING XmltextInfo) AS VARCHAR(256) ) AS InsertTargetTable, -- 提取UPDATE目标表 XMLCAST( XMLQUERY('declare namespace ns="http://www.teradata.com/DBQL"; /ns:DBQL/ns:Query/ns:DML/ns:Update/ns:Table/text()' PASSING XmltextInfo) AS VARCHAR(256) ) AS UpdateTargetTable, -- 提取DELETE目标表 XMLCAST( XMLQUERY('declare namespace ns="http://www.teradata.com/DBQL"; /ns:DBQL/ns:Query/ns:DML/ns:Delete/ns:Table/text()' PASSING XmltextInfo) AS VARCHAR(256) ) AS DeleteTargetTable FROM DBC.DBQLXMLTbl WHERE XmltextInfo LIKE '%<Insert>%' OR XmltextInfo LIKE '%<Update>%' OR XmltextInfo LIKE '%<Delete>%' ORDER BY SessionId, QueryId;
方法三:正则解析SQL语句(兜底方案)
如果上述DBQL表因配置问题未记录完整数据,可以直接从DBC.DBQLQryTbl的QueryText字段用正则提取目标表:
SELECT SessionId, QueryId, QueryText, CASE WHEN QueryText LIKE 'INSERT%' THEN REGEXP_SUBSTR(QueryText, 'INSERT\\s+INTO\\s+([A-Z0-9_]+\\.[A-Z0-9_]+)', 1, 1, 'i', 1) WHEN QueryText LIKE 'UPDATE%' THEN REGEXP_SUBSTR(QueryText, 'UPDATE\\s+([A-Z0-9_]+\\.[A-Z0-9_]+)', 1, 1, 'i', 1) WHEN QueryText LIKE 'DELETE%' THEN REGEXP_SUBSTR(QueryText, 'DELETE\\s+FROM\\s+([A-Z0-9_]+\\.[A-Z0-9_]+)', 1, 1, 'i', 1) END AS TargetTable FROM DBC.DBQLQryTbl WHERE QueryText LIKE 'INSERT%' OR QueryText LIKE 'UPDATE%' OR QueryText LIKE 'DELETE%' ORDER BY SessionId, QueryId;
注意事项:
- 正则仅适配常规格式的DML语句,若SQL包含引号、别名、多表操作等复杂场景,需要调整正则表达式
- 建议优先使用前两种方法,正则解析作为兜底
内容的提问来源于stack exchange,提问作者Masker
相关产品推荐
相关产品推荐

