Example 1: Row-level Before Insert Trigger
A simple before insert trigger can be used to illustrate how triggers can be used to validate new data values and to convert them into a standard format. The acctmgr table in the example bookshop database stores basic information about the bookshop employees who manage the book sales. Each one has an up to 7 character identifier (mgrid) which consists solely of upper case letters. This table also stores each account manager's commission rate–none of which can be larger than 10%. The create table for acctmgr is shown below.
CREATE TABLE acctmgr
(
mgrid CHAR(7) PRIMARY KEY,
name CHAR(24),
hire_date DATE,
commission DECIMAL(4,3)
);
The trigger definition below, named rib_acctmgr (we're using the "rib" prefix to identify the trigger as a row-level insert before trigger), will fire (execute) whenever a new row is inserted into the acctmgr table.
create trigger bookshop.rib_acctmgr
before insert on acctmgr
referencing new row as new_acctmgr
for each row
begin atomic
if new_acctmgr.commission not between 0.0 and 0.10 then
signal sqlcode eCHECK set message_text = "commission must be >= 0.0 and <= 0.10";
else
set new_acctmgr.mgrid = ucase(new_acctmgr.mgrid);
end if;
end;
The following rdm-sql script shows how the trigger works.
rdm-sql: select * from bookshop.acctmgr; mgrid | name | hire_date | commission -------+-------------------------+-----------+----------- ALFRED | Kralik, Alfred | 1997-07-02| 0.025 AMY | Zonn, Amy | 1994-07-06| 0.025 BARNEY | Noble, Barney | 1972-05-08| 0.035 FRANK | Doel, Frank | 1987-02-13| 0.030 JOE | Fox, Joe | 1998-12-18| 0.025 KATE | Kelly, Kathleen | 1998-12-18| 0.025 KLARA | Novac, Klara | 1990-01-02| 0.025
The current contents of the acctmgr table is shown above. The insert statement below attempts to insert a row with a 25% commission rate. This is trapped by the trigger which returns a check clause violation error.
rdm-sql: insert into acctmgr values "russ", "Wilson, Russell", date "2012-04-27", 0.25; error: Check clause violation: commission must be >= 0.0 and <= 0.20
The corrected insert is shown below but note that the mgrid value is specified as lower-case. The trigger will correct this so that the upper-case form is inserted into the acctmgr table.
rdm-sql: insert into acctmgr values "russ", "Wilson, Russell", date "2012-04-27", 0.025; *** 1 row(s) inserted rdm-sql: select * from acctmgr; mgrid | name | hire_date | commission -------+-------------------------+-----------+----------- ALFRED | Kralik, Alfred | 1997-07-02| 0.025 AMY | Zonn, Amy | 1994-07-06| 0.025 BARNEY | Noble, Barney | 1972-05-08| 0.035 FRANK | Doel, Frank | 1987-02-13| 0.030 JOE | Fox, Joe | 1998-12-18| 0.025 KATE | Kelly, Kathleen | 1998-12-18| 0.025 KLARA | Novac, Klara | 1990-01-02| 0.025 RUSS | Wilson, Russell | 2012-04-27| 0.025