1,触发器简介
触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。
2,触发器语法和功能
触发器的语法如下
CREATE OR REPLACE TRIGGER trigger_name
<before | after | instead of> <insert | update | delete> ONtable_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--触发器代码
END;
3:简单实例(行级触发器之一)
下面我们可以用oraclce中scott用户下的salary表作实例
目标:我们往emp表中做insert操作之后通过触发器来简单的打印一句话,
先创建触发器:
create or replace trigger trigger_test --定义类对象[trigger],定义对象名称[trigger_test]
after insert on emp --触发时间[after] ,DML语言
for each row --逐行监测[意思就是每插入一行则进行下面的输出]
declare
begin
dbms_output.put_line('插入emp表之后打印此信息'); --触发器操作内容
dbms_output.put_line('触发器执行完毕.......');
end;
其次:
在plSQL中新开一个sql window 执行以下操作
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 20);
执行完之后再打开output标签页面
结果显示:
插入emp表之后打印此信息'
触发器执行完毕.......
4:行级触发器之二
此时有人可能会问语法中的WHEN (condition)啥时候用上啊, 所以下面给大家解释一下.
WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,
触发器才被 执行,否则不执行。
实例二:
create or replace trigger tri_test2
AFTER INSERT OR UPDATE of sal ON g_test
for each row
when (new.sal >1000 and (old.sal is null or old.sal <500))
declare
v_maxsalary number;
begin
select sal into v_maxsalary
from employment where EMPLOYEE_ID =: new.id;
if:new.sal > v_maxsalary then
dbms_output.put_line('你好!');
end if
end;