Add UniquenessHelpers as database helper
What does this MR do and why?
This new helper allows us to ensure uniqueness ids across several partitions by preventing users from updating the id of a given resource.
How to use it?
# frozen_string_literal: true
class EnsureUniquessForCiRunnerManagerBuild < Gitlab::Database::Migration[2.2]
include Gitlab::Database::PartitioningMigrationHelpers::UniquenessHelpers
milestone '16.7'
TABLE_NAME = :p_ci_runner_machine_builds
TRIGGER_NAME = "assign_#{TABLE_NAME}_id_trigger"
def up
ensure_unique_id(TABLE_NAME, TRIGGER_NAME)
end
def down
drop_trigger(TABLE_NAME, TRIGGER_NAME, if_exists: true)
drop_function("assign_#{TABLE_NAME}_id_value", if_exists: true)
end
end
$ rails db:migrate:ci
ci: == [advisory_lock_connection] object_id: 182040, pg_backend_pid: 57095
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: migrating ============
ci: -- current_schema(nil)
ci: -> 0.0011s
ci: -- change_column_default(:p_ci_runner_machine_builds, :build_id, nil)
ci: -> 0.0025s
ci: -- execute("CREATE OR REPLACE FUNCTION assign_p_ci_runner_machine_builds_id_value()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF NEW.\"id\" IS NOT NULL THEN\n RAISE WARNING 'Manually assigning ids is not allowed, the value will be ignored';\nEND IF;\nNEW.\"id\" := nextval('ci_runner_machine_builds_id_seq'::regclass);\nRETURN NEW;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
ci: -> 0.0012s
ci: -- execute("CREATE TRIGGER assign_p_ci_runner_machine_builds_id_trigger\nBEFORE INSERT ON p_ci_runner_machine_builds\nFOR EACH ROW\n\nEXECUTE FUNCTION assign_p_ci_runner_machine_builds_id_value()\n")
ci: -> 0.0006s
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: migrated (0.1095s) ===
ci: == [advisory_lock_connection] object_id: 182040, pg_backend_pid: 57095
$ rails db:rollback:ci
ci: == [advisory_lock_connection] object_id: 182740, pg_backend_pid: 57423
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: reverting ============
ci: -- execute("DROP TRIGGER IF EXISTS assign_p_ci_runner_machine_builds_id_trigger ON p_ci_runner_machine_builds")
ci: -> 0.0015s
ci: -- execute("DROP FUNCTION IF EXISTS assign_p_ci_runner_machine_builds_id_value()")
ci: -> 0.0008s
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: reverted (0.0142s) ===
ci: == [advisory_lock_connection] object_id: 182740, pg_backend_pid: 57423
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Max Orefice