feat: 添加触发器脚本以实时监听房间状态变化并发送通知
This commit is contained in:
54
database_test_SQL/g5_notify_trigger.sql
Normal file
54
database_test_SQL/g5_notify_trigger.sql
Normal file
@@ -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();
|
||||||
Reference in New Issue
Block a user