diff --git a/migrations/000137_repository_stats_triggers.up.sql b/migrations/000137_repository_stats_triggers.up.sql index 30cf1ce5..1c5f9d45 100644 --- a/migrations/000137_repository_stats_triggers.up.sql +++ b/migrations/000137_repository_stats_triggers.up.sql @@ -46,12 +46,33 @@ BEGIN END; $$ LANGUAGE plpgsql; +-- Separate triggers for INSERT/UPDATE vs DELETE because +-- DELETE triggers cannot reference NEW in WHEN condition. DROP TRIGGER IF EXISTS trg_update_branch_finding_counts ON findings; -CREATE TRIGGER trg_update_branch_finding_counts - AFTER INSERT OR UPDATE OF status, severity, branch_id OR DELETE +DROP TRIGGER IF EXISTS trg_update_branch_finding_counts_delete ON findings; + +-- INSERT: only NEW available +CREATE TRIGGER trg_update_branch_finding_counts_insert + AFTER INSERT + ON findings + FOR EACH ROW + WHEN (NEW.branch_id IS NOT NULL) + EXECUTE FUNCTION update_branch_finding_counts(); + +-- UPDATE: both NEW and OLD available +CREATE TRIGGER trg_update_branch_finding_counts_update + AFTER UPDATE OF status, severity, branch_id + ON findings + FOR EACH ROW + WHEN (NEW.branch_id IS NOT NULL OR OLD.branch_id IS NOT NULL) + EXECUTE FUNCTION update_branch_finding_counts(); + +-- DELETE: only OLD available +CREATE TRIGGER trg_update_branch_finding_counts_delete + AFTER DELETE ON findings FOR EACH ROW - WHEN (COALESCE(NEW.branch_id, OLD.branch_id) IS NOT NULL) + WHEN (OLD.branch_id IS NOT NULL) EXECUTE FUNCTION update_branch_finding_counts(); -- ============================================================================= diff --git a/migrations/000138_asset_identity_resolution.up.sql b/migrations/000138_asset_identity_resolution.up.sql index 551a678a..9cfb4783 100644 --- a/migrations/000138_asset_identity_resolution.up.sql +++ b/migrations/000138_asset_identity_resolution.up.sql @@ -34,11 +34,11 @@ CREATE TABLE IF NOT EXISTS asset_merge_log ( created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -CREATE INDEX idx_asset_merge_log_tenant ON asset_merge_log(tenant_id); -CREATE INDEX idx_asset_merge_log_kept ON asset_merge_log(kept_asset_id); -CREATE INDEX idx_asset_merge_log_merged ON asset_merge_log(merged_asset_id) +CREATE INDEX IF NOT EXISTS idx_asset_merge_log_tenant ON asset_merge_log(tenant_id); +CREATE INDEX IF NOT EXISTS idx_asset_merge_log_kept ON asset_merge_log(kept_asset_id); +CREATE INDEX IF NOT EXISTS idx_asset_merge_log_merged ON asset_merge_log(merged_asset_id) WHERE merged_asset_id IS NOT NULL; -CREATE INDEX idx_asset_merge_log_created ON asset_merge_log(tenant_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_asset_merge_log_created ON asset_merge_log(tenant_id, created_at DESC); -- ============================================================ -- 2. Asset Dedup Review — admin queue for duplicate groups @@ -69,8 +69,8 @@ CREATE TABLE IF NOT EXISTS asset_dedup_review ( created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -CREATE INDEX idx_asset_dedup_review_tenant ON asset_dedup_review(tenant_id); -CREATE INDEX idx_asset_dedup_review_status ON asset_dedup_review(tenant_id, status); +CREATE INDEX IF NOT EXISTS idx_asset_dedup_review_tenant ON asset_dedup_review(tenant_id); +CREATE INDEX IF NOT EXISTS idx_asset_dedup_review_status ON asset_dedup_review(tenant_id, status); -- ============================================================ -- 3. Index for alias search (properties->'aliases')