40 lines
1.1 KiB
Elixir
40 lines
1.1 KiB
Elixir
defmodule Towerops.Repo.Migrations.DeduplicateDiscoveryChecks do
|
|
use Ecto.Migration
|
|
|
|
def up do
|
|
# Delete duplicate auto-discovered checks, keeping the oldest one per
|
|
# (device_id, check_type, source_id) combination.
|
|
execute("""
|
|
DELETE FROM checks
|
|
WHERE id IN (
|
|
SELECT id FROM (
|
|
SELECT id,
|
|
ROW_NUMBER() OVER (
|
|
PARTITION BY device_id, check_type, source_id
|
|
ORDER BY inserted_at ASC
|
|
) AS rn
|
|
FROM checks
|
|
WHERE source_type = 'auto_discovery'
|
|
AND source_id IS NOT NULL
|
|
) ranked
|
|
WHERE rn > 1
|
|
)
|
|
""")
|
|
|
|
# Prevent future duplicates for auto-discovered checks.
|
|
create(
|
|
unique_index(:checks, [:device_id, :check_type, :source_id],
|
|
where: "source_type = 'auto_discovery' AND source_id IS NOT NULL",
|
|
name: :checks_device_type_source_unique_index
|
|
)
|
|
)
|
|
end
|
|
|
|
def down do
|
|
drop_if_exists(
|
|
index(:checks, [:device_id, :check_type, :source_id],
|
|
name: :checks_device_type_source_unique_index
|
|
)
|
|
)
|
|
end
|
|
end
|