epic-s6ts
[kivitendo-erp.git] / sql / Pg-upgrade2 / requirement_spec_delete_trigger_fix2.sql
1 -- @tag: requirement_spec_delete_trigger_fix2
2 -- @description: Fixes für Delete-Trigger bei Pflichtenheften
3 -- @depends: requirement_spec_delete_trigger_fix
4
5 -- requirement_spec_id: link to requirement specs (the versioned
6 -- document) working_copy_id: link to requirement spec working copy
7 -- (only set if working copy is currently at a version level)
8 ALTER TABLE requirement_spec_versions ADD COLUMN requirement_spec_id INTEGER;
9 ALTER TABLE requirement_spec_versions ADD COLUMN working_copy_id     INTEGER;
10
11 UPDATE requirement_spec_versions ver
12 SET requirement_spec_id = (
13   SELECT MAX(rs.id)
14   FROM requirement_specs rs
15   WHERE rs.version_id = ver.id
16 );
17
18 UPDATE requirement_spec_versions ver
19 SET working_copy_id = (
20   SELECT rs.id
21   FROM requirement_specs rs
22   WHERE (rs.version_id = ver.id)
23     AND (rs.working_copy_id IS NULL)
24 );
25
26 ALTER TABLE requirement_spec_versions ALTER COLUMN requirement_spec_id SET NOT NULL;
27 ALTER TABLE requirement_spec_versions ADD FOREIGN KEY (requirement_spec_id) REFERENCES requirement_specs (id) ON DELETE CASCADE;
28 ALTER TABLE requirement_spec_versions ADD FOREIGN KEY (working_copy_id)     REFERENCES requirement_specs (id) ON DELETE CASCADE;
29
30 ALTER TABLE requirement_specs DROP COLUMN version_id;
31 ALTER TABLE requirement_specs DROP CONSTRAINT requirement_specs_working_copy_id_fkey;
32 ALTER TABLE requirement_specs ADD FOREIGN KEY (working_copy_id) REFERENCES requirement_specs (id) ON DELETE CASCADE;
33
34 ALTER TABLE requirement_spec_items DROP CONSTRAINT requirement_spec_items_requirement_spec_id_fkey;
35 ALTER TABLE requirement_spec_items ADD FOREIGN KEY (requirement_spec_id) REFERENCES requirement_specs (id) ON DELETE CASCADE;
36
37 ALTER TABLE requirement_spec_item_dependencies DROP CONSTRAINT requirement_spec_item_dependencies_depended_item_id_fkey;
38 ALTER TABLE requirement_spec_item_dependencies ADD FOREIGN KEY (depended_item_id) REFERENCES requirement_spec_items (id) ON DELETE CASCADE;
39 ALTER TABLE requirement_spec_item_dependencies DROP CONSTRAINT requirement_spec_item_dependencies_depending_item_id_fkey;
40 ALTER TABLE requirement_spec_item_dependencies ADD FOREIGN KEY (depending_item_id) REFERENCES requirement_spec_items (id) ON DELETE CASCADE;
41
42 ALTER TABLE requirement_spec_text_blocks DROP CONSTRAINT requirement_spec_text_blocks_requirement_spec_id_fkey;
43 ALTER TABLE requirement_spec_text_blocks ADD FOREIGN KEY (requirement_spec_id) REFERENCES requirement_specs (id) ON DELETE CASCADE;
44
45 -- Trigger for deleting depending stuff if a requirement spec is deleted.
46 CREATE OR REPLACE FUNCTION requirement_spec_delete_trigger() RETURNS trigger AS $$
47   BEGIN
48     IF TG_WHEN = 'AFTER' THEN
49       DELETE FROM trigger_information WHERE (key = 'deleting_requirement_spec') AND (value = CAST(OLD.id AS TEXT));
50
51       RETURN OLD;
52     END IF;
53
54     RAISE DEBUG 'before delete trigger on %', OLD.id;
55
56     INSERT INTO trigger_information (key, value) VALUES ('deleting_requirement_spec', CAST(OLD.id AS TEXT));
57
58     RAISE DEBUG '  Converting items into sections items for %', OLD.id;
59     UPDATE requirement_spec_items SET item_type  = 'section', parent_id = NULL WHERE requirement_spec_id = OLD.id;
60
61     RAISE DEBUG '  And we out for %', OLD.id;
62
63     RETURN OLD;
64   END;
65 $$ LANGUAGE plpgsql;
66
67 -- Trigger for deleting depending stuff if a requirement spec item is deleted.
68 CREATE OR REPLACE FUNCTION requirement_spec_item_before_delete_trigger() RETURNS trigger AS $$
69   BEGIN
70     RAISE DEBUG 'delete trig RSitem old id %', OLD.id;
71     INSERT INTO trigger_information (key, value) VALUES ('deleting_requirement_spec_item', CAST(OLD.id AS TEXT));
72     DELETE FROM requirement_spec_items WHERE (parent_id         = OLD.id);
73     DELETE FROM trigger_information    WHERE (key = 'deleting_requirement_spec_item') AND (value = CAST(OLD.id AS TEXT));
74     RAISE DEBUG 'delete trig END %', OLD.id;
75     RETURN OLD;
76   END;
77 $$ LANGUAGE plpgsql;