最近接到一个重复性的任务,需要比较2(n)个HANA模式。 比较的内容是
- 两个模式中是否存在相同数量的表?可扩展到其他数据库对象,即过程、视图等。
- 两种模式之间的表的行数是否有差异?
- 输出模式之间缺失的表的列表等。
在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

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