1.触发器:是特殊类型的存储过程,当某个事件发生时,他被自动执行。
2.设置触发器机制,必须满足两个要求
(1)指明什么事件发生和满足什么条件执行触发器
(2)指明触发器执行什么样的动作
这种模型乘坐事件条件动作模型
3.SQL中的触发器
(1)语句的一般格式如下
CREATE TRIGGER<触发器名><触发时间><触发事件>
ON<表名>
[REFERENCING<旧/新值别名>,...,<旧/新值别名>]
[FOR EACH|ROW|STATEMENT]
[WHERE (<触发条件>)]
<被触发的SQL语句>
其中,触发时间可以是BEFORE或AFTER
触发事件可以是T上的INSERT,DELETE或UPDATE或UPDATE OF<触发列>,...,<触发列>这里触发列是表T的属性
REFERENCING子句创建一些过渡变量用来存放表T和表T的行更新前的旧值和更新后的新值
<旧/新值别名>可以是如下形式之一:OLD[ROW][AS]<变量>。创建行过渡变量<变量>存放表T的更新前的旧值;NEW[ROW][AS]<变量>。创建行过渡变量<变量>存放表T的行更新后的新值。OLD TABLE[AS]<变量>。创建表过渡变量<变量>存放表T更新前的旧值;NEW TABLE[AS]<变量>。创建表过渡变量<变量>存放表T更新后的新值。
FOR EACH ROW定义行级触发器,每个行跟心都触发,而FOR EACH STATEMENT定义语句级触发器,每个更新语句触发一次。缺省时为语句级触发器
WHEN子句说明歘条件,缺省时无条件触发。
被触发的SQL语句是触发动作体,具有如下形式:
BEGIN ATOMIC
<可执行的SQL语句>
...
END
(2)删除触发器 DROP TRIGGER<触发器名>
4.例子
设银行数据库包含如下关系模式:
Branch(BranchName,BranchCity,Assets)
Customer(CustomerName,CustomerStreet,CustomerCity)
Account(AccountNumber,BranchName,Balance)
Loan(Loan-number,BranchName,Amount)
Depositor(CustomerName,AccountNumber)
Borrowe(CustomerName,LoanNumber)
考虑银行的透支处理,当存款关系Account的某元组t的Balance修改后的值小于零时,系统做如下三件事:
(1)向贷款关系Loan插入一个新元组t1,t1.LoanNumber = t.AccountNumber,t1.BranchName = t.BranchName,t1.Amount等于透支额
(2)向Borrower插入新元组t2,记录新的贷款与顾客之间的联系
(3)将Account的元组t的Balance置零
使用SQl如下:
CREATE TRIGGER OverdraftTrigger
AFTER UPDATE OF Balance ON Account
REFERENCING NEW ROW AS nrow
FOR EACH ROW
WHEN(nrow.Balance<0)
BEGIN ATOMIC
INSERT INTO Loan
VALUES(nrow.AccountNumber,nrow.BranchName,-nrow.Balance);
INSERT INTO Borrower
(SELECT CustomerName,AccountNumber
FROM Depositor
WHERE nrow.AccountNumber = Depositor.AccountNumber);
UPDATE Account SET Balance = 0
WHERE nrow.AccountNumber = Account.AccountNumber
END