在把Oracle迁移至达梦后,对比源端和目的端对象,有时会发现达梦比oracle多出很多表。
或者在查询达梦数据库表数量或表名的时候,发现 select * from user_tables;
查出来的表数量与实际的表数量不一致,存在个别表名并非真正的表的情况,这些表在管理工具的模式下是看不到的。
出现这种情况的原因主要是由于以下几种情况:
-
达梦创建位图索引时,会创建一张表,表名为:
BM$_+位图索引对象id
-
达梦创建外键,该外键关联的字段是本表的字段时,会创建3张临时表,表名为:
SREF_CON_TAB+外键约束id+_LEVEL SREF_CON_TAB+外键约束id+_REFING SREF_CON_TAB+外键约束id+_REFED
-
达梦数据库创建全文索引时,会创建四张表,表名为:
CTI$+全文索引名+$I CTI$+全文索引名+$P CTI$+全文索引名+$D CTI$+全文索引名+$N
因此,查询达梦数据库的实际的表可以使用以下SQL:
--查看指定模式的所有表数量
SELECT
count(*)
FROM
SYSOBJECTS
WHERE
SCHID =
(
SELECT ID FROM SYSOBJECTS WHERE TYPE$='SCH' AND NAME ='模式名'
)
AND TYPE$ ='SCHOBJ'
AND SUBTYPE$='UTAB'
AND NAME NOT LIKE 'CTI%'
AND NAME NOT LIKE 'SREF_CON_TAB%'
AND NAME NOT LIKE 'BM$';