| 1 | CREATE OR REPLACE FUNCTION trg_fn_prevent_duplicate_active_sim()
|
|---|
| 2 | RETURNS TRIGGER LANGUAGE plpgsql AS $$
|
|---|
| 3 | DECLARE
|
|---|
| 4 | v_existing_sub BIGINT;
|
|---|
| 5 | BEGIN
|
|---|
| 6 | IF NEW.end_date IS NULL AND NEW.sim_id IS NOT NULL THEN
|
|---|
| 7 | SELECT subscription_id INTO v_existing_sub
|
|---|
| 8 | FROM sim_card_subscription_history
|
|---|
| 9 | WHERE sim_id = NEW.sim_id AND end_date IS NULL
|
|---|
| 10 | AND sim_card_subscription_history_id<>NEW.sim_card_subscription_history_id
|
|---|
| 11 | LIMIT 1;
|
|---|
| 12 |
|
|---|
| 13 | IF FOUND THEN
|
|---|
| 14 | RAISE EXCEPTION
|
|---|
| 15 | 'SIM card (sim_id=%) is already actively assigned to '
|
|---|
| 16 | 'subscription_id=%. Close the existing assignment first.',
|
|---|
| 17 | NEW.sim_id, v_existing_sub;
|
|---|
| 18 | END IF;
|
|---|
| 19 | END IF;
|
|---|
| 20 | RETURN NEW;
|
|---|
| 21 | END;
|
|---|
| 22 | $$;
|
|---|
| 23 |
|
|---|
| 24 | drop trigger trg_prevent_duplicate_active_sim on sim_card_subscription_history;
|
|---|
| 25 | drop function trg_fn_prevent_duplicate_active_sim();
|
|---|
| 26 |
|
|---|
| 27 | CREATE OR REPLACE TRIGGER trg_prevent_duplicate_active_sim
|
|---|
| 28 | BEFORE UPDATE or INSERT ON sim_card_subscription_history
|
|---|
| 29 | FOR EACH ROW
|
|---|
| 30 | EXECUTE FUNCTION trg_fn_prevent_duplicate_active_sim();
|
|---|