比较HANA模式

143 阅读1分钟

最近接到一个重复性的任务,需要比较2(n)个HANA模式。 比较的内容是

  1. 两个模式中是否存在相同数量的表?可扩展到其他数据库对象,即过程、视图等。
  2. 两种模式之间的表的行数是否有差异?
  3. 输出模式之间缺失的表的列表等。

在HANA中找不到现有的功能或任何现成的东西。

这里包括下面的示例程序,以帮助那些寻找类似功能的人。该存储过程使用2个日志表TEST_SCHEMA_LOG和SCHEMA_TABCOUNT_LOG。

CREATE COLUMN TABLE "SCHEMA_TABCOUNT_LOG" ("TABLE_NAME" VARCHAR(500),
	 "TGTCOUNT" BIGINT CS_FIXED,
	 "SRCCOUNT" BIGINT CS_FIXED,
	 "DIFF" BIGINT CS_FIXED) UNLOAD PRIORITY 5 AUTO MERGE 

CREATE COLUMN TABLE "TEST_SCHEMA_LOG" ("SCHEMA_NAME" VARCHAR(100),
	 "PARAM" VARCHAR(100),
	 "VALUE" BIGINT CS_FIXED,
	 "RUNTIME" LONGDATE CS_LONGDATE) UNLOAD PRIORITY 5 AUTO MERGE 

系统视图SYS.M_TABLES包含你正在寻找的信息。下面的程序利用了这个视图并组织了比较的指标

CREATE or REPLACE PROCEDURE ZCREATE_COMPARE_SCHEMAS(IN SC1 VARCHAR(30),IN SC2 VARCHAR(30))
    LANGUAGE SQLSCRIPT
	SQL SECURITY INVOKER
	--READS SQL DATA 
	AS
BEGIN
	USING SQLSCRIPT_STRING AS lib;
DECLARE BEGIN_TIME,END_TIME TIMESTAMP;
DECLARE TABUCOUNT INTEGER;
DECLARE V_SELECT_EXTR VARCHAR(5000);
DECLARE V_SELECT_REL VARCHAR(5000);
DECLARE V_INSERT_REL VARCHAR(5000);
DECLARE i INT;
DECLARE b INT;

SELECT CURRENT_TIMESTAMP INTO END_TIME FROM DUMMY;
TRUNCATE TABLE "TEST_SCHEMA_LOG";
TRUNCATE TABLE "SCHEMA_TABCOUNT_LOG";
		V_SELECT_EXTR = 'select count(*) FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = '||''''||:SC1||'''';
		EXEC(V_SELECT_EXTR) into TABUCOUNT;
		INSERT INTO "TEST_SCHEMA_LOG"("SCHEMA_NAME","PARAM","VALUE","RUNTIME") 
       	VALUES (:SC1,'TABLECOUNT',:TABUCOUNT,:END_TIME) ; --:TABUCOUNT
       	V_SELECT_EXTR = 'select count(*) FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = '||''''||:SC2||'''';
		EXEC(V_SELECT_EXTR) into TABUCOUNT;
		INSERT INTO "TEST_SCHEMA_LOG"("SCHEMA_NAME","PARAM","VALUE","RUNTIME") 
       	VALUES (:SC2,'TABLECOUNT',:TABUCOUNT,:END_TIME) ;--:TABUCOUNT
---
		INSERT INTO "SCHEMA_TABCOUNT_LOG"
		SELECT TGT.SCHEMA_NAME||'.'||TGT.TABLE_NAME,TGT.RECORD_COUNT AS TGTRECCOUNT,SRC.RECORD_COUNT AS SRCRECCOUNT,(TGT.RECORD_COUNT - SRC.RECORD_COUNT)AS DIFF
 		FROM
		(SELECT "SCHEMA_NAME","TABLE_NAME","RECORD_COUNT"
		FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = :SC1) AS TGT --CHECK
		INNER JOIN
		(SELECT "TABLE_NAME","RECORD_COUNT"
		FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = :SC2) AS SRC --CHECK
		ON TGT.TABLE_NAME = SRC.TABLE_NAME;
END;

执行情况

调用 "ZCREATE_COMPARE_SCHEMAS" ('schema1', 'schema2')

输出

schema_artefact_compare

schema_artefact_compare

架构_行数_比较

当你有许多模式需要比较时,这个过程可以很容易地扩展,而且有一种模式可以使用数组来进行比较。对所有的数据库人工制品类型进行类似的扩展。