0

我正在尝试获取使用系统或目录表引用特定字段的所有表/视图(换句话说,所有对象)的列表。我正在使用以下查询。

select * 
  from dba_col_comments 
 where column_name like('SXX_AXXX_%') 
 order by 1;

但是,输出是不稳定的。当我重复运行相同的查询而不进行任何更改时,输出会有所不同。例如,它产生了 9300 条记录,几分钟后又产生了 9350 条,几分钟后又产生了 9347 条。

我也在 Teradata 中观察到相同的行为。

我的理论是——在生产环境中,创建的临时对象可能会在系统/目录表中获得一个条目。

有什么想法/方向吗?

4

1 回答 1

0

在 Teradata 中,您会发现global temporary tables实例化(由 SQL 语句引用)的记录​​应添加到数据字典表 TVM 中。然后在会话注销后删除这些记录,只留下与CREATE GLOBAL TEMPORARY TABLE提交的原始语句关联的基表记录。

您可以使用视图找到这些实例DBC.AllTempTables

在 Teradata 中,volatile tables不在数据字典内维护。

编辑 - 您的里程可能会有所不同,但这应该让您开始使用 Teradata

SELECT D1.DatabaseNameI AS DatabaseName_
     , T1.TVMNameI AS TableName_
     , F1.FieldName AS ColumnName_
  FROM "DBC".TVM T1
 INNER JOIN
       "DBC".Dbase D1
    ON D1.DatabaseId = T1.DatabaseId
 INNER JOIN
       "DBC".TVFields F1
    ON F1.DatabaseId = T1.DatabaseId
   AND F1.TableId = T1.TVMId
WHERE F1.FieldName = 'MyColumn'
  --AND D1.DatabaseNameI IN ('{Database1}', ... '{Database99}') -- Filter on databases
  AND F1.FieldType in ('i', 'i1', 'i2', 'i8') -- Integer, ByteInt, SmallInt, BigInt
  --AND T1.TableKind IN ('T') -- Optional Filter to just tables.
  AND NOT EXISTS
     (SELECT 'x'
        FROM "DBC".TempTables TT1
       WHERE Tt1.TableId = T1.TVMId
     )
;
于 2013-01-14T21:26:51.480 回答