更新时间:2024-01-26 GMT+08:00

采集源库的方法

Oracle为源库

Oracle源库对象的DDL信息如无特殊说明,都是通过DBMS_METADATA.get_ddl系统包函数获取的。

对象的基本信息从系统视图中获取,有DBA视图与ALL视图两种采集模式,以下以ALL视图采集模式进行说明:

INDEX:采集索引的时候,先从ALL_INDEXES视图里面查出所有的约束信息,然后把由主键或者唯一键约束自动创建的索引过滤掉(如果先创建了索引,然后创建约束,并且约束名和索引名相同,这种情况下索引也会被认为是由约束创建的,不会被采集)。

PostgreSQL为源库

以下是UGO对各个对象使用的采集方法:

  • SCHEMA:使用 "CREATE SCHEMA " + schema名; 的拼接方式。
  • TABLE:通过查询pg_catalog.pg_attribute、pg_catalog.pg_class、pg_catalog.pg_namespace、pg_inherits系统视图,获取表名、字段名、字段类型、以及表分区信息,拼接成CREATE TABLE语句。生成列、表约束、外键约束等信息未考虑。
  • INDEX:通过查询pg_indexes视图的indexdef字段获取CREATE INDEX语句。
  • VIEW:通过查询pg_views视图的definition字段获取视图的子查询,然后拼接成 CREATE VIEW语句。
  • FUNCTION/PROCEDURE:通过pg_get_functiondef方法来获取CREATE FUNCTION 和 CREATE PROCEDURE语句。

    请注意pg_get_functiondef方法无法处理聚合函数,因此自定义聚合函数当前无法采集。

  • TRIGGER:通过pg_get_functiondef方法获取触发器函数的定义,再通过pg_get_triggerdef获取CREATE TRIGGER语句,然后拼接成完整的触发器定义语句。

由于PostgreSQL数据库中并未公开获取所有对象类型定义DDL的方法,因此部分对象的DDL将采用查询元数据拼接的方式获取。这可能导致采集的DDL信息和原始DDL不一致,甚至缺少信息的情况。

如果采集的DDL无法满足您的使用要求,您可以使用pg_dump或者第三方数据库客户端工具获取对象DDL,然后通过SQL语句转换进行SQL转换。