#5858 - zoneCollisions #1853
|
@ -2,6 +2,7 @@ DELIMITER $$
|
|||
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `VN_SCHEDULER`
|
||||
ON SCHEDULE EVERY 1 DAY
|
||||
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
ENABLE
|
||||
DO BEGIN
|
||||
CALL `VN_SCHEDULER`();
|
||||
END$$
|
||||
|
|
|
@ -1,8 +1,75 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `util`.`VN_SCHEDULER`()
|
||||
BEGIN
|
||||
DECLARE vDone BOOL;
|
||||
DECLARE vError VARCHAR(255) DEFAULT NULL;
|
||||
DECLARE vErrorCode VARCHAR(255) DEFAULT NULL;
|
||||
DECLARE vSchema VARCHAR(255);
|
||||
DECLARE vStatus VARCHAR(255);
|
||||
DECLARE vProcedure VARCHAR(255);
|
||||
-- DECLARE vLogMail VARCHAR(255);
|
||||
DECLARE vScheduleFk INT;
|
||||
-- Obtener datos de la tabla vn_schedules
|
||||
DECLARE vQueue CURSOR FOR
|
||||
SELECT id, `schema`, `procedure`, `status`
|
||||
FROM vn_schedules
|
||||
WHERE status = 'scheduled';
|
||||
|
||||
OPEN vQueue;
|
||||
l: LOOP
|
||||
SET vDone = FALSE;
|
||||
FETCH vQueue INTO vScheduleFk, vSchema, vProcedure, vStatus;
|
||||
|
||||
IF vDone THEN
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
UPDATE vn_schedules
|
||||
SET `started` = util.VN_NOW(),
|
||||
`finished` = NULL,
|
||||
`error` = NULL,
|
||||
`errorCode` = NULL
|
||||
WHERE id = vScheduleFk;
|
||||
|
||||
SET vError = NULL;
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||
GET DIAGNOSTICS CONDITION 1
|
||||
vError = MESSAGE_TEXT,
|
||||
vErrorCode = RETURNED_SQLSTATE;
|
||||
|
||||
CALL util.exec(CONCAT('CALL `', vSchema ,'`.`', vProcedure ,'`'));
|
||||
|
||||
IF vError IS NOT NULL THEN
|
||||
-- IF vLogMail IS NOT NULL THEN
|
||||
-- CALL vn.mail_insert(
|
||||
-- vLogMail,
|
||||
-- NULL,
|
||||
-- CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'),
|
||||
-- CONCAT(
|
||||
-- '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break
|
||||
-- 'See ', SCHEMA(), '.nightTask table for more info.'
|
||||
-- )
|
||||
-- );
|
||||
-- END IF;
|
||||
|
||||
UPDATE vn_schedules
|
||||
SET `error` = vError,
|
||||
finished = util.VN_NOW(),
|
||||
lastFinished = util.VN_NOW()
|
||||
`errorCode` = vErrorCode
|
||||
`status` = 'error'
|
||||
WHERE id = vScheduleFk;
|
||||
ELSE
|
||||
UPDATE vn_schedules
|
||||
SET `error` = vError,
|
||||
`errorCode` = vErrorCode
|
||||
finished = util.VN_NOW(),
|
||||
lastFinished = util.VN_NOW(),
|
||||
`status` = 'exec'
|
||||
WHERE id = vScheduleFk;
|
||||
END IF;
|
||||
END LOOP;
|
||||
CLOSE vQueue;
|
||||
END$$
|
||||
|
||||
DELIMITER ;
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
DELIMITER $$
|
||||
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`zoneCollisions`
|
||||
ON SCHEDULE EVERY 1 DAY
|
||||
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
ON COMPLETION NOT PRESERVE
|
||||
ENABLE
|
||||
DO BEGIN
|
||||
DECLARE vEXEC BOOLEAN DEFAULT FALSE;
|
||||
SELECT COUNT(*)>0 INTO vEXEC from util.vn_schedules;
|
||||
|
||||
IF vEXEC THEN
|
||||
CALL `zone_getCollisions`();
|
||||
END IF;
|
||||
END$$
|
||||
|
||||
DELIMITER ;
|
|
@ -11,6 +11,9 @@ BEGIN
|
|||
|
||||
-- Activo el evento 'zone_getCollisions'
|
||||
jsegarra marked this conversation as resolved
Outdated
|
||||
-- UPDATE `mysql`.`event` SET status = 1 WHERE name = 'zone_getCollisions';
|
||||
INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`)
|
||||
VALUES
|
||||
(`vn`, `zone_getCollisions`);
|
||||
|
||||
-- Insert en vn_schedules 'zone_getCollisions'
|
||||
END$$
|
||||
|
|
|
@ -6,6 +6,10 @@ BEGIN
|
|||
|
||||
-- Activo el evento 'zone_getCollisions'
|
||||
-- Insert en vn_schedulesla key 'zone_getCollisions'
|
||||
-- ALTER EVENT zoneCollisions ENABLE;
|
||||
INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`)
|
||||
jsegarra marked this conversation as resolved
Outdated
jgallego
commented
estamos generando una dependencia en util de vn. estamos generando una dependencia en util de vn.
Util no tiene que conocer vn.
Simplemente crea el schedule que se ejecute todas las noches en vn, ya està.
|
||||
VALUES
|
||||
(`vn`, `zone_getCollisions`);
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -7,5 +7,8 @@ BEGIN
|
|||
|
||||
-- Activo el evento 'zone_getCollisions' -- Insert en vn_schedules 'zone_getCollisions'
|
||||
|
||||
INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`)
|
||||
VALUES
|
||||
(`vn`, `zone_getCollisions`);
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
CREATE TABLE IF NOT EXISTS `util`.`vn_schedules` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`started` datetime DEFAULT NULL,
|
||||
`finished` datetime DEFAULT NULL,
|
||||
`lastFinished` datetime DEFAULT NULL,
|
||||
`order` int(11) DEFAULT NULL,
|
||||
`schema` varchar(45) NOT NULL,
|
||||
`procedure` varchar(100) NOT NULL,
|
||||
`error` varchar(255) DEFAULT NULL,
|
||||
`errorCode` varchar(10) DEFAULT NULL,
|
||||
`status` enum('scheduled','exec','error') NOT NULL DEFAULT 'scheduled',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY unique_schedule (`schema`, `procedure`, `status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
|
@ -1,10 +1,10 @@
|
|||
INSERT INTO util.notification (id, name,description)
|
||||
VALUES (
|
||||
(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions');
|
||||
-- INSERT INTO util.notification (id, name,description)
|
||||
jgallego marked this conversation as resolved
Outdated
jgallego
commented
dile a chatgpt que te cambie esta linea y que quieres usar el last_insert_id de forma que primero insertas y luego ya usas el id otorgado. dile a chatgpt que te cambie esta linea y que quieres usar el last_insert_id de forma que primero insertas y luego ya usas el id otorgado.
jsegarra
commented
No hace falta ir tan lejos...tonto de mi por no haber revisado el resto del proyecto. Basta con usar LAST_INSERT_ID() No hace falta ir tan lejos...tonto de mi por no haber revisado el resto del proyecto.
Basta con usar LAST_INSERT_ID()
jsegarra
commented
Revisamos porque esta tabla empieza por 0. Revisamos porque esta tabla empieza por 0.
Devuelve 0 LAST_INSERT_ID();
jsegarra
commented
Solved, he modificado la propiedad auto_increment de la columna id de util.notification Solved, he modificado la propiedad auto_increment de la columna id de util.notification
|
||||
-- VALUES (
|
||||
-- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions');
|
||||
|
||||
jgallego marked this conversation as resolved
Outdated
jgallego
commented
pongo esto para descartar y que cuando tengas el nuevo pr me puedas pedir revision de nuevo pongo esto para descartar y que cuando tengas el nuevo pr me puedas pedir revision de nuevo
jsegarra
commented
Corregido: Corregido: 4994a836c7119a6c894e3600a78ba71438ecb410
|
||||
INSERT INTO util.notificationSubscription (notificationFk,userFk)
|
||||
SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included";
|
||||
-- INSERT INTO util.notificationSubscription (notificationFk,userFk)
|
||||
-- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included";
|
||||
|
||||
jgallego marked this conversation as resolved
Outdated
jgallego
commented
porque se la añades al usuario system? deberia de ser el que solicita la tarea no? porque se la añades al usuario system? deberia de ser el que solicita la tarea no?
jsegarra
commented
Es un evento el que dispara el procedure de zone_getCollisions, por tanto no hay usuario que haga la operación manual, si no que es el systema. Me basé en los datos de producción util.notification where id=6 Si las especificaciones no son las correctas, hay algún sitio donde pueda tomar la referencia? Es un evento el que dispara el procedure de zone_getCollisions, por tanto no hay usuario que haga la operación manual, si no que es el systema.
Me basé en los datos de producción util.notification where id=6
Si las especificaciones no son las correctas, hay algún sitio donde pueda tomar la referencia?
jsegarra
commented
@jgallego Tras juntarme con Pablo, he cambiado el usuario de systema a root, porque por lo que me ha comentado, si el procedimiento se ejecuta en la BD es root y en salix es system @jgallego Tras juntarme con Pablo, he cambiado el usuario de systema a root, porque por lo que me ha comentado, si el procedimiento se ejecuta en la BD es root y en salix es system
|
||||
|
||||
jgallego marked this conversation as resolved
Outdated
jgallego
commented
que es este 100? el usuario 100 en prod es icef...no me cuadra. que es este 100? el usuario 100 en prod es icef...no me cuadra.
Busca la forma de usar codes para no poner numeros.
jsegarra
commented
INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) La solución estaba mas abajo INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk)
VALUES(
@MaxId, (SELECT id from `account`.`user` where name = "system"));
La solución estaba mas abajo
|
||||
INSERT INTO util.notificationAcl (notificationFk,roleFk)
|
||||
SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included";
|
||||
-- INSERT INTO util.notificationAcl (notificationFk,roleFk)
|
||||
-- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included";
|
||||
|
|
no ponemos dos saltos de linea nunca