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