Closed kbevers closed 2 months ago
Ændringer, inklusiv oprydning i dubletter, er rullet ud på FIRETEST. Følgende SQL er afviklet:
-- tilføj fejlmeldt kolonne til observation
ALTER TABLE observation ADD fejlmeldt VARCHAR2(5);
COMMENT ON COLUMN observation.fejlmeldt IS 'Markering af at en observation er udgået fordi den er fejlbehæftet';
-- fyld `fejlmeldt` op
UPDATE observation SET fejlmeldt = 'false';
-- sæt `NOT NULL` constraint på observation.fejlmeldt
ALTER TABLE observation MODIFY fejlmeldt VARCHAR(5) NOT NULL;
-- tillad kun 'true' og 'false' som indhold i observation.fejlmeldt
ALTER TABLE
observation
ADD
CONSTRAINT observation_fejlmeldt CHECK (fejlmeldt IN ('true', 'false'));
-- opdater trigger der sikrer korrekt input ved opdateringer
CREATE OR REPLACE TRIGGER observation_au_trg
AFTER UPDATE ON observation
FOR EACH ROW
BEGIN
IF :new.objektid != :old.objektid THEN
RAISE_APPLICATION_ERROR(-20000,'observation.objektid må ikke opdateres ');
END IF;
IF :new.registreringfra != :old.registreringfra THEN
RAISE_APPLICATION_ERROR(-20000,'observation.registreringfra må ikke opdateres ');
END IF;
IF :new.antal != :old.antal THEN
RAISE_APPLICATION_ERROR(-20000,'observation.antal må ikke opdateres ');
END IF;
IF :new.gruppe != :old.gruppe THEN
RAISE_APPLICATION_ERROR(-20000,'observation.gruppe må ikke opdateres ');
END IF;
IF :new.observationstypeid != :old.observationstypeid THEN
RAISE_APPLICATION_ERROR(-20000,'observation.observationstypeid må ikke opdateres ');
END IF;
IF :new.value1 != :old.value1 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value1 må ikke opdateres ');
END IF;
IF :new.value2 != :old.value2 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value2 må ikke opdateres ');
END IF;
IF :new.value3 != :old.value3 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value3 må ikke opdateres ');
END IF;
IF :new.value4 != :old.value4 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value4 må ikke opdateres ');
END IF;
IF :new.value5 != :old.value5 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value5 må ikke opdateres ');
END IF;
IF :new.value6 != :old.value6 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value6 må ikke opdateres ');
END IF;
IF :new.value7 != :old.value7 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value7 må ikke opdateres ');
END IF;
IF :new.value8 != :old.value8 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value8 må ikke opdateres ');
END IF;
IF :new.value9 != :old.value9 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value9 må ikke opdateres ');
END IF;
IF :new.value10 != :old.value10 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value10 må ikke opdateres ');
END IF;
IF :new.value11 != :old.value11 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value11 må ikke opdateres ');
END IF;
IF :new.value12 != :old.value12 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value12 må ikke opdateres ');
END IF;
IF :new.value13 != :old.value13 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value13 må ikke opdateres ');
END IF;
IF :new.value14 != :old.value14 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value14 må ikke opdateres ');
END IF;
IF :new.value15 != :old.value15 THEN
RAISE_APPLICATION_ERROR(-20000,'observation.value15 må ikke opdateres ');
END IF;
IF :new.sagseventfraid != :old.sagseventfraid THEN
RAISE_APPLICATION_ERROR(-20000,'observation.sagseventfraid må ikke opdateres ');
END IF;
IF :new.opstillingspunktid != :old.opstillingspunktid THEN
RAISE_APPLICATION_ERROR(-20000,'observation.opstillingspunktid må ikke opdateres ');
END IF;
IF :new.sigtepunktid != :old.sigtepunktid THEN
RAISE_APPLICATION_ERROR(-20000,'observation.sigtepunktid må ikke opdateres ');
END IF;
IF :new.fejlmeldt != :old.fejlmeldt AND :new.registreringtil IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Registreringtil skal sættes når en observation fejlmeldes');
END IF;
END;
/
-- Sagshåndtering ifm observationsdubletter
INSERT INTO sag (
id,
registreringfra
) VALUES (
'ab91c2df-475e-4fb7-b092-80e3198ec877',
sysdate
);
INSERT INTO sagsinfo (
aktiv,
registreringfra,
registreringtil,
journalnummer,
behandler,
beskrivelse,
sagsid
) VALUES (
'true',
sysdate,
null,
null,
'Kristian Evers',
'Fejlmelding og afregistrering af observationer der findes i to eller flere eksakte kopier',
'ab91c2df-475e-4fb7-b092-80e3198ec877'
);
-- kommentar vedrørende sagens natur
INSERT INTO sagsevent (
id,
registreringfra,
eventtypeid,
sagsid
) VALUES (
'625befd0-36cd-46d5-a467-79d9542cdcab',
sysdate,
9, -- kommentar
'ab91c2df-475e-4fb7-b092-80e3198ec877'
);
INSERT INTO sagseventinfo (
REGISTRERINGFRA,
REGISTRERINGTIL,
BESKRIVELSE,
SAGSEVENTID
) VALUES (
sysdate,
null,
'Oprydning i observationsdubletter. Der er identificiret omkring 1000 observation som er registreret i databasen 2 eller flere gange. For at rydde op i dette er følgende udtryk afviklet:
UPDATE observation
SET
-- da der i flere tilfælde er 3 eller flere rækker med samme observationer tilføjes en tilfældig, ubetydelig
-- ændring på observationsværdien med henblik på at gøre alle afregistrerede dubletter unikke
value1 = value1 + dbms_random.value * 0.000001,
registreringtil=registreringfra,
fejlmeldt = ''true'',
sagseventtilid = ''3c51d4a7-771f-41e7-9d64-b5505aeb764b''
WHERE rowid NOT IN (
-- første duplet (dem vi ikke vil ændre på)
SELECT MIN(rowid)
FROM observation
GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
)
-- alle rækker med dupletter
AND (observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid) IN (
-- find duplet-værdier
SELECT observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
FROM observation
GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid HAVING count(*) > 1
);
Formålet med oprydningen i dubletterne er at bane vejen for et unikt index, der fremadrettet forhindrer muligheden for at dobbeltregistrere samme observation.
Forud for opdateringen er datamodellen udvidet med feltet "fejlmeldt" på observationstabellen.',
'625befd0-36cd-46d5-a467-79d9542cdcab'
);
-- nedlægnig af observationer
INSERT INTO sagsevent (
id,
registreringfra,
eventtypeid,
sagsid
) VALUES (
'3c51d4a7-771f-41e7-9d64-b5505aeb764b',
sysdate,
4, -- observation_nedlagt
'ab91c2df-475e-4fb7-b092-80e3198ec877'
);
INSERT INTO sagseventinfo (
REGISTRERINGFRA,
REGISTRERINGTIL,
BESKRIVELSE,
SAGSEVENTID
) VALUES (
sysdate,
null,
'Observationsdubletter afregistreret og fejlmeldt. Se sagsevent 625befd0-36cd-46d5-a467-79d9542cdcab for yderligere information.',
'3c51d4a7-771f-41e7-9d64-b5505aeb764b'
);
CREATE TABLE observationbackup_20240411 AS SELECT * FROM observation;
-- slå sikkerhedsforanstaltninger fra
ALTER TRIGGER observation_au_trg DISABLE;
UPDATE observation
SET
-- da der i flere tilfælde der 3 eller flere rækker med samme observationer tilføjes en tilfældig, ubetydelig
-- ændring på observationsværdien med henblik på at gøre alle afregistrerede dubletter unikke
value1 = value1 + dbms_random.value * 0.000001,
registreringtil=registreringfra,
fejlmeldt = 'true',
sagseventtilid = '3c51d4a7-771f-41e7-9d64-b5505aeb764b'
WHERE rowid NOT IN (
-- første duplet (dem vi ikke vil ændre på)
SELECT MIN(rowid)
FROM observation
GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
)
-- alle rækker med dupletter
AND (observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid) IN (
-- find duplet-værdier
SELECT observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
FROM observation
GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid HAVING count(*) > 1
)
;
-- genindfør sikkerhedsforanstaltninger
ALTER TRIGGER observation_au_trg ENABLE;
-- luk sag
INSERT INTO sagsinfo(aktiv, registreringfra, behandler, sagsid) VALUES ('false', sysdate, 'Kristian Evers', 'ab91c2df-475e-4fb7-b092-80e3198ec877');
-- slå unikt index til
CREATE UNIQUE INDEX observation_uniq2_idx ON observation (
observationstypeid,
value1,
antal,
gruppe,
observationstidspunkt,
opstillingspunktid,
sigtepunktid,
fejlmeldt
);
Samme smøre køres på FIREPROD når det er konstateret at der ikke sker fejl i overførsel til Databanken.
Samme smøre køres på FIREPROD når det er konstateret at der ikke sker fejl i overførsel til Databanken.
Nu også gjort på FIREPROD
Fejlbehæftede observationer er konstateret i databasen. Dette pull request tilføjer funktionalitet til at fejlmelde dem, samt en tilføjelse af et unikt index på observationstabellen der forhindrer indsættelse af observationsdubletter.
En observation kan fejlmeldes med kommandoen![billede](https://github.com/SDFIdk/FIRE/assets/13132571/4b2d7014-bc9f-4261-b4ed-9e113c28a868)
fire luk observation
som set i eksemplet herunder:Efterfølgende vil denne observation fremgå som fjernet når den vises med![billede](https://github.com/SDFIdk/FIRE/assets/13132571/0756d03e-3393-4dcc-8ec9-7e594017154f)
fire info punkt
: