diff --git a/database_test_SQL/g5_notify_trigger.sql b/database_test_SQL/g5_notify_trigger.sql new file mode 100644 index 0000000..84a82dd --- /dev/null +++ b/database_test_SQL/g5_notify_trigger.sql @@ -0,0 +1,54 @@ +-- ========================================== +-- 80portal 数据库 (log_platform) 触发器脚本 +-- ========================================== + +-- 1. 创建触发器函数 +CREATE OR REPLACE FUNCTION room_status.notify_g5_change() +RETURNS trigger AS $$ +DECLARE + payload JSON; +BEGIN + -- 仅当目标字段发生实际变化时才发送通知 + IF NEW.dev_loops IS DISTINCT FROM OLD.dev_loops + OR NEW.bright_g IS DISTINCT FROM OLD.bright_g + OR NEW.elec_voltage IS DISTINCT FROM OLD.elec_voltage + OR NEW.elec_ampere IS DISTINCT FROM OLD.elec_ampere + OR NEW.elec_power IS DISTINCT FROM OLD.elec_power + OR NEW.elec_energy IS DISTINCT FROM OLD.elec_energy + OR NEW.elec_phase IS DISTINCT FROM OLD.elec_phase + OR NEW.elec_sum_energy IS DISTINCT FROM OLD.elec_sum_energy + OR NEW.ts_ms IS DISTINCT FROM OLD.ts_ms THEN + -- 组装我们需要向外发送的数据 + payload = json_build_object( + 'hotel_id', NEW.hotel_id, + 'room_id', NEW.room_id, + 'device_id', NEW.device_id, + 'dev_loops', NEW.dev_loops, + 'bright_g', NEW.bright_g, + 'elec_voltage', NEW.elec_voltage, + 'elec_ampere', NEW.elec_ampere, + 'elec_power', NEW.elec_power, + 'elec_energy', NEW.elec_energy, + 'elec_phase', NEW.elec_phase, + 'elec_sum_energy', NEW.elec_sum_energy, + 'ts_ms', NEW.ts_ms + ); + + -- 通过信道发送通知 (载荷大小限制为8000字节) + PERFORM pg_notify('g5_realtime_channel', payload::text); + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- 2. 绑定触发器到目标表 +-- 先清理旧版本的触发器 +DROP TRIGGER IF EXISTS trg_g5_dev_loops_update ON room_status.room_status_moment_g5; +DROP TRIGGER IF EXISTS trg_g5_update ON room_status.room_status_moment_g5; + +-- 监听更新操作 (对需要实时推流与同步的字段集进行变动监听) +CREATE TRIGGER trg_g5_update +AFTER UPDATE OF dev_loops, bright_g, elec_voltage, elec_ampere, elec_power, elec_energy, elec_phase, elec_sum_energy, ts_ms ON room_status.room_status_moment_g5 +FOR EACH ROW +EXECUTE PROCEDURE room_status.notify_g5_change();