Datenbereinigung von großen Datenmengen
Einführung
Vor oder direkt nach einem Update müssen diese Daten initial einmal manuell per Datenbank-Statements bereinigt werden, um danach die korrekten Bereinigungsjob einzurichten. Je kürzer die Zeitspanne im Bereinigungsjob ist, desto weniger Daten werden in den Tabellen der Activiti-Prozess-Engine gesammelt.
Die nachfolgenden Statements unterscheiden sich für MSSQL und ORACLE nur in der Datumsangabe (getdate()
bzw. sysdate()
).
Um sich einen Überblick über Anzahl der Prozessinstanzen pro Prozess zu verschaffen, sollte man vor jeder manuellen Bereinigung das Ergebnis folgende Statements anschauen:
Anzahl der noch laufenden Prozess-Instanzen
SELECT ProcessId,Count(ProcessId) AS count
FROM ProcessInstance
GROUP BY ProcessId
ORDER BY count DESC
Anzahl der Prozess-Instanzen
SELECT ACT_RE_PROCDEF.NAME_, COUNT(ACT_HI_PROCINST.ID_) AS count
FROM ACT_RE_PROCDEF, ACT_HI_PROCINST
WHERE ACT_HI_PROCINST.PROC_DEF_ID_ = ACT_RE_PROCDEF.ID_
/* AND START_TIME_ < (SYSDATE - 100) AND END_TIME_ IS NULL */
GROUP BY ACT_RE_PROCDEF.NAME_
ORDER BY count DESC
Anzahl der durchlaufenen Aktionen pro Prozess
SELECT ACT_RE_PROCDEF.NAME_, COUNT(ACT_HI_ACTINST.ID_) AS count
FROM ACT_RE_PROCDEF, ACT_HI_PROCINST, ACT_HI_ACTINST
WHERE ACT_HI_PROCINST.PROC_DEF_ID_ = ACT_RE_PROCDEF.ID_
AND ACT_HI_ACTINST.PROC_INST_ID_ = ACT_HI_PROCINST.ID_
GROUP BY ACT_RE_PROCDEF.NAME_
ORDER BY count DESC ;
Mit diesen Statements kann man die Prozesse identifizieren, die die meisten Daten in den Prozess-Tabellen hinterlassen, obwohl für diese Prozesse keine Auswertung über CURSOR-BPM notwendig ist.
Bereinigung im Testsystem
Im Testsystem sind nur Testdaten enthalten. Hier können die Prozess-Tabellen vollständig und effizient aufgeräumt werden.
Warnung
Die folgenden Statements löschen laufende Instanzen genauso wie alle historisierten Daten. Nur die veröffentlichten Prozess-Definitionen bleiben in den Activiti-Tabellen erhalten.
Bevor diese Statements abgesetzt werden, sollte der JBoss-Applikationsserver des Testsystems beendet werden. Die Reihenfolge der Statements muss genau eingehalten werden!
Runtime-Tabellen löschen
TRUNCATE TABLE ACT_RU_VARIABLE;
TRUNCATE TABLE ACT_RU_JOB;
TRUNCATE TABLE ACT_RU_TIMER_JOB;
TRUNCATE TABLE ACT_RU_SUSPENDED_JOB;
TRUNCATE TABLE ACT_RU_DEADLETTER_JOB;
TRUNCATE TABLE ACT_RU_IDENTITYLINK;
TRUNCATE TABLE ACT_RU_TASK;
TRUNCATE TABLE ACT_RU_EXECUTION;
TRUNCATE TABLE ACT_RU_INTEGRATION;
/* Teilweise kann ein TRUNCATE unter ORCALE wegen Fehler der referenzieller Integrität nicht abgesetzt werden.
Dieses muss dann durch ein DELETE mit anschließender Tabellen-Verkleinerung ersetzt werden. */
TRUNCATE TABLE ACT_RU_VARIABLE;
TRUNCATE TABLE ACT_RU_JOB;
TRUNCATE TABLE ACT_RU_TIMER_JOB;
TRUNCATE TABLE ACT_RU_SUSPENDED_JOB;
TRUNCATE TABLE ACT_RU_DEADLETTER_JOB;
TRUNCATE TABLE ACT_RU_IDENTITYLINK;
TRUNCATE TABLE ACT_RU_INTEGRATION;
DELETE FROM ACT_RU_EVENT_SUBSCR WHERE PROC_INST_ID_ IS NOT NULL;
DELETE FROM ACT_RU_TASK;
ALTER TABLE ACT_RU_TASK enable row movement;
ALTER TABLE ACT_RU_TASK shrink space cascade;
ALTER TABLE ACT_RU_TASK disable row movement;
DELETE FROM ACT_RU_EXECUTION;
ALTER TABLE ACT_RU_EXECUTION enable row movement;
ALTER TABLE ACT_RU_EXECUTION shrink space cascade;
ALTER TABLE ACT_RU_EXECUTION disable row movement;
Es gilt zu beachten, dass die History-Tabellen auch Daten zu den laufenden Instanzen enthalten.
History-Tabellen löschen
TRUNCATE TABLE ACT_HI_VARINST;
TRUNCATE TABLE ACT_HI_ACTINST;
TRUNCATE TABLE ACT_HI_TASKINST;
TRUNCATE TABLE ACT_HI_IDENTITYLINK;
TRUNCATE TABLE ACT_HI_PROCINST;
Die Tabelle ACT_GE_BYTEARRAY enthält Prozess-Variablen und das Deployment der Prozesse. Wird die Tabelle komplett geleert, müssen alle Prozesse neu veröffentlicht werden!
Blob-Tabelle löschen
DELETE FROM ACT_GE_BYTEARRAY WHERE Deployment_Id_ IS NULL;
/* Unter ORACLE sollte die Tabelle nach dem DELETE verkleinert werden. */
ALTER TABLE ACT_GE_BYTEARRAY enable row movement;
ALTER TABLE ACT_GE_BYTEARRAY shrink space cascade;
ALTER TABLE ACT_GE_BYTEARRAY disable row movement;
/* Falls es sich um ein 'secure file LOB' Segment handelt, muss ein anderes Statement zum Verkleinern genutzt werden: https://oracle-base.com/articles/misc/alter-table-shrink-space-online */
ALTER TABLE ACT_GE_BYTEARRAY MOVE LOB(BYTES_) STORE AS (TABLESPACE <used_table_space>)
/* Indices der Tabelle ACT_GE_BYTEARRAY müssen neu aufgebaut werden */
declare
v_cursor integer := DBMS_SQL.OPEN_CURSOR;
begin
for v_rec in ( select * from USER_INDEXES where index_type in ('NORMAL', 'FUNCTION-BASED NORMAL') and table_name = 'ACT_GE_BYTEARRAY' ) loop
DBMS_SQL.PARSE( v_cursor , 'ALTER INDEX '||v_rec.INDEX_NAME||' REBUILD ' , DBMS_SQL.NATIVE );
end loop;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
end;
Die im CRM enthaltenen Prozess-Tabellen müssen auch bereinigt werden.
Blob-Tabelle löschen
TRUNCATE TABLE ProcessInstance;
TRUNCATE TABLE ProcessWaitStat;
TRUNCATE TABLE ProcessErrorLog;
Bereinigung im Produktiv-System
Im Produktiv-System dürfen auf keinen Fall die laufenden Prozessinstanzen gelöscht werden. Dies kann in Ausnahmefällen gemacht werden, wenn
Prozesse durch Anwender nicht ordnungsgemäß beendet werden,
offene Instanzen auf Grund von Fehlern liegen geblieben sind
oder einzelne Prozesse durch Schleifen endlos laufen.
Auch die Prozess-Historie wird teilweise für die Laufzeit-Auswertung von Prozessen benötigt. Hierfür ist es zwingend notwendig die fachlichen Anforderungen der Prozesse zu berücksichtigen und sich einen genauen Überblick über die Anzahl an Instanzen pro Prozess zu verschaffen. Meist sind es nur wenige Prozesse, die 95% des Platzes der Activiti-Tabellen belegen. Genau diese Prozesse müssen manuell bereinigt werden, bevor ab Version 16.1 die Bereinigungsjobs eingerichtet werden können.
Fehlerhaft laufende Instanzen löschen
Diese Aktion ist optional, wenn im System keine fehlerhaften Instanzen vorhanden sind oder diese über die CURSOR-BPM Oberfläche entfernt werden können.
Für eine genauere Prüfung können die Instanzinformationen aus der Tabelle ProcessInstance
ermittelt werden
Informationen zu laufenden Prozessen
SELECT ProcessId, ActivitiName, InstanceId, StartUser, UserId, UpdateDate
FROM ProcessInstance
Alle betroffenen Instanzen müssen in einer temporären Tabelle gesammelt werden. Die Einschränkungen sind kundenindividuell zu ermitteln.
Temporäre Tabelle TMP_ACT_RU_PROCINST
CREATE TABLE TMP_ACT_RU_PROCINST AS
(SELECT InstanceId FROM ProcessInstance
WHERE ProcessId IN ('...')
/* AND ActivitiName LIKE '%...' */ );
/* Alle laufenden Instanzen löschen */
CREATE TABLE TMP_ACT_RU_PROCINST AS
(SELECT DISTINCT PROC_INST_ID_ AS InstanceId FROM ACT_RU_EXECUTION);
/* Instanzen die älter 100 Tage sind löschen */
CREATE TABLE TMP_ACT_RU_PROCINST AS
(SELECT ID_ AS InstanceId FROM ACT_HI_PROCINST WHERE START_TIME_ < (SYSDATE - 100) AND END_TIME_ IS NULL);
/* Alle laufenden Instanzen eines bestimmten Prozesses löschen */
CREATE TABLE TMP_ACT_RU_PROCINST AS
(SELECT ACT_HI_PROCINST.ID_ FROM ACT_RE_PROCDEF, ACT_HI_PROCINST
WHERE ACT_HI_PROCINST.PROC_DEF_ID_ = ACT_RE_PROCDEF.ID_
AND ACT_RE_PROCDEF.NAME_ = '...'
);
Mit Hilfe dieser temporären Tabelle können nun die Runtime-Informationen der Prozesse gelöscht werden.
laufende Prozess-Instanzen löschen
DELETE FROM ACT_HI_PROCINST WHERE ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
Laufzeit-Variablen löschen
CREATE TABLE TMP_ACT_RU_BYTEARRAY AS
(SELECT BYTEARRAY_ID_ FROM ACT_RU_VARIABLE
WHERE BYTEARRAY_ID_ IS NOT NULL AND PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST));
DELETE FROM ACT_RU_VARIABLE WHERE PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_GE_BYTEARRAY where ID_ IN
(SELECT BYTEARRAY_ID_ FROM TMP_ACT_RU_BYTEARRAY);
DROP TABLE TMP_ACT_RU_BYTEARRAY;
Offene Benutzer-Aktionen löschen
CREATE TABLE TMP_ACT_RU_TASK AS
(SELECT ID_ FROM ACT_RU_TASK WHERE PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST));
DELETE FROM ACT_RU_IDENTITYLINK WHERE PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_IDENTITYLINK WHERE TASK_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_TASK);
DELETE FROM ACT_RU_TASK WHERE PROC_INST_ID_ IN (SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DROP TABLE TMP_ACT_RU_TASK;
Offen Ausführungen löschen
DELETE FROM ACT_RU_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_TIMER_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_SUSPENDED_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_DEADLETTER_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EVENT_SUBSCR WHERE PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_INTEGRATION WHERE PROCESS_INSTANCE_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EXECUTION WHERE SUPER_EXEC_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EXECUTION WHERE PROC_INST_ID_ IN
(SELECT InstanceId FROM TMP_ACT_RU_PROCINST);
Temporäre Tabelle löschen
DROP TABLE TMP_ACT_RU_PROCINST;
Nun wurden alle Laufzeit-Informationen aus den Activiti-Tabellen für die vorher abgestimmte Selektion entfernt. Es gibt aber noch Daten in den History-Tabellen, die auch für die laufenden Instanzen gelten. Die Kopf-Daten aus der Tabelle ACT_HI_PROCINST
wurden gelöscht. Alle Fremdschlüssel-Beziehungen sind daher ungültig und müssen zusätzlich noch gelöscht werden. (Siehe 'Bereinigung abhängiger Daten')
Laufende Instanzen in MSSQL bereinigen
SELECT ACT_HI_PROCINST.ID_ INTO TMP_ACT_RU_PROCINST FROM ACT_RE_PROCDEF, ACT_HI_PROCINST
WHERE ACT_HI_PROCINST.PROC_DEF_ID_ = ACT_RE_PROCDEF.ID_
AND ACT_RE_PROCDEF.NAME_ = '...'
AND END_TIME_ IS NULL)
AND START_TIME_ < (GETDATE() - 1);
DELETE FROM ACT_HI_PROCINST WHERE ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
SELECT BYTEARRAY_ID_ INTO TMP_ACT_RU_BYTEARRAY FROM ACT_RU_VARIABLE
WHERE BYTEARRAY_ID_ IS NOT NULL AND PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_VARIABLE WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_GE_BYTEARRAY where ID_ IN
(SELECT BYTEARRAY_ID_ FROM TMP_ACT_RU_BYTEARRAY);
DROP TABLE TMP_ACT_RU_BYTEARRAY;
SELECT ID_ INTO TMP_ACT_RU_TASK FROM ACT_RU_TASK WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_IDENTITYLINK WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_IDENTITYLINK WHERE TASK_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_TASK);
DELETE FROM ACT_RU_TASK WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DROP TABLE TMP_ACT_RU_TASK;
DELETE FROM ACT_RU_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_TIMER_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_SUSPENDED_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_DEADLETTER_JOB WHERE PROCESS_INSTANCE_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EVENT_SUBSCR WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EXECUTION WHERE SUPER_EXEC_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DELETE FROM ACT_RU_EXECUTION WHERE PROC_INST_ID_ IN
(SELECT ID_ FROM TMP_ACT_RU_PROCINST);
DROP TABLE TMP_ACT_RU_PROCINST;
Historie für Prozesse löschen
Für jede abgeschlossene Prozessinstanz gibt es einen Eintrag in der Tabelle ACT_HI_PROCINST
. Bei sehr häufig laufenden Prozessen, können daher pro Tag mehrere hundert Einträge erzeugt werden. Diese Prozesse sind sehr oft Skriptprozesse, die im Hintergrund laufen und über CURSOR-CRM nicht ausgewertet werden. Diese Prozessinstanzen sollten über die Bereinigungsjobs jeden Tag aufgeräumt werden. Das folgende Statement kann auch mehrmals für verschiedene Prozesse mit anderen Zeitangaben (monatlich anstatt täglich) gestartet werden.
Abgeschlossene Prozessinstanzen löschen
DELETE FROM ACT_HI_PROCINST
WHERE END_TIME_ IS NOT NULL AND END_TIME_ < (SYSDATE - 1) /* für MSSQL (GETDATE() - 1) */
AND PROC_DEF_ID_ IN (SELECT pd.ID_ FROM ACT_RE_PROCDEF pd WHERE pd.NAME_ IN ('XXX')) /*'XXX' kann durch die IDs der Prozesse ersetzt werden */
Bereinigung abhängiger Daten
Wurde fehlerhafte laufende Prozessinstanzen und die Historie von Skriptprozessen gelöscht, so enthalten noch weitere Einträge Zusatzinformationen zu diesen Prozessinstanzen. Diese Statements können je nach Datenmenge mehrere Stunden benötigen.
Abhängige Daten bereinigen
/* Altdaten in Hisotry-Tabellen */
DELETE FROM ACT_GE_BYTEARRAY where ID_ IN
(SELECT BYTEARRAY_ID_ FROM ACT_HI_VARINST WHERE PROC_INST_ID_ NOT IN (SELECT ID_ FROM ACT_HI_PROCINST));
DELETE FROM ACT_HI_VARINST WHERE PROC_INST_ID_ NOT IN (SELECT ID_ FROM ACT_HI_PROCINST);
DELETE FROM ACT_HI_ACTINST WHERE PROC_INST_ID_ NOT IN (SELECT ID_ FROM ACT_HI_PROCINST);
DELETE FROM ACT_HI_IDENTITYLINK WHERE TASK_ID_ NOT IN (SELECT ID_ FROM ACT_HI_TASKINST);
DELETE FROM ACT_HI_TASKINST WHERE PROC_INST_ID_ NOT IN (SELECT ID_ FROM ACT_HI_PROCINST);
/* Altdaten in CRM-Tabellen */
DELETE FROM ProcessInstance WHERE Active = 0;
DELETE FROM ProcessInstance WHERE InstanceId NOT IN (SELECT ID_ FROM ACT_HI_PROCINST);
DELETE FROM ProcessWaitStat WHERE Active = 0;
DELETE FROM ProcessErrorLog WHERE Active = 0 OR ProcessInstance NOT IN (SELECT ID_ FROM ACT_HI_PROCINST);
Verkleinerung der Datenbank-Tabellen
Durch die vielen Löschungen der Tabellen sind diese unter ORACLE fragmentiert und die Datenbank-Dateien haben noch ihre ursprüngliche Größe von Teilweise mehren GB. Es ist ratsam alle Tabellen zu verkleinern, damit die Datenbank Performance wieder steigt.
ORACLE shrink-Befehle
/* BLOB Tabelle */
ALTER TABLE ACT_GE_BYTEARRAY enable row movement;
ALTER TABLE ACT_GE_BYTEARRAY shrink space cascade;
ALTER TABLE ACT_GE_BYTEARRAY disable row movement;
/* Falls es sich um ein 'secure file LOB' Segment handelt, muss ein anderes Statement zum Verkleinern genutzt werden: https://oracle-base.com/articles/misc/alter-table-shrink-space-online */
ALTER TABLE ACT_GE_BYTEARRAY MOVE LOB(BYTES_) STORE AS (TABLESPACE <used_table_space>)
/* Indices der Tabelle ACT_GE_BYTEARRAY müssen neu aufgebaut werden */
declare
v_cursor integer := DBMS_SQL.OPEN_CURSOR;
begin
for v_rec in ( select * from USER_INDEXES where index_type in ('NORMAL', 'FUNCTION-BASED NORMAL') and table_name = 'ACT_GE_BYTEARRAY' ) loop
DBMS_SQL.PARSE( v_cursor , 'ALTER INDEX '||v_rec.INDEX_NAME||' REBUILD ' , DBMS_SQL.NATIVE );
end loop;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
end;
/* Runtime Tabellen */
ALTER TABLE ACT_RU_VARIABLE enable row movement;
ALTER TABLE ACT_RU_VARIABLE shrink space cascade;
ALTER TABLE ACT_RU_VARIABLE disable row movement;
ALTER TABLE ACT_RU_JOB enable row movement;
ALTER TABLE ACT_RU_JOB shrink space cascade;
ALTER TABLE ACT_RU_JOB disable row movement;
ALTER TABLE ACT_RU_TIMER_JOB enable row movement;
ALTER TABLE ACT_RU_TIMER_JOB shrink space cascade;
ALTER TABLE ACT_RU_TIMER_JOB disable row movement;
ALTER TABLE ACT_RU_SUSPENDED_JOB enable row movement;
ALTER TABLE ACT_RU_SUSPENDED_JOB shrink space cascade;
ALTER TABLE ACT_RU_SUSPENDED_JOB disable row movement;
ALTER TABLE ACT_RU_DEADLETTER_JOB enable row movement;
ALTER TABLE ACT_RU_DEADLETTER_JOB shrink space cascade;
ALTER TABLE ACT_RU_DEADLETTER_JOB disable row movement;
ALTER TABLE ACT_RU_EVENT_SUBSCR enable row movement;
ALTER TABLE ACT_RU_EVENT_SUBSCR shrink space cascade;
ALTER TABLE ACT_RU_EVENT_SUBSCR disable row movement;
ALTER TABLE ACT_RU_IDENTITYLINK enable row movement;
ALTER TABLE ACT_RU_IDENTITYLINK shrink space cascade;
ALTER TABLE ACT_RU_IDENTITYLINK disable row movement;
ALTER TABLE ACT_RU_TASK enable row movement;
ALTER TABLE ACT_RU_TASK shrink space cascade;
ALTER TABLE ACT_RU_TASK disable row movement;
ALTER TABLE ACT_RU_EXECUTION enable row movement;
ALTER TABLE ACT_RU_EXECUTION shrink space cascade;
ALTER TABLE ACT_RU_EXECUTION disable row movement;
ALTER TABLE ACT_RU_INTEGRATION enable row movement;
ALTER TABLE ACT_RU_INTEGRATION shrink space cascade;
ALTER TABLE ACT_RU_INTEGRATION disable row movement;
/* History Tabellen */
ALTER TABLE ACT_HI_VARINST enable row movement;
ALTER TABLE ACT_HI_VARINST shrink space cascade;
ALTER TABLE ACT_HI_VARINST disable row movement;
ALTER TABLE ACT_HI_ACTINST enable row movement;
ALTER TABLE ACT_HI_ACTINST shrink space cascade;
ALTER TABLE ACT_HI_ACTINST disable row movement;
ALTER TABLE ACT_HI_IDENTITYLINK enable row movement;
ALTER TABLE ACT_HI_IDENTITYLINK shrink space cascade;
ALTER TABLE ACT_HI_IDENTITYLINK disable row movement;
ALTER TABLE ACT_HI_PROCINST enable row movement;
ALTER TABLE ACT_HI_PROCINST shrink space cascade;
ALTER TABLE ACT_HI_PROCINST disable row movement;
ALTER TABLE ACT_HI_TASKINST enable row movement;
ALTER TABLE ACT_HI_TASKINST shrink space cascade;
ALTER TABLE ACT_HI_TASKINST disable row movement;
/* CRM Tabellen */
ALTER TABLE ProcessInstance enable row movement;
ALTER TABLE ProcessInstance shrink space cascade;
ALTER TABLE ProcessInstance disable row movement;
ALTER TABLE ProcessWaitStat enable row movement;
ALTER TABLE ProcessWaitStat shrink space cascade;
ALTER TABLE ProcessWaitStat disable row movement;
ALTER TABLE ProcessErrorLog enable row movement;
ALTER TABLE ProcessErrorLog shrink space cascade;
ALTER TABLE ProcessErrorLog disable row movement;
Vollständige Bereinigung
Für die Bereinigungs-Statements muss der JBoss heruntergefahren werden, damit keine Prozesse zur selben Zeit arbeiten.
Vollständige Bereinigung unter ORACLE
/*** Produktiv- bzw. Test-System mit Sicherungen und Truncates bereinigen ***/
/*** Der JBoss muss heruntergefahren werden - LAufzeit ca 15-30min ***/
/*** Trennzeichen im SQL-Editor: ?%! ***/
/*** Ab hier das SQL-Skript in den SQL-Editor kopieren ***/
/* 01: constraints deaktivieren */
BEGIN
/* 1. constraint */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'C' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' DISABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
/* 2. foreign key */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'R' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' DISABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
/* 3. primary key */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'P' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' DISABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
END;
?%!
/* 02: Laufzeitdaten und History von 30 Tagen sichern */
CREATE TABLE TMPACT_HI_PROCINST_ID AS
(SELECT ID_ FROM ACT_HI_PROCINST WHERE END_TIME_ IS NULL) ?%!
INSERT INTO TMPACT_HI_PROCINST_ID (SELECT ID_ FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL AND END_TIME_ > (SYSDATE - 30)) ?%!
CREATE TABLE TMPACT_HI_PROCINST AS (SELECT * FROM ACT_HI_PROCINST WHERE ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_HI_ACTINST AS (SELECT * FROM ACT_HI_ACTINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_HI_TASKINST AS (SELECT * FROM ACT_HI_TASKINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_HI_IDENTITYLINK AS (SELECT * FROM ACT_HI_IDENTITYLINK WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_HI_VARINST AS (SELECT * FROM ACT_HI_VARINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_HI_DETAIL AS (SELECT * FROM ACT_HI_DETAIL WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_ACT_GE_BYTEARRAY_ID AS (SELECT ID_ FROM ACT_GE_BYTEARRAY WHERE DEPLOYMENT_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT BYTEARRAY_ID_ FROM ACT_RU_VARIABLE WHERE BYTEARRAY_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_TIMER_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_SUSPENDED_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_DEADLETTER_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL)?%!
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID (SELECT BYTEARRAY_ID_ FROM ACT_HI_VARINST WHERE BYTEARRAY_ID_ IS NOT NULL AND PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_GE_BYTEARRAY AS (SELECT * FROM ACT_GE_BYTEARRAY WHERE ID_ IN (SELECT ID_ FROM TMPACT_ACT_GE_BYTEARRAY_ID))?%!
CREATE TABLE TMPACT_ProcessInstance AS (SELECT * FROM ProcessInstance WHERE InstanceId IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_ProcessErrorLog AS (SELECT * FROM ProcessErrorLog WHERE ProcessInstance IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID))?%!
CREATE TABLE TMPACT_ProcessWaitStat AS (SELECT * FROM ProcessWaitStat WHERE InternalProcessId IN (SELECT ID_ FROM ACT_RU_EXECUTION))?%!
DROP TABLE TMPACT_ACT_GE_BYTEARRAY_ID?%!
DROP TABLE TMPACT_HI_PROCINST_ID?%!
/* 03: Tabelle leeren */
TRUNCATE TABLE ACT_HI_PROCINST?%!
TRUNCATE TABLE ACT_HI_ACTINST?%!
TRUNCATE TABLE ACT_HI_TASKINST?%!
TRUNCATE TABLE ACT_HI_IDENTITYLINK?%!
TRUNCATE TABLE ACT_HI_VARINST?%!
TRUNCATE TABLE ACT_HI_DETAIL?%!
TRUNCATE TABLE ACT_GE_BYTEARRAY?%!
TRUNCATE TABLE ProcessInstance?%!
TRUNCATE TABLE ProcessErrorLog?%!
TRUNCATE TABLE ProcessWaitStat?%!
/* 04: gültige Daten zurückspielen */
INSERT INTO ACT_HI_PROCINST (select * from TMPACT_HI_PROCINST)?%!
INSERT INTO ACT_HI_ACTINST (select * from TMPACT_HI_ACTINST)?%!
INSERT INTO ACT_HI_TASKINST (select * from TMPACT_HI_TASKINST)?%!
INSERT INTO ACT_HI_IDENTITYLINK (select * from TMPACT_HI_IDENTITYLINK)?%!
INSERT INTO ACT_HI_VARINST (select * from TMPACT_HI_VARINST)?%!
INSERT INTO ACT_HI_DETAIL (select * from TMPACT_HI_DETAIL)?%!
INSERT INTO ACT_GE_BYTEARRAY (select * from TMPACT_GE_BYTEARRAY)?%!
INSERT INTO ProcessInstance (select * from TMPACT_ProcessInstance)?%!
INSERT INTO ProcessErrorLog (select * from TMPACT_ProcessErrorLog)?%!
INSERT INTO ProcessWaitStat (select * from TMPACT_ProcessWaitStat)?%!
/* 05: Tmp Tabellen löschen */
DROP TABLE TMPACT_HI_PROCINST?%!
DROP TABLE TMPACT_HI_ACTINST?%!
DROP TABLE TMPACT_HI_TASKINST?%!
DROP TABLE TMPACT_HI_IDENTITYLINK?%!
DROP TABLE TMPACT_HI_VARINST?%!
DROP TABLE TMPACT_HI_DETAIL?%!
DROP TABLE TMPACT_GE_BYTEARRAY?%!
DROP TABLE TMPACT_ProcessInstance?%!
DROP TABLE TMPACT_ProcessErrorLog?%!
DROP TABLE TMPACT_ProcessWaitStat?%!
/* 06: constraints aktivieren */
BEGIN
/* 1. primary key */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'P' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' ENABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
/* 2. foreign key */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'R' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' ENABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
/* 3. constraint */
FOR v_rec IN (
SELECT * FROM User_Constraints WHERE Constraint_Type = 'C' AND Table_Name IN
('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||v_rec.Table_name||' ENABLE CONSTRAINT '||v_rec.constraint_name;
END LOOP;
END;
?%!
Vollständige Bereinigung unter MSSQL
/*** Produktiv-System mit Sicherungen und Truncates bereinigen ***/
/*** Trennzeichen im SQL-Editor: ; ***/
/*** Ab hier das SQL-Skript in den SQL-Editor kopieren ***/
/* 01: constraints deaktivieren */
/* Dieses Statement manuell ausführen und dann Ergebniszeilen als Skript ausführen */
SELECT 'ALTER TABLE ' + Table_name + ' NOCHECK CONSTRAINT ' + constraint_name + ';'
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE Table_Name IN ('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
AND CONSTRAINT_TYPE in ('FOREIGN KEY')
/* 02: Laufzeitdaten und History von 10 Tagen sichern */
SELECT ID_ INTO TMPACT_HI_PROCINST_ID FROM ACT_HI_PROCINST WHERE END_TIME_ IS NULL;
INSERT INTO TMPACT_HI_PROCINST_ID SELECT ID_ FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL AND END_TIME_ > (GETDATE() - 10) ;
SELECT * INTO TMPACT_HI_PROCINST FROM ACT_HI_PROCINST WHERE ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_HI_ACTINST FROM ACT_HI_ACTINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_HI_TASKINST FROM ACT_HI_TASKINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_HI_IDENTITYLINK FROM ACT_HI_IDENTITYLINK WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_HI_VARINST FROM ACT_HI_VARINST WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_HI_DETAIL FROM ACT_HI_DETAIL WHERE PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT ID_ INTO TMPACT_ACT_GE_BYTEARRAY_ID FROM ACT_GE_BYTEARRAY WHERE DEPLOYMENT_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT BYTEARRAY_ID_ FROM ACT_RU_VARIABLE WHERE BYTEARRAY_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_TIMER_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_SUSPENDED_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT EXCEPTION_STACK_ID_ FROM ACT_RU_DEADLETTER_JOB WHERE EXCEPTION_STACK_ID_ IS NOT NULL;
INSERT INTO TMPACT_ACT_GE_BYTEARRAY_ID SELECT BYTEARRAY_ID_ FROM ACT_HI_VARINST WHERE BYTEARRAY_ID_ IS NOT NULL AND PROC_INST_ID_ IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_GE_BYTEARRAY FROM ACT_GE_BYTEARRAY WHERE ID_ IN (SELECT ID_ FROM TMPACT_ACT_GE_BYTEARRAY_ID);
SELECT * INTO TMPACT_ProcessInstance FROM ProcessInstance WHERE InstanceId IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_ProcessErrorLog FROM ProcessErrorLog WHERE ProcessInstance IN (SELECT ID_ FROM TMPACT_HI_PROCINST_ID);
SELECT * INTO TMPACT_ProcessWaitStat FROM ProcessWaitStat WHERE InternalProcessId IN (SELECT ID_ FROM ACT_RU_EXECUTION);
DROP TABLE TMPACT_ACT_GE_BYTEARRAY_ID;
DROP TABLE TMPACT_HI_PROCINST_ID;
/* 03: constraints löschen */
ALTER TABLE ACT_RU_JOB DROP CONSTRAINT ACT_FK_JOB_EXCEPTION
ALTER TABLE ACT_RU_TIMER_JOB DROP CONSTRAINT ACT_FK_TIMER_JOB_EXCEPTION
ALTER TABLE ACT_RU_SUSPENDED_JOB DROP CONSTRAINT ACT_FK_SUSPENDED_JOB_EXCEPTION
ALTER TABLE ACT_RU_DEADLETTER_JOB DROP CONSTRAINT ACT_FK_DEADLETTER_JOB_EXCEPTION
ALTER TABLE ACT_RU_VARIABLE DROP CONSTRAINT ACT_FK_VAR_BYTEARRAY
ALTER TABLE ACT_RE_MODEL DROP CONSTRAINT ACT_FK_MODEL_SOURCE
ALTER TABLE ACT_RE_MODEL DROP CONSTRAINT ACT_FK_MODEL_SOURCE_EXTRA
ALTER TABLE ACT_PROCDEF_INFO DROP CONSTRAINT ACT_FK_INFO_JSON_BA;
ALTER TABLE ACT_GE_BYTEARRAY DROP CONSTRAINT ID_ACT_GE_BYTEARRAY
--Für ältere Versionen: Hier muss geprüft werden, welcher Name wirklich vergeben worden ist, da das Suffix generiert ist.
--ALTER TABLE ACT_GE_BYTEARRAY DROP CONSTRAINT PK__ACT_GE_B__XXXX
/* 04: Tabelle leeren */
TRUNCATE TABLE ACT_HI_PROCINST;
TRUNCATE TABLE ACT_HI_ACTINST;
TRUNCATE TABLE ACT_HI_TASKINST;
TRUNCATE TABLE ACT_HI_IDENTITYLINK;
TRUNCATE TABLE ACT_HI_VARINST;
TRUNCATE TABLE ACT_HI_DETAIL;
TRUNCATE TABLE ACT_GE_BYTEARRAY;
TRUNCATE TABLE ProcessInstance;
TRUNCATE TABLE ProcessErrorLog;
TRUNCATE TABLE ProcessWaitStat;
/* 05: gültige Daten zurückspielen */
INSERT INTO ACT_HI_PROCINST select * from TMPACT_HI_PROCINST;
INSERT INTO ACT_HI_ACTINST select * from TMPACT_HI_ACTINST;
INSERT INTO ACT_HI_TASKINST select * from TMPACT_HI_TASKINST;
INSERT INTO ACT_HI_IDENTITYLINK select * from TMPACT_HI_IDENTITYLINK;
INSERT INTO ACT_HI_VARINST select * from TMPACT_HI_VARINST;
INSERT INTO ACT_HI_DETAIL select * from TMPACT_HI_DETAIL;
INSERT INTO ACT_GE_BYTEARRAY select * from TMPACT_GE_BYTEARRAY;
INSERT INTO ProcessInstance select * from TMPACT_ProcessInstance;
INSERT INTO ProcessErrorLog select * from TMPACT_ProcessErrorLog;
INSERT INTO ProcessWaitStat select * from TMPACT_ProcessWaitStat;
/* 06: Tmp Tabellen löschen */
DROP TABLE TMPACT_HI_PROCINST;
DROP TABLE TMPACT_HI_ACTINST;
DROP TABLE TMPACT_HI_TASKINST;
DROP TABLE TMPACT_HI_IDENTITYLINK;
DROP TABLE TMPACT_HI_VARINST;
DROP TABLE TMPACT_HI_DETAIL;
DROP TABLE TMPACT_GE_BYTEARRAY;
DROP TABLE TMPACT_ProcessInstance;
DROP TABLE TMPACT_ProcessErrorLog;
DROP TABLE TMPACT_ProcessWaitStat;
/* 07: constraints erstellen */
ALTER TABLE [dbo].[ACT_GE_BYTEARRAY] ADD CONSTRAINT [ID_ACT_GE_BYTEARRAY] PRIMARY KEY CLUSTERED ( [ID_] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY];
ALTER TABLE [dbo].[ACT_RU_JOB] WITH NOCHECK ADD CONSTRAINT [ACT_FK_JOB_EXCEPTION] FOREIGN KEY([EXCEPTION_STACK_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RU_TIMER_JOB] WITH NOCHECK ADD CONSTRAINT [ACT_FK_TIMER_JOB_EXCEPTION] FOREIGN KEY([EXCEPTION_STACK_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RU_SUSPENDED_JOB] WITH NOCHECK ADD CONSTRAINT [ACT_FK_SUSPENDED_JOB_EXCEPTION] FOREIGN KEY([EXCEPTION_STACK_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RU_DEADLETTER_JOB] WITH NOCHECK ADD CONSTRAINT [ACT_FK_DEADLETTER_JOB_EXCEPTION] FOREIGN KEY([EXCEPTION_STACK_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RU_VARIABLE] WITH NOCHECK ADD CONSTRAINT [ACT_FK_VAR_BYTEARRAY] FOREIGN KEY([BYTEARRAY_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RE_MODEL] WITH NOCHECK ADD CONSTRAINT [ACT_FK_MODEL_SOURCE] FOREIGN KEY([EDITOR_SOURCE_VALUE_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RE_MODEL] WITH NOCHECK ADD CONSTRAINT [ACT_FK_MODEL_SOURCE_EXTRA] FOREIGN KEY([EDITOR_SOURCE_EXTRA_VALUE_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_PROCDEF_INFO] WITH NOCHECK ADD CONSTRAINT [ACT_FK_INFO_JSON_BA] FOREIGN KEY([INFO_JSON_ID_])
REFERENCES [dbo].[ACT_GE_BYTEARRAY] ([ID_]);
ALTER TABLE [dbo].[ACT_RU_JOB] NOCHECK CONSTRAINT [ACT_FK_JOB_EXCEPTION];
ALTER TABLE [dbo].[ACT_RU_TIMER_JOB] NOCHECK CONSTRAINT [ACT_FK_TIMER_JOB_EXCEPTION];
ALTER TABLE [dbo].[ACT_RU_SUSPENDED_JOB] NOCHECK CONSTRAINT [ACT_FK_SUSPENDED_JOB_EXCEPTION];
ALTER TABLE [dbo].[ACT_RU_DEADLETTER_JOB] NOCHECK CONSTRAINT [ACT_FK_DEADLETTER_JOB_EXCEPTION];
ALTER TABLE [dbo].[ACT_RU_VARIABLE] NOCHECK CONSTRAINT [ACT_FK_VAR_BYTEARRAY];
ALTER TABLE [dbo].[ACT_RE_MODEL] NOCHECK CONSTRAINT [ACT_FK_MODEL_SOURCE];
ALTER TABLE [dbo].[ACT_RE_MODEL] NOCHECK CONSTRAINT [ACT_FK_MODEL_SOURCE_EXTRA];
ALTER TABLE [dbo].[ACT_PROCDEF_INFO] NOCHECK CONSTRAINT [ACT_FK_INFO_JSON_BA];
/* 08: constraints aktivieren */
/* Dieses Statement manuell ausführen und dann Ergebniszeilen als Skript ausführen */
SELECT 'ALTER TABLE ' + Table_name + ' CHECK CONSTRAINT ' + constraint_name + ';'
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE Table_Name IN ('ACT_GE_BYTEARRAY','ACT_RE_DEPLOYMENT','ACT_RE_MODEL','ACT_RU_EXECUTION','ACT_RU_JOB','ACT_RU_TIMER_JOB','ACT_RU_SUSPENDED_JOB','ACT_RU_DEADLETTER_JOB','ACT_RE_PROCDEF','ACT_RU_TASK','ACT_RU_IDENTITYLINK','ACT_RU_VARIABLE','ACT_RU_EVENT_SUBSCR','ACT_EVT_LOG','ACT_PROCDEF_INFO','ACT_RU_INTEGRATION')
AND CONSTRAINT_TYPE in ('FOREIGN KEY');