触发后更新

时间:2017-11-24 11:19:20

标签: triggers updates hsqldb

我在插入句子之前运行此触发器:

CREATE TRIGGER controlHoras before
insert ON conducen 
REFERENCING NEW AS newrow for each row
BEGIN Atomic
declare entrega timestamp;
declare hoy date;
declare horaUsuario timestamp;
declare horaActual timestamp;
set (entrega)= (select max(horaentrega) from conducen where matricula = newrow.matricula and FECHARECOGIDA = newrow.fecharecogida);
set (hoy)= (today);
set (horaUsuario)=(select max(horaentrega) from conducen where FECHARECOGIDA = newrow.fecharecogida and userwin =newrow.userwin);
set (horaActual) = (sysdate);
if(newrow.horaRecogida < entrega) then
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El coche esta ocupado a la hora que lo pretendes recoger, elige otra hora u otro coche.';
end if;
if(newrow.fecharecogida<hoy or newrow.HORARECOGIDA<horaActual) then
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Fecha o hora de recogida menor que la fecha actual.';
end if;
if(newrow.horaRecogida<horaUsuario) then
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'No puedes conducir dos coches a la vez.';
end if;
end;

但是我需要控制更新的句子,我有这个触发器但运行不正确:

CREATE TRIGGER controlHoras1 AFTER
UPDATE ON conducen
REFERENCING NEW AS newrow OLD AS oldrow FOR EACH ROW
BEGIN ATOMIC
declare entrega timestamp;
declare hoy date;
declare horaUsuario timestamp;
declare horaActual timestamp;

set (hoy)= (today);
set (horaUsuario)=(select max(oldrow.horaentrega) from conducen where FECHARECOGIDA = newrow.fecharecogida and userwin = newrow.userwin);
set (horaActual) = (sysdate);

if(newrow.fecharecogida < hoy or newrow.HORARECOGIDA < horaActual) then
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Fecha o hora de recogida menor que la fecha actual.';
end if;
if(newrow.horaRecogida < horaUsuario) then
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'Verifica si lo datos son correctos y si el coche esta libre o si pretendes conducir dos coches a la vez.';
end if;
end;

在表格中我有这个内容;

(bcastrof,9674-GZF,2017-11-24,2017-11-24 19:03:00.000000,2017-11-24 22:03:00.000000)

但如果有意更新此行,请使用此句;

update conducen 
set HORARECOGIDA='2017-11-24 20:03:00.000000', HORAENTREGA='2017-11-24 22:03:00.000000'
WHERE FECHARECOGIDA='2017-11-24' 
AND USERWIN = 'bcastrof' 
and matricula = '9674-GZF'
and HORARECOGIDA = '2017-11-24 19:03:00.000000';

它不起作用,因为它会跳过触发器的异常45002。请帮忙。

1 个答案:

答案 0 :(得分:0)

解决问题:

CREATE TRIGGER controlHoras1 AFTER
UPDATE ON conducen
REFERENCING NEW AS newrow OLD AS oldrow for each row
BEGIN Atomic
declare entrega timestamp;
declare hoy date;
declare horaUsuario timestamp;
declare horaActual timestamp;

set (entrega)= (select max(horaentrega) from conducen where matricula = newrow.matricula and FECHARECOGIDA = newrow.fecharecogida and horaentrega!=newrow.horaentrega);
set (hoy)= (today);
set (horaUsuario)=(select max(horaentrega) from conducen where FECHARECOGIDA = newrow.fecharecogida and userwin =newrow.userwin and horaentrega!=newrow.horaentrega and horarecogida<newrow.horarecogida);
set (horaActual) = (sysdate);
if(newrow.horaRecogida < entrega) then
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El coche esta ocupado a la hora que lo pretendes recoger, elige otra hora u otro coche.';
end if;
if(newrow.fecharecogida<hoy or newrow.HORARECOGIDA<horaActual) then
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Fecha o hora de recogida menor que la fecha actual.';
end if;
if(newrow.horaRecogida<horaUsuario) then
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'No puedes conducir dos coches a la vez.';
end if;
end;