同步操作执行后,再次比对数据库,数据库侧还是原来的

Viewed 87

image.png
数据库实际已经更新为80,但再次比对还是第一次加载出来的长度?哪里设置有问题吗?

2 Answers

考虑到其他数字类型的长度,修改成以下:日期类型遇到后再测试!

SELECT
    col.owner AS schema_name,
	col.table_name AS tbl_def_key,
	col.column_id AS order_value,
	col.column_name AS def_key,
	clc.comments AS def_name,
	'' AS intro,
	col.data_type AS db_data_type,
  nvl(col.DATA_PRECISION,col.CHAR_LENGTH) AS data_len,
	col.data_scale AS num_scale,
	decode(col.nullable,'Y',0,1) AS not_null,
	CASE WHEN cc.constraint_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
	'' AS auto_increment,
	col.data_default AS default_value
FROM
	all_tab_columns col LEFT JOIN all_col_comments clc ON col.OWNER = clc.OWNER AND col.table_name = clc.table_name  AND col.column_name = clc.column_name 
	                    LEFT JOIN (all_cons_columns cc JOIN all_constraints cs ON cc.constraint_name = cs.constraint_name AND cc.owner = cs.owner and cs.constraint_type = 'P') on col.owner=cc.owner and col.table_name=cc.table_name and col.column_name = cc.column_name
WHERE
	col.owner in (:schemaName)
	AND CONCAT(CONCAT(col.owner, '.') , col.table_name) in (:sysTableNames)
ORDER BY
	col.owner ASC, col.table_name ASC,col.column_id ASC 

是元数据查询的模板有问题,你可以手动修改下改模板内容(根据当前你的数据是oracle还是sqlserver来决定用哪个模板):

1.oracle数据库
image.png

1.1.找到查询表字段的模板
49400f1b-c62c-4d55-abe1-be989bdedea0.png

1.2.用下面的内容将模板替换掉

SELECT
    col.owner AS schema_name,
	col.table_name AS tbl_def_key,
	col.column_id AS order_value,
	col.column_name AS def_key,
	clc.comments AS def_name,
	'' AS intro,
	col.data_type AS db_data_type,
	CASE DATA_TYPE
      WHEN 'NUMBER' THEN DATA_PRECISION
      WHEN 'BINARY_DOUBLE' THEN DATA_LENGTH
      ELSE CHAR_LENGTH
    END AS data_len,
	col.data_scale AS num_scale,
	decode(col.nullable,'Y',0,1) AS not_null,
	CASE WHEN cc.constraint_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
	'' AS auto_increment,
	col.data_default AS default_value
FROM
	all_tab_columns col LEFT JOIN all_col_comments clc ON col.OWNER = clc.OWNER AND col.table_name = clc.table_name  AND col.column_name = clc.column_name 
	                    LEFT JOIN (all_cons_columns cc JOIN all_constraints cs ON cc.constraint_name = cs.constraint_name AND cc.owner = cs.owner and cs.constraint_type = 'P') on col.owner=cc.owner and col.table_name=cc.table_name and col.column_name = cc.column_name
WHERE
	col.owner in (:schemaName)
	AND CONCAT(CONCAT(col.owner, '.') , col.table_name) in (:sysTableNames)
ORDER BY
	col.owner ASC, col.table_name ASC,col.column_id ASC

2.sqlServer数据库
800ef2a91f5f97000a653709066ee736.png

2.1.用下面的内容将模板替换掉

SELECT
    schema_name = sch.name,
    tbl_def_key =    tab.name,
    order_value =    col.column_id,
    def_key =        col.name,
    def_name =       ep.value,
    intro =          '',
    db_data_type =   t.name,
    data_len = IIF(col.max_length = 0, NULL,
                   IIF(t.name IN ('nvarchar', 'nchar'), col.max_length / 2, col.max_length)),
    num_scale =       IIF(col.scale = 0, null, col.scale),
    primary_key = ISNULL((
            SELECT TOP 1 1
            FROM sys.indexes i
            INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
            WHERE i.object_id = tab.object_id 
              AND ic.column_id = col.column_id
              AND i.is_primary_key = 1
                     ),0),
    not_null=        IIF(col.is_nullable = 1, 0, 1),
    auto_increment = is_identity,
   default_value =  ISNULL(REPLACE(REPLACE(dc.definition,'(',''), ')',''),'')      --  ISNULL(dc.definition, '')
FROM
    sys.schemas sch
        INNER JOIN sys.tables tab
                   ON sch.schema_id = tab.schema_id
        INNER JOIN sys.columns col
                   ON tab.object_id = col.object_id
        LEFT JOIN sys.extended_properties ep
                  ON tab.object_id = ep.major_id
                      AND col.column_id = ep.minor_id
                      AND ep.name = 'MS_Description'
                      AND ep.class = 1
        LEFT JOIN sys.types t ON col.system_type_id = t.system_type_id  AND col.user_type_id = t.user_type_id
        LEFT JOIN sys.default_constraints dc ON dc.object_id = col.default_object_id
where sch.name IN (:schemaName)  AND sch.name + '.' + tab.name IN  (:sysTableNames)
ORDER BY sch.name,tbl_def_key, order_value