1 -- Fix for https://itrack.web.att.com/browse/AJSCCMDA-90 --
4 /* uncomment below statement and run for your db, e.g. : use camundabpmn;
11 /*-- TMP_ARCHIVING_PROCINST */
12 DROP TABLE IF EXISTS TMP_ARCHIVING_PROCINST;
14 /*-- TMP_ARCHIVING_BYTEARRAY */
15 DROP TABLE IF EXISTS TMP_ARCHIVING_BYTEARRAY;
18 DROP TABLE IF EXISTS TMPLOGTABLE;
20 /* -- Camunda Hi Tables --*/
21 DROP TABLE IF EXISTS Camunda_Hi_Tables;
23 /* drop own extentions columns:
24 alter table ARCHIVE_ACT_HI_PROCINST DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
25 alter table ARCHIVE_ACT_HI_ACTINST DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
26 alter table ARCHIVE_ACT_HI_TASKINST DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
27 alter table ARCHIVE_ACT_HI_VARINST DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
28 alter table ARCHIVE_ACT_HI_DETAIL DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
29 alter table ARCHIVE_ACT_HI_COMMENT DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
30 alter table ARCHIVE_ACT_HI_ATTACHMENT DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
31 alter table ARCHIVE_ACT_HI_OP_LOG DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
32 alter table ARCHIVE_ACT_HI_INCIDENT DROP (STAT_EXECUTION_ID, STAT_EXECUTION_TS);
36 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_PROCINST;
38 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_ACTINST;
40 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_TASKINST;
42 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_VARINST;
44 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_DETAIL;
46 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_COMMENT;
48 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_ATTACHMENT;
50 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_OP_LOG;
52 DROP TABLE IF EXISTS ARCHIVE_ACT_HI_INCIDENT;
54 DROP TABLE IF EXISTS ARCHIVE_ACT_GE_BYTEARRAY;
56 /* drop PL SQL procedures: */
57 DROP PROCEDURE IF EXISTS ARCHIVE_CAMUNDA_HISTORY;
58 DROP PROCEDURE IF EXISTS ROLLB_ARCHIVE_CAMUNDA_HISTORY;
61 -- as sequence drop doesn't work automatically in MariaDB, use this procedure to drop sequence
62 DROP PROCEDURE IF EXISTS DropSequence;
64 /*-- To Drop the MariaDB specific user defined procedures and functions */
65 DROP FUNCTION IF EXISTS NextVal;
66 DROP PROCEDURE IF EXISTS CreateSequence;
67 DROP PROCEDURE IF EXISTS DropSequence;
68 DROP TABLE IF EXISTS _sequences;
70 /* -- If only the sequence: STAT_EXECUTION_SEQ needs to be removed, uncomment and use below statements --*/
73 CREATE PROCEDURE DropSequence (vname VARCHAR(30))
76 DELETE FROM _sequences WHERE name = vname;
81 -- use the above procedure to drop sequence
82 CALL DropSequence('STAT_EXECUTION_SEQ');
90 1. Create starts - Add some Camunda Indexes to history schema part (for Archiving)
92 create INDEX IF NOT EXISTS IDX_ACT_HI_TASKINST_PIID ON ACT_HI_TASKINST (PROC_INST_ID_);
93 create INDEX IF NOT EXISTS IDX_ACT_HI_COMMENT_PIID ON ACT_HI_COMMENT (PROC_INST_ID_);
94 create INDEX IF NOT EXISTS IDX_ACT_HI_ATTACHMENT_PIID ON ACT_HI_ATTACHMENT (PROC_INST_ID_);
95 create INDEX IF NOT EXISTS IDX_ACT_HI_OP_LOG_PIID ON ACT_HI_OP_LOG (PROC_INST_ID_);
96 create INDEX IF NOT EXISTS IDX_ACT_HI_INCIDENT_PIID ON ACT_HI_INCIDENT (PROC_INST_ID_);
97 create INDEX IF NOT EXISTS IDX_ACT_HI_ACTINST_PIID ON ACT_HI_ACTINST(PROC_INST_ID_);
101 2. Create Archiving Tables in current schema
104 /*-- TMP_ARCHIVING_PROCINST */
105 CREATE TABLE TMP_ARCHIVING_PROCINST
106 ( PROC_INST_ID_ varchar(64) not null,
107 END_TIME_ datetime(3)
109 CREATE INDEX AI_TMP_ARCH_PROCINST_PI_ID ON TMP_ARCHIVING_PROCINST(PROC_INST_ID_);
111 /*-- TMP_ARCHIVING_BYTEARRAY */
112 CREATE TABLE TMP_ARCHIVING_BYTEARRAY
113 ( BYTEARRAY_ID_ varchar(64) not null,
114 PROC_INST_ID_ varchar(64)
116 CREATE INDEX AI_TMP_ARCH_BYTEARRAY_BAID ON TMP_ARCHIVING_BYTEARRAY(BYTEARRAY_ID_);
119 /*--#1 ARCHIVE_ACT_HI_PROCINST; */
120 create TABLE ARCHIVE_ACT_HI_PROCINST
121 AS ( select * from ACT_HI_PROCINST where 1=0);
123 create index AI_HI_PROCINST_END_TIME on ARCHIVE_ACT_HI_PROCINST(END_TIME_);
124 ALTER TABLE ARCHIVE_ACT_HI_PROCINST ADD CONSTRAINT ARCHIVE_ACT_HI_PROCINST_UQ UNIQUE ( PROC_INST_ID_);
126 /*--#2 ARCHIVE_ACT_HI_ACTINST; */
127 create TABLE ARCHIVE_ACT_HI_ACTINST
128 AS ( select * from ACT_HI_ACTINST where 1=0);
130 create index AI_HI_ACTINST_PROC_INST_ID on ARCHIVE_ACT_HI_ACTINST(PROC_INST_ID_);
131 create index AI_HI_ACTINST_END_TIME on ARCHIVE_ACT_HI_ACTINST(END_TIME_);
133 /*--#3 ARCHIVE_ACT_HI_TASKINST; */
134 create TABLE ARCHIVE_ACT_HI_TASKINST
135 AS ( select * from ACT_HI_TASKINST where 1=0);
137 create index AI_HI_TASKINST_PROC_INST_ID on ARCHIVE_ACT_HI_TASKINST(PROC_INST_ID_);
138 create index AI_HI_TASKINST_END_TIME on ARCHIVE_ACT_HI_TASKINST(END_TIME_);
140 /*--#4 ARCHIVE_ACT_HI_VARINST; */
141 create TABLE ARCHIVE_ACT_HI_VARINST
142 AS ( select * from ACT_HI_VARINST where 1=0);
144 create index AI_HI_VARINST_PROC_INST_ID on ARCHIVE_ACT_HI_VARINST(PROC_INST_ID_);
146 /*--#5 ARCHIVE_ACT_HI_DETAIL; */
147 create TABLE ARCHIVE_ACT_HI_DETAIL
148 AS ( select * from ACT_HI_DETAIL where 1=0);
150 create index AI_HI_DETAIL_PROC_INST_ID on ARCHIVE_ACT_HI_DETAIL(PROC_INST_ID_);
151 create index AI_HI_DETAIL_TIME on ARCHIVE_ACT_HI_DETAIL(TIME_);
153 /*--#6 ARCHIVE_ACT_HI_COMMENT; */
154 create TABLE ARCHIVE_ACT_HI_COMMENT
155 AS ( select * from ACT_HI_COMMENT where 1=0);
157 create index AI_HI_COMMENT_PROC_INST_ID on ARCHIVE_ACT_HI_COMMENT(PROC_INST_ID_);
158 create index AI_HI_COMMENT_TIME on ARCHIVE_ACT_HI_COMMENT(TIME_);
160 /*--#7 ARCHIVE_ACT_HI_ATTACHMENT; */
161 create TABLE ARCHIVE_ACT_HI_ATTACHMENT
162 AS ( select * from ACT_HI_ATTACHMENT where 1=0);
164 create index AI_HI_ATTACHMENT_PROC_INST_ID on ARCHIVE_ACT_HI_ATTACHMENT(PROC_INST_ID_);
166 /*--#8 ARCHIVE_ACT_HI_OP_LOG; */
167 create TABLE ARCHIVE_ACT_HI_OP_LOG
168 AS ( select * from ACT_HI_OP_LOG where 1=0);
170 create index AI_HI_OP_LOG_PROC_INST_ID on ARCHIVE_ACT_HI_OP_LOG(PROC_INST_ID_);
171 create index AI_HI_OP_LOG_TIMESTAMP on ARCHIVE_ACT_HI_OP_LOG(TIMESTAMP_);
173 /*--#9 ARCHIVE_ACT_HI_INCIDENT; */
174 create TABLE ARCHIVE_ACT_HI_INCIDENT
175 AS ( select * from ACT_HI_INCIDENT where 1=0);
177 create index AI_HI_INCIDENT_PROC_INST_ID on ARCHIVE_ACT_HI_INCIDENT(PROC_INST_ID_);
179 /*--#10 ARCHIVE_ACT_GE_BYTEARRAY; */
180 create TABLE ARCHIVE_ACT_GE_BYTEARRAY
181 AS ( select * from ACT_GE_BYTEARRAY where 1=0);
183 create index AI_GE_BYTEARRAY_ID_ on ARCHIVE_ACT_GE_BYTEARRAY(ID_);
185 /* -----------------------------------------------------------------------------
186 Extend a ARCHIVE: Table by two attributes: STAT_EXECUTION_ID, STAT_EXECUTION_TS
191 alter table ARCHIVE_%TableName%
192 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
193 CREATE INDEX AI_%TableName%_EXE_ID ON ARCHIVE_%TableName%(STAT_EXECUTION_ID);
197 /*--#1 ACT_HI_PROCINST */
198 alter table ARCHIVE_ACT_HI_PROCINST
199 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
200 CREATE INDEX AI_ACT_HI_PROCINST_EXE_ID ON ARCHIVE_ACT_HI_PROCINST(STAT_EXECUTION_ID);
202 /*--#2 ACT_HI_ACTINST */
203 alter table ARCHIVE_ACT_HI_ACTINST
204 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
205 CREATE INDEX AI_ACT_HI_ACTINST_EXE_ID ON ARCHIVE_ACT_HI_ACTINST(STAT_EXECUTION_ID);
207 /*--#3 ACT_HI_TASKINST */
208 alter table ARCHIVE_ACT_HI_TASKINST
209 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
210 CREATE INDEX AI_ACT_HI_TASKINST_EXE_ID ON ARCHIVE_ACT_HI_TASKINST(STAT_EXECUTION_ID);
212 /*--#4 ACT_HI_VARINST */
213 alter table ARCHIVE_ACT_HI_VARINST
214 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
215 CREATE INDEX AI_ACT_HI_VARINST_EXE_ID ON ARCHIVE_ACT_HI_VARINST(STAT_EXECUTION_ID);
217 /*--#5 ACT_HI_DETAIL */
218 alter table ARCHIVE_ACT_HI_DETAIL
219 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
220 CREATE INDEX AI_ACT_HI_DETAIL_EXE_ID ON ARCHIVE_ACT_HI_DETAIL(STAT_EXECUTION_ID);
222 /*--#6 ACT_HI_COMMENT */
223 alter table ARCHIVE_ACT_HI_COMMENT
224 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
225 CREATE INDEX AI_ACT_HI_COMMENT_EXE_ID ON ARCHIVE_ACT_HI_COMMENT(STAT_EXECUTION_ID);
227 /*--#7 ACT_HI_ATTACHMENT */
228 alter table ARCHIVE_ACT_HI_ATTACHMENT
229 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
230 CREATE INDEX AI_ACT_HI_ATTACHMENT_EXE_ID ON ARCHIVE_ACT_HI_ATTACHMENT(STAT_EXECUTION_ID);
232 /*--#8 ACT_HI_OP_LOG */
233 alter table ARCHIVE_ACT_HI_OP_LOG
234 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
235 CREATE INDEX AI_ACT_HI_OP_LOG_EXE_ID ON ARCHIVE_ACT_HI_OP_LOG(STAT_EXECUTION_ID);
237 /*--#9 ACT_HI_INCIDENT */
238 alter table ARCHIVE_ACT_HI_INCIDENT
239 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
240 CREATE INDEX AI_ACT_HI_INCIDENT_EXE_ID ON ARCHIVE_ACT_HI_INCIDENT(STAT_EXECUTION_ID);
242 /*--#10 ACT_GE_BYTEARRAY */
243 alter table ARCHIVE_ACT_GE_BYTEARRAY
244 add (STAT_EXECUTION_ID bigint, STAT_EXECUTION_TS timestamp(0) DEFAULT CURRENT_TIMESTAMP );
245 CREATE INDEX AI_ACT_GE_BYTEARRAY_EXE_ID ON ARCHIVE_ACT_GE_BYTEARRAY(STAT_EXECUTION_ID);
248 /* -- Next Val as a user defined function needed only in MariaDB--*/
249 DROP FUNCTION IF EXISTS NextVal;
251 CREATE FUNCTION NextVal (vname VARCHAR(30))
254 -- Retrieve and update in single statement
259 RETURN (SELECT next FROM _sequences LIMIT 1);
264 /* -- History tables for use in archive procedure, there is no array type in MariaDB --*/
266 Create Table Camunda_Hi_Tables (id_ INT NOT NULL,
267 TableName_ varchar(80) NOT NULL);
269 Insert Into Camunda_Hi_Tables Values (1,'ACT_HI_PROCINST');
270 Insert Into Camunda_Hi_Tables Values (2,'ACT_HI_ACTINST');
271 Insert Into Camunda_Hi_Tables Values (3,'ACT_HI_TASKINST');
272 Insert Into Camunda_Hi_Tables Values (4,'ACT_HI_VARINST');
273 Insert Into Camunda_Hi_Tables Values (5,'ACT_HI_DETAIL');
274 Insert Into Camunda_Hi_Tables Values (6,'ACT_HI_COMMENT');
275 Insert Into Camunda_Hi_Tables Values (7,'ACT_HI_ATTACHMENT');
276 Insert Into Camunda_Hi_Tables Values (8,'ACT_HI_OP_LOG');
277 Insert Into Camunda_Hi_Tables Values (9,'ACT_HI_INCIDENT');
280 CREATE TABLE TMPLOGTABLE (LogMessage Varchar(700));
283 /* -- Below user defined functions and procedures needed only in MariaDB, they are in-built in Oracle --*/
284 /*-- Create a sequence SP */
285 DROP PROCEDURE IF EXISTS CreateSequence;
287 CREATE PROCEDURE CreateSequence (name VARCHAR(30), start INT, inc INT)
289 -- Create a table to store sequences
290 CREATE TABLE IF NOT EXISTS _sequences
292 name VARCHAR(70) NOT NULL UNIQUE,
297 -- Add the new sequence
298 INSERT INTO _sequences VALUES (name, start, inc);
303 /*--------------------------------------------------------------------------------------------------
305 -------------------------------------------------------------------------------------------------- */
307 /* Create STAT_EXECUTION_SEQ: each Archive Entry has a same Execution ID during one Archiving Run */
308 CALL CreateSequence('STAT_EXECUTION_SEQ', 1, 1);
313 ARCHIVE_CAMUNDA_HISTORY-Default Store Procedure starts
314 Camunda Version: 7.5.4-ee; MariaDB tested
316 Balaji Mudipalli, AJSC Camunda Team
319 --------------------------------------------------------------------------------------
320 Create ARCHIVE_CAMUNDA_HISTORY StoreProcedure -function for archiving of history camunda tables.
323 /* uncomment below statement and run for your db, e.g. : use camundabpmn;
326 DROP PROCEDURE IF EXISTS ARCHIVE_CAMUNDA_HISTORY;
330 CREATE PROCEDURE ARCHIVE_CAMUNDA_HISTORY(IN IN_periodInDays INT, IN IN_maxProcessInstances INT)
334 DECLARE P_hiTableCount INT;
335 DECLARE P_executionId BIGINT;
336 DECLARE P_piProcessed DOUBLE;
337 DECLARE P_baProcessed DOUBLE;
338 DECLARE P_startDate DATE;
339 DECLARE P_executionDuration double;
341 DECLARE not_found INT DEFAULT 0;
342 DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
344 /* START TRANSACTION */
345 set P_startDate = sysdate();
346 set P_executionId = NextVal('STAT_EXECUTION_SEQ');
348 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_executionId value is ',P_executionId);
350 DELETE FROM TMP_ARCHIVING_PROCINST;
351 DELETE FROM TMP_ARCHIVING_BYTEARRAY;
353 DELETE FROM TMPLOGTABLE;
356 /* 1. Set Default Value for Max Pi's */
357 IF IN_maxProcessInstances = 0 THEN SET IN_maxProcessInstances = 1000; END IF;
358 IF IN_maxProcessInstances > 1000 THEN SET IN_maxProcessInstances = 1000; END IF;
360 INSERT INTO TMPLOGTABLE SELECT CONCAT('IN_maxProcessInstances value is: ',IN_maxProcessInstances);
362 /* 2. Fill TMP_ARCHIVING_PROCINST with candidates: */
363 IF IN_maxProcessInstances = 0 THEN /* all */
364 INSERT INTO TMP_ARCHIVING_PROCINST
365 SELECT hi.PROC_INST_ID_, hi.END_TIME_
366 FROM ACT_HI_PROCINST hi
367 WHERE hi.END_TIME_ IS NOT NULL
368 AND hi.END_TIME_ <= ( DATE_SUB(SYSDATE(), INTERVAL IN_periodInDays DAY));
370 ELSE /* limit: IN_maxProcessInstances */
371 INSERT INTO TMP_ARCHIVING_PROCINST
372 (PROC_INST_ID_, END_TIME_) (
373 SELECT hi2.PROC_INST_ID_, hi2.END_TIME_
374 FROM ACT_HI_PROCINST hi2
375 WHERE hi2.END_TIME_ IS NOT NULL
376 AND hi2.END_TIME_ <= ( DATE_SUB(SYSDATE(), INTERVAL IN_periodInDays DAY))
377 ) LIMIT IN_maxProcessInstances;
380 /* 3. Check PI's im TEMP if any found, ready for ACHIVING */
381 select count(*) INTO P_piProcessed FROM TMP_ARCHIVING_PROCINST;
383 IF P_piProcessed = 0 THEN
384 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_piProcessed value is: ',P_piProcessed);
386 /* 4. Move data from history to archive (insert to archive and delete in history) */
388 SELECT COUNT(*)+1 INTO P_hiTableCount FROM camunda_hi_tables;
389 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_hiTableCount value is ',P_hiTableCount);
391 WHILE @i < P_hiTableCount
393 SELECT TableName_ INTO @P_tableName FROM camunda_hi_tables WHERE id_ = @i;
394 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_tableName: ', @P_tableName);
396 Set @P_archiveTableName = Concat('ARCHIVE_',IFNULL(@P_tableName, ''));
397 INSERT INTO TMPLOGTABLE SELECT CONCAT('@P_archiveTableName: ', @P_archiveTableName);
399 SET @query1 = CONCAT('INSERT INTO ', @P_archiveTableName ,
400 ' SELECT hi3.*, ',P_executionId, ', NOW() FROM ', @P_tableName,' hi3
401 WHERE hi3.PROC_INST_ID_ in ( SELECT PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)');
402 INSERT INTO TMPLOGTABLE SELECT CONCAT('@query1: ', @query1);
404 PREPARE stmt1 FROM @query1;
406 DEALLOCATE PREPARE stmt1;
408 SET @query2 = CONCAT ('DELETE ACT FROM ',@P_tableName,' ACT INNER JOIN TMP_ARCHIVING_PROCINST TMP ON ACT.PROC_INST_ID_ = TMP.PROC_INST_ID_');
409 INSERT INTO TMPLOGTABLE SELECT CONCAT('@query2: ', @query2);
411 PREPARE stmt2 FROM @query2;
413 DEALLOCATE PREPARE stmt2;
417 /* select bytearray_ids */
418 INSERT INTO TMP_ARCHIVING_BYTEARRAY
419 SELECT BYTEARRAY_ID_, PROC_INST_ID_ FROM ARCHIVE_ACT_HI_VARINST archvar
420 where archvar.PROC_INST_ID_ in (SELECT PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)
421 AND archvar.BYTEARRAY_ID_ is not null;
423 INSERT INTO TMP_ARCHIVING_BYTEARRAY
424 SELECT BYTEARRAY_ID_, PROC_INST_ID_ FROM ARCHIVE_ACT_HI_DETAIL archvar
425 where archvar.PROC_INST_ID_ in (SELECT PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)
426 AND archvar.BYTEARRAY_ID_ is not null;
428 /* 5. Check Bytearrays im TEMP if any found, ready for ACHIVING */
429 select count(*) INTO P_baProcessed FROM TMP_ARCHIVING_BYTEARRAY;
432 INSERT INTO ARCHIVE_ACT_GE_BYTEARRAY
433 SELECT hi4.*, P_executionId, NOW() FROM ACT_GE_BYTEARRAY hi4
434 WHERE hi4.ID_ in ( SELECT BYTEARRAY_ID_ FROM TMP_ARCHIVING_BYTEARRAY);
437 DELETE FROM ACT_GE_BYTEARRAY WHERE ID_ in (select BYTEARRAY_ID_ FROM TMP_ARCHIVING_BYTEARRAY);
439 /* COMMIT TRANSACTION */
441 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_executionId is ', P_executionId);
443 set P_executionDuration = DATEDIFF(sysdate(), P_startDate);
445 INSERT INTO TMPLOGTABLE SELECT CONCAT('SP success and P_executionDuration is ', ifnull((round(P_executionDuration*24*60*60, 1)), ''), ' sec.');
456 ROLLB_ARCHIVE_CAMUNDA_HISTORY-StoreProcedure starts
457 Camunda Version: 7.5.4-ee; MariaDB tested
459 Balaji Mudipalli, AJSC Camunda Team
462 --------------------------------------------------------------------------------------
463 Create ROLLB_ARCHIVE_CAMUNDA_HISTORY StoreProcedure for ROLLBACK (RESTORE)
464 of archived Camunda history tables.
467 /* uncomment below statement and run for your db, e.g. : use camundabpmn;
472 DROP PROCEDURE IF EXISTS ROLLB_ARCHIVE_CAMUNDA_HISTORY;
475 CREATE PROCEDURE ROLLB_ARCHIVE_CAMUNDA_HISTORY(IN IN_executionId_from INT,
476 IN IN_executionId_til INT,
477 IN IN_maxProcessInstances INT)
481 DECLARE P_hiTableCount INT;
482 DECLARE P_piProcessed DOUBLE;
483 DECLARE P_baProcessed DOUBLE;
484 DECLARE P_query VARCHAR(600);
485 DECLARE P_startDate DATETIME;
486 DECLARE P_executionDuration DOUBLE;
487 DECLARE P_result NVARCHAR(400);
488 DECLARE not_found INT DEFAULT 0;
489 DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
492 /* START TRANSACTION */
493 SET P_startDate = sysdate();
494 DELETE FROM TMPLOGTABLE;
496 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: START EXECUTION: ' , ifnull(date_format(current_timestamp, '%d.%m.%Y %H:%i:%s ..FF3'), '') ,
497 '; PARAMS: IN_executionId_from: ' , IFNULL(IN_executionId_from, '') ,
498 '; IN_executionId_til: ' , IFNULL(IN_executionId_til, '') ,
499 '; IN_maxProcessInstances: ' , IFNULL(IN_maxProcessInstances, ''));
501 /* 1. Truncate TMP_ARCHIVING_PROCINST */
503 DELETE FROM TMP_ARCHIVING_PROCINST;
504 DELETE FROM TMP_ARCHIVING_BYTEARRAY;
506 /* 2. Fill TMP_ARCHIVING_PROCINST with candidates: */
507 IF IN_executionId_til = -1 THEN /* IN_executionId_from only */
508 SET P_query= CONCAT(' WHERE STAT_EXECUTION_ID = ' , IFNULL(IN_executionId_from, ''));
510 ELSEIF IN_executionId_til = 0 THEN /* all from IN_executionId_from */
511 SET P_query= CONCAT(' WHERE STAT_EXECUTION_ID >= ' , IFNULL(IN_executionId_from, ''));
513 ELSE /* between IN_executionId_from AND IN_executionId_til */
514 SET P_query= CONCAT(' WHERE STAT_EXECUTION_ID between ', IFNULL(IN_executionId_from, '') , ' AND ' , IFNULL(IN_executionId_til, ''));
517 IF IN_maxProcessInstances = 0 THEN /* all */
519 SET @P_query1 = CONCAT('INSERT INTO TMP_ARCHIVING_PROCINST ', ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
520 ' SELECT PROC_INST_ID_, END_TIME_ FROM ARCHIVE_ACT_HI_PROCINST ', ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
521 ' ', Ifnull(P_query, ''));
523 ELSE /* limit: IN_maxProcessInstances */
524 SET @P_query1 = CONCAT('INSERT INTO TMP_ARCHIVING_PROCINST ' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
525 ' (PROC_INST_ID_, END_TIME_ ) ( ' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
526 ' SELECT PROC_INST_ID_, END_TIME_ FROM ARCHIVE_ACT_HI_PROCINST ' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
527 ' ', Ifnull(P_query, '') , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
528 ') LIMIT ', IFNULL(IN_maxProcessInstances, ''));
531 INSERT INTO TMPLOGTABLE SELECT CONCAT('QUERY (before execute): /fill temp table with PI candidates/ ' , Ifnull(P_query, ''));
533 PREPARE stmt1 FROM @P_query1;
535 DEALLOCATE PREPARE stmt1;
537 INSERT INTO TMPLOGTABLE SELECT CONCAT('.... rows inserted into TMP_ARCHIVING_PROCINST: ' , IFNULL((ROW_COUNT()), ''));
539 /* 3. Fill TMP_ARCHIVING_BYTEARRAYS with candidates: */
540 INSERT INTO TMP_ARCHIVING_BYTEARRAY
541 SELECT BYTEARRAY_ID_, PROC_INST_ID_ FROM ARCHIVE_ACT_HI_VARINST archvar
542 where archvar.PROC_INST_ID_ in (SELECT PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)
543 AND archvar.BYTEARRAY_ID_ is not null;
545 INSERT INTO TMP_ARCHIVING_BYTEARRAY
546 SELECT BYTEARRAY_ID_, PROC_INST_ID_ FROM ARCHIVE_ACT_HI_DETAIL archvar
547 where archvar.PROC_INST_ID_ in (SELECT PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)
548 AND archvar.BYTEARRAY_ID_ is not null;
550 select count(*) INTO P_baProcessed FROM TMP_ARCHIVING_BYTEARRAY;
551 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: ', IFNULL(P_baProcessed, '') ,' ByteArray candidates for rollback found!' , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''));
554 /* 4. Check PI's im TEMP ready for ROLLBACK */
555 select count(*) INTO P_piProcessed FROM TMP_ARCHIVING_PROCINST;
557 IF P_piProcessed = 0 THEN /* no candidates found */
558 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: NO ProcessInstance-Candidates for archive-Rollback found! ');
559 INSERT INTO TMPLOGTABLE SELECT CONCAT('Try TA-ROLLBACK ...');
560 ROLLBACK; /*-- TMP_ARCHIVING_PROCINST un-Delete */
561 INSERT INTO TMPLOGTABLE SELECT CONCAT('TA-ROLLBACK DONE! ...' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''));
563 SET P_result = CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: NO ProcessInstance candidates for archive-Rollback found!', ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
564 ifnull(date_format(current_timestamp, '%d.%m.%Y %H:%i:%s ..FF3'), '') , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
565 ' Used PARAMS: IN_executionId_from: ' , IFNULL(IN_executionId_from, '') ,
566 '; IN_executionId_til: ' , IFNULL(IN_executionId_til, '') ,
567 '; IN_maxProcessInstances: ' , IFNULL(IN_maxProcessInstances, ''));
569 INSERT INTO TMPLOGTABLE SELECT CONCAT(P_result);
572 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: ', IFNULL(P_piProcessed, '') ,' ProcessInstance candidates for Rollback found!');
574 /* LOOP over tables */
575 SELECT COUNT(*)+1 INTO P_hiTableCount FROM camunda_hi_tables;
577 INSERT INTO TMPLOGTABLE SELECT CONCAT('P_hiTableCount value is ',P_hiTableCount);
581 WHILE @i < P_hiTableCount
583 SELECT TableName_ INTO @P_tableName FROM camunda_hi_tables WHERE id_ = @i;
585 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: ####### Start restore from: ARCHIVE_' , IFNULL(@P_tableName, '') ,' ...');
587 SET @P_tableFields = CONCAT('');
589 select GROUP_CONCAT(column_name order by ordinal_position)
591 from information_schema.columns
592 where table_schema = (select DATABASE()) AND TABLE_NAME = @P_tableName;
595 SET @P_query2 = CONCAT('INSERT INTO ', IFNULL(@P_tableName, '') ,
596 ' SELECT ' , @P_tableFields,
597 ' FROM ARCHIVE_' , IFNULL(@P_tableName, '') ,
598 ' WHERE PROC_INST_ID_ in ( SELECT tmp.PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST tmp)');
600 INSERT INTO TMPLOGTABLE SELECT CONCAT('QUERY (before execute): /copy back to history table/ ' , Ifnull(@P_query2, ''));
602 PREPARE stmt2 FROM @P_query2;
604 DEALLOCATE PREPARE stmt2;
606 INSERT INTO TMPLOGTABLE SELECT Concat('.... rows inserted: ' , IFNULL((ROW_COUNT()), ''));
609 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: Delete in Archive: ARCHIVE_' , IFNULL(@P_tableName, '') ,' ...');
610 /* SET @P_query3 = CONCAT(' DELETE FROM ARCHIVE_' , IFNULL(@P_tableName, '') , ' WHERE PROC_INST_ID_ in (select PROC_INST_ID_ FROM TMP_ARCHIVING_PROCINST)'); */
611 SET @P_query3 = CONCAT('DELETE ARCH FROM ARCHIVE_' , IFNULL(@P_tableName, '') ,
612 ' ARCH INNER JOIN TMP_ARCHIVING_PROCINST TMP ON ARCH.PROC_INST_ID_ = TMP.PROC_INST_ID_');
613 INSERT INTO TMPLOGTABLE SELECT CONCAT('QUERY (before execute): ' , Ifnull(@P_query3, ''));
614 PREPARE stmt3 FROM @P_query3;
616 DEALLOCATE PREPARE stmt3;
618 INSERT INTO TMPLOGTABLE SELECT Concat('.... rows deleted: ' , IFNULL((ROW_COUNT()), '') , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''));
624 SET @P_tableFields2 = CONCAT(''); /* reset, becouse had some problems with double columns */
625 /* fetch table column names into P_tableFields : */
626 select GROUP_CONCAT(COLUMN_NAME order by ordinal_position)
628 from information_schema.columns
629 where table_schema = (select DATABASE()) AND TABLE_NAME = 'ACT_GE_BYTEARRAY';
631 SET @P_query4 = CONCAT('INSERT INTO ACT_GE_BYTEARRAY ' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
632 ' SELECT ' , IFNULL(@P_tableFields2, '') ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
633 ' FROM ARCHIVE_ACT_GE_BYTEARRAY' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
634 ' WHERE ID_ in ( SELECT tmp.BYTEARRAY_ID_ FROM TMP_ARCHIVING_BYTEARRAY tmp)');
635 INSERT INTO TMPLOGTABLE SELECT CONCAT('QUERY (before execute): /copy back to history table/ ' , Ifnull(@P_query4, ''));
636 PREPARE stmt4 FROM @P_query4;
638 DEALLOCATE PREPARE stmt4;
639 INSERT INTO TMPLOGTABLE SELECT Concat('.... rows inserted: ' , IFNULL((ROW_COUNT()), ''));
642 /* DELETE FROM ARCHIVE_ACT_GE_BYTEARRAY WHERE ID_ in (select BYTEARRAY_ID_ FROM TMP_ARCHIVING_BYTEARRAY); */
643 DELETE AAGB FROM ARCHIVE_ACT_GE_BYTEARRAY AAGB INNER JOIN TMP_ARCHIVING_BYTEARRAY TMP_B ON AAGB.ID_ = TMP_B.BYTEARRAY_ID_;
644 INSERT INTO TMPLOGTABLE SELECT Concat('.... rows deleted: ' , IFNULL((ROW_COUNT()), '') , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''));
646 /* COMMIT TRANSACTION */
647 INSERT INTO TMPLOGTABLE SELECT CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: PIs processed: ' , IFNULL(P_piProcessed, '')) ;
649 INSERT INTO TMPLOGTABLE SELECT CONCAT('TA-COMMIT DONE!' ,ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''));
651 SET P_executionDuration = DATEDIFF(sysdate(), P_startDate);
653 SET P_result = CONCAT('[ROLLB_ARCHIVE_CAMUNDA_HISTORY]: EXECUTED (commited) successfully! ' , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
654 ifnull(date_format(current_timestamp, '%d.%m.%Y %H:%i:%s ..FF3'), '') , '; Duration: ' , ifnull((round(P_executionDuration*24*60*60, 1)), ''), ' sec.' , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), '') ,
655 ' PIs processed: ' , IFNULL(P_piProcessed, '') , ifnull(char(13 using ascii), ''),ifnull(char(10 using ascii), ''),
656 ' Used PARAMS: IN_executionId_from: ' , IFNULL(IN_executionId_from, '') ,
657 '; IN_executionId_til: ' , IFNULL(IN_executionId_til, '') ,
658 '; IN_maxProcessInstances: ' , IFNULL(IN_maxProcessInstances, ''));
660 INSERT INTO TMPLOGTABLE SELECT CONCAT(P_result);