72 Zeilen
2.2 KiB
PL/PgSQL
72 Zeilen
2.2 KiB
PL/PgSQL
-- Add constraint to ensure licenses always inherit is_fake from their customer
|
|
-- This migration adds a trigger to automatically sync is_fake status
|
|
|
|
-- Function to sync is_fake status
|
|
CREATE OR REPLACE FUNCTION sync_license_fake_status()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
-- When inserting or updating a license, get is_fake from customer
|
|
IF TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND NEW.customer_id != OLD.customer_id) THEN
|
|
SELECT is_fake INTO NEW.is_fake
|
|
FROM customers
|
|
WHERE id = NEW.customer_id;
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger for licenses table
|
|
DROP TRIGGER IF EXISTS sync_license_fake_before_insert_update ON licenses;
|
|
CREATE TRIGGER sync_license_fake_before_insert_update
|
|
BEFORE INSERT OR UPDATE ON licenses
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION sync_license_fake_status();
|
|
|
|
-- Function to update licenses when customer is_fake changes
|
|
CREATE OR REPLACE FUNCTION sync_customer_fake_to_licenses()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
-- When customer is_fake changes, update all their licenses
|
|
IF TG_OP = 'UPDATE' AND NEW.is_fake != OLD.is_fake THEN
|
|
UPDATE licenses
|
|
SET is_fake = NEW.is_fake
|
|
WHERE customer_id = NEW.id;
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger for customers table
|
|
DROP TRIGGER IF EXISTS sync_customer_fake_after_update ON customers;
|
|
CREATE TRIGGER sync_customer_fake_after_update
|
|
AFTER UPDATE ON customers
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION sync_customer_fake_to_licenses();
|
|
|
|
-- Verify current data is consistent (should return 0)
|
|
DO $$
|
|
DECLARE
|
|
mismatch_count INTEGER;
|
|
BEGIN
|
|
SELECT COUNT(*) INTO mismatch_count
|
|
FROM licenses l
|
|
JOIN customers c ON l.customer_id = c.id
|
|
WHERE l.is_fake != c.is_fake;
|
|
|
|
IF mismatch_count > 0 THEN
|
|
RAISE NOTICE 'Found % mismatches. Fixing...', mismatch_count;
|
|
|
|
-- Fix any existing mismatches
|
|
UPDATE licenses l
|
|
SET is_fake = c.is_fake
|
|
FROM customers c
|
|
WHERE l.customer_id = c.id
|
|
AND l.is_fake != c.is_fake;
|
|
|
|
RAISE NOTICE 'Fixed all mismatches.';
|
|
ELSE
|
|
RAISE NOTICE 'No mismatches found. Data is consistent.';
|
|
END IF;
|
|
END $$; |