From d3ece5f0ca8ee7374c471cb07eb4d4e7744256f5 Mon Sep 17 00:00:00 2001 From: Indiem87 Date: Thu, 9 Apr 2026 12:00:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=99=A8=E8=84=9A=E6=9C=AC=E4=BB=A5=E5=AE=9E=E6=97=B6=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E6=88=BF=E9=97=B4=E7=8A=B6=E6=80=81=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E9=80=81=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database_test_SQL/g5_notify_trigger.sql | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 database_test_SQL/g5_notify_trigger.sql 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();