
# 采集源库的方法
#### 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语句转换](https://support.huaweicloud.com/usermanual-ugo/ugo_03_0023.html)进行SQL转换。
