触发器

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值