Skip to content

Draft: Validate work_item_type_id is NOT NULL for new issue records

What does this MR do and why?

We need to make sure no issues are created without associating them with a work item type first. We will validate the constraint after backfilling existing records

Changelog: other

Related to #338003 (closed)

DB Migration Output

UP

$ bin/rails db:migrate                                                                                                                                                             main: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: migrating ===========
main: -- execute("CREATE OR REPLACE FUNCTION check_work_item_type_presence_on_issue_insert()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF NEW.work_item_type_id IS NULL THEN\n  RAISE EXCEPTION 'New issue records require a work_item_type_id to be provided.';\nEND IF;\n\nRETURN NEW;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
main:    -> 0.0050s
main: -- execute("CREATE TRIGGER trigger_insert_issue_work_item_check\nBEFORE INSERT ON issues\nFOR EACH ROW\n\nEXECUTE FUNCTION check_work_item_type_presence_on_issue_insert()\n")
main:    -> 0.0016s
main: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: migrated (0.0075s) ==

ci: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: migrating ===========
ci: -- execute("CREATE OR REPLACE FUNCTION check_work_item_type_presence_on_issue_insert()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF NEW.work_item_type_id IS NULL THEN\n  RAISE EXCEPTION 'New issue records require a work_item_type_id to be provided.';\nEND IF;\n\nRETURN NEW;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
ci:    -> 0.0028s
ci: -- execute("CREATE TRIGGER trigger_insert_issue_work_item_check\nBEFORE INSERT ON issues\nFOR EACH ROW\n\nEXECUTE FUNCTION check_work_item_type_presence_on_issue_insert()\n")
ci:    -> 0.0012s
ci: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: migrated (0.0042s) ==

DOWN

$ bin/rails db:rollback:main
main: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: reverting ===========
main: -- execute("DROP TRIGGER IF EXISTS trigger_insert_issue_work_item_check ON issues")
main:    -> 0.0025s
main: -- execute("DROP FUNCTION IF EXISTS check_work_item_type_presence_on_issue_insert()")
main:    -> 0.0006s
main: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: reverted (0.0040s) ==

bin/rails db:rollback:ci                                                                                                                                                             ci: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: reverting ===========
ci: -- execute("DROP TRIGGER IF EXISTS trigger_insert_issue_work_item_check ON issues")
ci:    -> 0.0026s
ci: -- execute("DROP FUNCTION IF EXISTS check_work_item_type_presence_on_issue_insert()")
ci:    -> 0.0006s
ci: == 20220701114503 AddIssueInsertCheckWorkItemTypeTrigger: reverted (0.0042s) ==

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Mario Celi

Merge request reports