Newer
Older
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
delimiter //
-- tr - abbr trigger
-- i - insert
-- u - update
-- d - delete
drop trigger if exists tr_i_submodule//
create trigger tr_i_submodule
before insert on submodules for each row
begin
declare vDisciplineID int default 0;
declare vAccumType, vChangeMax boolean default false;
declare vModuleType enum('regular','exam', 'bonus', 'extra') default 'extra';
-- todo: check repeated bonus
select modules.Type into vModuleType
from modules
where modules.ID = new.ModuleID
limit 1;
-- todo: in operator
if (vModuleType <=> 'regular' or vModuleType <=> 'exam') then begin
set vAccumType = (not vModuleType <=> 'exam');
select disciplines.ID
from modules
inner join disciplines on disciplines.ID = modules.DisciplineID
set vChangeMax = vAccumType || new.OrderNum <=> 1;
set disciplines.CurRate = disciplines.CurRate + if(new.isUsed, new.MaxRate, 0),
disciplines.MaxRate = disciplines.MaxRate + if(vChangeMax, new.MaxRate, 0)
where disciplines.ID = vDisciplineID
limit 1;
end; end if;
end//
drop trigger if exists tr_d_submodule//
create trigger tr_d_submodule
before delete on submodules for each row
begin
declare vDisciplineID int default 0;
declare vAccumType, vChangeMax boolean default false;
declare vModuleType enum('regular','exam', 'bonus', 'extra') default 'extra';
-- todo: check repeated bonus
select modules.Type into vModuleType
from modules
where modules.ID = old.ModuleID
limit 1;
if (vModuleType <=> 'regular' or vModuleType <=> 'exam') then begin
set vAccumType = (not vModuleType <=> 'exam');
select disciplines.ID
from modules
inner join disciplines on disciplines.ID = modules.DisciplineID
set vChangeMax = vAccumType || old.OrderNum <=> 1;
set disciplines.CurRate = disciplines.CurRate - if(old.isUsed, old.MaxRate, 0),
disciplines.MaxRate = disciplines.MaxRate - if(vChangeMax, old.MaxRate, 0)
where disciplines.ID = vDisciplineID
limit 1;
end; end if;
end//
drop trigger if exists tr_u_submodule//
create trigger tr_u_submodule
before update on submodules for each row
begin
declare vDisciplineID int default 0;
declare vAccumType, vChangeMaxOld, vChangeMaxNew boolean default false;
declare vModuleType enum('regular','exam', 'bonus', 'extra') default 'extra';
if old.ModuleID != new.ModuleID then
signal sqlstate '45000';
end if;
-- todo: check repeated bonus
select modules.Type into vModuleType
from modules
where modules.ID = new.ModuleID
limit 1;
if (vModuleType <=> 'regular' or vModuleType <=> 'exam') then begin
set vAccumType = (not vModuleType <=> 'exam');
select disciplines.ID
from modules
inner join disciplines on disciplines.ID = modules.DisciplineID
where modules.ID = old.ModuleID
set vChangeMaxOld = vAccumType || old.OrderNum <=> 1;
set vChangeMaxNew = vAccumType || new.OrderNum <=> 1;
update disciplines
set disciplines.CurRate = disciplines.CurRate
- if(old.isUsed, old.MaxRate, 0)
+ if(new.isUsed, new.MaxRate, 0),