diff --git a/db/post_migrate/20240604111157_add_approval_policy_rules_fk_on_approval_group_rules.rb b/db/post_migrate/20240604111157_add_approval_policy_rules_fk_on_approval_group_rules.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2f7721ae7abe94e491025747065fef5ee4ed7066
--- /dev/null
+++ b/db/post_migrate/20240604111157_add_approval_policy_rules_fk_on_approval_group_rules.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalPolicyRulesFkOnApprovalGroupRules < Gitlab::Database::Migration[2.2]
+  milestone '17.2'
+  disable_ddl_transaction!
+
+  INDEX_NAME = 'index_approval_group_rules_on_approval_policy_rule_id'
+
+  def up
+    add_concurrent_index :approval_group_rules, :approval_policy_rule_id, name: INDEX_NAME
+    add_concurrent_foreign_key :approval_group_rules, :approval_policy_rules,
+      column: :approval_policy_rule_id,
+      on_delete: :cascade
+  end
+
+  def down
+    remove_foreign_key_if_exists :approval_group_rules, column: :approval_policy_rule_id
+    remove_concurrent_index_by_name :approval_group_rules, INDEX_NAME
+  end
+end
diff --git a/db/post_migrate/20240604111324_add_approval_policy_rules_fk_on_approval_project_rules.rb b/db/post_migrate/20240604111324_add_approval_policy_rules_fk_on_approval_project_rules.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f9ecaad4d905592ed578565a475112cbc87a428f
--- /dev/null
+++ b/db/post_migrate/20240604111324_add_approval_policy_rules_fk_on_approval_project_rules.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalPolicyRulesFkOnApprovalProjectRules < Gitlab::Database::Migration[2.2]
+  milestone '17.2'
+  disable_ddl_transaction!
+
+  INDEX_NAME = 'index_approval_project_rules_on_approval_policy_rule_id'
+
+  def up
+    add_concurrent_index :approval_project_rules, :approval_policy_rule_id, name: INDEX_NAME
+    add_concurrent_foreign_key :approval_project_rules, :approval_policy_rules,
+      column: :approval_policy_rule_id,
+      on_delete: :cascade
+  end
+
+  def down
+    remove_foreign_key_if_exists :approval_project_rules, column: :approval_policy_rule_id
+    remove_concurrent_index_by_name :approval_project_rules, INDEX_NAME
+  end
+end
diff --git a/db/post_migrate/20240604111411_add_approval_policy_rules_fk_on_approval_merge_request_rules.rb b/db/post_migrate/20240604111411_add_approval_policy_rules_fk_on_approval_merge_request_rules.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2558b0c15087a3703d9fea9cf69d7c4f7a0caf5e
--- /dev/null
+++ b/db/post_migrate/20240604111411_add_approval_policy_rules_fk_on_approval_merge_request_rules.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalPolicyRulesFkOnApprovalMergeRequestRules < Gitlab::Database::Migration[2.2]
+  milestone '17.2'
+  disable_ddl_transaction!
+
+  INDEX_NAME = 'index_approval_merge_request_rules_on_approval_policy_rule_id'
+
+  def up
+    add_concurrent_index :approval_merge_request_rules, :approval_policy_rule_id, name: INDEX_NAME
+    add_concurrent_foreign_key :approval_merge_request_rules, :approval_policy_rules,
+      column: :approval_policy_rule_id,
+      on_delete: :cascade
+  end
+
+  def down
+    remove_foreign_key_if_exists :approval_merge_request_rules, column: :approval_policy_rule_id
+    remove_concurrent_index_by_name :approval_merge_request_rules, INDEX_NAME
+  end
+end
diff --git a/db/post_migrate/20240604111512_add_approval_policy_rules_fk_on_software_license_policies.rb b/db/post_migrate/20240604111512_add_approval_policy_rules_fk_on_software_license_policies.rb
new file mode 100644
index 0000000000000000000000000000000000000000..05d944f193e56864bf6edbd161633f7fed7ec4f8
--- /dev/null
+++ b/db/post_migrate/20240604111512_add_approval_policy_rules_fk_on_software_license_policies.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalPolicyRulesFkOnSoftwareLicensePolicies < Gitlab::Database::Migration[2.2]
+  milestone '17.2'
+  disable_ddl_transaction!
+
+  INDEX_NAME = 'index_software_license_policies_on_approval_policy_rule_id'
+
+  def up
+    add_concurrent_index :software_license_policies, :approval_policy_rule_id, name: INDEX_NAME
+    add_concurrent_foreign_key :software_license_policies, :approval_policy_rules,
+      column: :approval_policy_rule_id,
+      on_delete: :cascade
+  end
+
+  def down
+    remove_foreign_key_if_exists :software_license_policies, column: :approval_policy_rule_id
+    remove_concurrent_index_by_name :software_license_policies, INDEX_NAME
+  end
+end
diff --git a/db/post_migrate/20240604111555_add_approval_policy_rules_fk_on_scan_result_policy_violations.rb b/db/post_migrate/20240604111555_add_approval_policy_rules_fk_on_scan_result_policy_violations.rb
new file mode 100644
index 0000000000000000000000000000000000000000..53a7137795747ea87a0d92ab62468042074e6876
--- /dev/null
+++ b/db/post_migrate/20240604111555_add_approval_policy_rules_fk_on_scan_result_policy_violations.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalPolicyRulesFkOnScanResultPolicyViolations < Gitlab::Database::Migration[2.2]
+  milestone '17.2'
+  disable_ddl_transaction!
+
+  INDEX_NAME = 'index_scan_result_policy_violations_on_approval_policy_rule_id'
+
+  def up
+    add_concurrent_index :scan_result_policy_violations, :approval_policy_rule_id, name: INDEX_NAME
+    add_concurrent_foreign_key :scan_result_policy_violations, :approval_policy_rules,
+      column: :approval_policy_rule_id,
+      on_delete: :cascade
+  end
+
+  def down
+    remove_foreign_key_if_exists :scan_result_policy_violations, column: :approval_policy_rule_id
+    remove_concurrent_index_by_name :scan_result_policy_violations, INDEX_NAME
+  end
+end
diff --git a/db/schema_migrations/20240604111157 b/db/schema_migrations/20240604111157
new file mode 100644
index 0000000000000000000000000000000000000000..fa64ef71a78311e2d3aaaddc5974d948e0a2a59a
--- /dev/null
+++ b/db/schema_migrations/20240604111157
@@ -0,0 +1 @@
+5057f80fb6c15decab4922a2de6a9d375f40a9403e8c2a6fa0b486ff1e17162f
\ No newline at end of file
diff --git a/db/schema_migrations/20240604111324 b/db/schema_migrations/20240604111324
new file mode 100644
index 0000000000000000000000000000000000000000..0bfb344e0941561dc33f6a37d27a3990ded492ad
--- /dev/null
+++ b/db/schema_migrations/20240604111324
@@ -0,0 +1 @@
+cbfd56180dec618dc3af148b5de76b0049f58fe4a204499cbad1bc81e6fa6ed2
\ No newline at end of file
diff --git a/db/schema_migrations/20240604111411 b/db/schema_migrations/20240604111411
new file mode 100644
index 0000000000000000000000000000000000000000..5084f49739ea0a582445b9b1a00780d761c03f70
--- /dev/null
+++ b/db/schema_migrations/20240604111411
@@ -0,0 +1 @@
+b243ee0a70bd35a5a28c00e47f2fbd729eab122812afbce7736ca20bd27567c8
\ No newline at end of file
diff --git a/db/schema_migrations/20240604111512 b/db/schema_migrations/20240604111512
new file mode 100644
index 0000000000000000000000000000000000000000..ea3ce1f47cd03dea6d6e8429a70d7e00e0a94c6b
--- /dev/null
+++ b/db/schema_migrations/20240604111512
@@ -0,0 +1 @@
+250db8525e859281ece4ab3e8bdef61fbcc06ae74d45d893457e0695593ff384
\ No newline at end of file
diff --git a/db/schema_migrations/20240604111555 b/db/schema_migrations/20240604111555
new file mode 100644
index 0000000000000000000000000000000000000000..7b9c8791ccf65780ae7b7946d65997218fa790f5
--- /dev/null
+++ b/db/schema_migrations/20240604111555
@@ -0,0 +1 @@
+db2a2b23c32dd50a820c9b5b03c42cce1d6e2d79767c6d49068a2949132b6727
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 0f2a400e0f378f1cbe43197743bcffa57226954c..8cdf92d7b94408bb861ae3e95e058fd22bd041ef 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -25600,6 +25600,8 @@ CREATE INDEX index_application_settings_web_ide_oauth_application_id ON applicat
 
 CREATE INDEX index_approval_group_rules_groups_on_group_id ON approval_group_rules_groups USING btree (group_id);
 
+CREATE INDEX index_approval_group_rules_on_approval_policy_rule_id ON approval_group_rules USING btree (approval_policy_rule_id);
+
 CREATE INDEX index_approval_group_rules_on_scan_result_policy_id ON approval_group_rules USING btree (scan_result_policy_id);
 
 CREATE INDEX index_approval_group_rules_users_on_user_id ON approval_group_rules_users USING btree (user_id);
@@ -25618,6 +25620,8 @@ CREATE UNIQUE INDEX index_approval_merge_request_rules_groups_1 ON approval_merg
 
 CREATE INDEX index_approval_merge_request_rules_groups_2 ON approval_merge_request_rules_groups USING btree (group_id);
 
+CREATE INDEX index_approval_merge_request_rules_on_approval_policy_rule_id ON approval_merge_request_rules USING btree (approval_policy_rule_id);
+
 CREATE INDEX index_approval_merge_request_rules_on_project_id ON approval_merge_request_rules USING btree (project_id);
 
 CREATE UNIQUE INDEX index_approval_merge_request_rules_users_1 ON approval_merge_request_rules_users USING btree (approval_merge_request_rule_id, user_id);
@@ -25632,6 +25636,8 @@ CREATE UNIQUE INDEX index_approval_project_rules_groups_1 ON approval_project_ru
 
 CREATE INDEX index_approval_project_rules_groups_2 ON approval_project_rules_groups USING btree (group_id);
 
+CREATE INDEX index_approval_project_rules_on_approval_policy_rule_id ON approval_project_rules USING btree (approval_policy_rule_id);
+
 CREATE INDEX index_approval_project_rules_on_id_with_regular_type ON approval_project_rules USING btree (id) WHERE (rule_type = 0);
 
 CREATE INDEX index_approval_project_rules_on_project_id ON approval_project_rules USING btree (project_id);
@@ -28474,6 +28480,8 @@ CREATE UNIQUE INDEX index_scan_result_policies_on_position_in_configuration ON s
 
 CREATE INDEX index_scan_result_policies_on_project_id ON scan_result_policies USING btree (project_id);
 
+CREATE INDEX index_scan_result_policy_violations_on_approval_policy_rule_id ON scan_result_policy_violations USING btree (approval_policy_rule_id);
+
 CREATE INDEX index_scan_result_policy_violations_on_merge_request_id ON scan_result_policy_violations USING btree (merge_request_id);
 
 CREATE UNIQUE INDEX index_scan_result_policy_violations_on_policy_and_merge_request ON scan_result_policy_violations USING btree (scan_result_policy_id, merge_request_id);
@@ -28620,6 +28628,8 @@ CREATE INDEX index_snippets_on_updated_at ON snippets USING btree (updated_at);
 
 CREATE INDEX index_snippets_on_visibility_level_and_secret ON snippets USING btree (visibility_level, secret);
 
+CREATE INDEX index_software_license_policies_on_approval_policy_rule_id ON software_license_policies USING btree (approval_policy_rule_id);
+
 CREATE INDEX index_software_license_policies_on_scan_result_policy_id ON software_license_policies USING btree (scan_result_policy_id);
 
 CREATE INDEX index_software_license_policies_on_software_license_id ON software_license_policies USING btree (software_license_id);
@@ -31515,6 +31525,9 @@ ALTER TABLE ONLY resource_link_events
 ALTER TABLE ONLY ml_candidates
     ADD CONSTRAINT fk_2a0421d824 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
+ALTER TABLE ONLY approval_group_rules
+    ADD CONSTRAINT fk_2a74c6e52d FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY agent_group_authorizations
     ADD CONSTRAINT fk_2c9f941965 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
 
@@ -31614,6 +31627,9 @@ ALTER TABLE ONLY bulk_import_export_uploads
 ALTER TABLE ONLY ci_pipelines
     ADD CONSTRAINT fk_3d34ab2e06 FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE SET NULL;
 
+ALTER TABLE ONLY scan_result_policy_violations
+    ADD CONSTRAINT fk_3d58aa6aee FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY wiki_page_slugs
     ADD CONSTRAINT fk_3d71295ac9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
@@ -31857,6 +31873,9 @@ ALTER TABLE ONLY subscription_user_add_on_assignments
 ALTER TABLE ONLY vulnerabilities
     ADD CONSTRAINT fk_725465b774 FOREIGN KEY (dismissed_by_id) REFERENCES users(id) ON DELETE SET NULL;
 
+ALTER TABLE ONLY approval_merge_request_rules
+    ADD CONSTRAINT fk_73fec3d7e5 FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY index_statuses
     ADD CONSTRAINT fk_74b2492545 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
@@ -31884,6 +31903,9 @@ ALTER TABLE ONLY oauth_openid_requests
 ALTER TABLE ONLY scan_result_policy_violations
     ADD CONSTRAINT fk_77251168f1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
+ALTER TABLE ONLY approval_project_rules
+    ADD CONSTRAINT fk_773289d10b FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY agent_user_access_project_authorizations
     ADD CONSTRAINT fk_78034b05d8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
@@ -32448,6 +32470,9 @@ ALTER TABLE ONLY boards_epic_board_positions
 ALTER TABLE ONLY workspaces
     ADD CONSTRAINT fk_dc7c316be1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
+ALTER TABLE ONLY software_license_policies
+    ADD CONSTRAINT fk_dca6a58d53 FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY epics
     ADD CONSTRAINT fk_dccd3f98fc FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;