系统或目录表 - DBA_ / DBC - 输出是易失性的

时间:2013-01-14 18:21:46

标签: oracle11g teradata

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

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

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

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

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

有任何想法/指示吗?

1 个答案:

答案 0 :(得分: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
     )
;