-- 已部署数据库的可重复执行升级脚本。 -- 执行前应先收敛同一 dock 的重复活动会话,否则活动会话唯一索引会拒绝创建。 DELIMITER $$ DROP PROCEDURE IF EXISTS upgrade_live_control $$ CREATE PROCEDURE upgrade_live_control() BEGIN DECLARE item_count INT DEFAULT 0; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'requested_by'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN requested_by BIGINT NULL; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'stop_deadline'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN stop_deadline DATETIME NULL; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'updated_at'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN updated_at DATETIME NULL; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_state_version'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN device_state_version BIGINT DEFAULT 0; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_event_id'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN device_event_id VARCHAR(128); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_updated_at'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN device_updated_at BIGINT DEFAULT 0; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'cloud_confirmed_at'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN cloud_confirmed_at DATETIME NULL; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'uk_live_session_device_event'; IF item_count = 0 THEN CREATE UNIQUE INDEX uk_live_session_device_event ON live_session (device_event_id); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'active_dock_id'; IF item_count = 0 THEN ALTER TABLE live_session ADD COLUMN active_dock_id VARCHAR(64) GENERATED ALWAYS AS ( CASE WHEN phase IN ('starting', 'streaming', 'reconnecting', 'stopping') THEN dock_id ELSE NULL END ) STORED; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'idx_live_session_dock_phase'; IF item_count = 0 THEN CREATE INDEX idx_live_session_dock_phase ON live_session (dock_id, phase, created_at); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'idx_live_session_phase_deadline'; IF item_count = 0 THEN CREATE INDEX idx_live_session_phase_deadline ON live_session (phase, stop_deadline); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'uk_live_session_active_dock'; IF item_count = 0 THEN CREATE UNIQUE INDEX uk_live_session_active_dock ON live_session (active_dock_id); END IF; CREATE TABLE IF NOT EXISTS live_viewer_lease ( id BIGINT PRIMARY KEY, stream_session_id VARCHAR(128) NOT NULL, viewer_id BIGINT NOT NULL, expires_at DATETIME NOT NULL, released_at DATETIME NULL, created_at DATETIME NULL, updated_at DATETIME NULL, UNIQUE KEY uk_live_viewer (stream_session_id, viewer_id), KEY idx_live_lease_expire (stream_session_id, expires_at), KEY idx_live_lease_active (stream_session_id, released_at, expires_at), CONSTRAINT fk_live_lease_session FOREIGN KEY (stream_session_id) REFERENCES live_session(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; END $$ CALL upgrade_live_control() $$ DROP PROCEDURE upgrade_live_control $$ DELIMITER ;