2008年12月12日星期五

触发器是用来做数据验证的么

前几天听同事说,他们做了一个触发器来进行数据验证。我知道触发器有很多用途,但是用触发器来做数据验证,多半就有问题。

举例说明如下:
在emp表里希望每个部门的人数都不能少于三人,在EMP表建立如下触发器:
create or replace
TRIGGER
emp_trg AFTER INSERT OR DELETE OR UPDATE ON EMP
BEGIN
for irec in (
select deptno, count(*) emps
from emp
GROUP by deptno
HAVING count(*) < 3
)
loop
RAISE_Application_error(-20000,'dept wrong number');
end LOOP;
END;

在第一个会话里执行如下语句(员工号为7499,7521,7654,7900的员工都是部门号为30的员工,这个部门共有6个人):
delete from emp where empno in (7499,7521,7654);
3 rows deleted.
这里触发器看到的部门号为30的员工有三个。
在第二个会话里执行如下语句:
delete from emp where empno=7900;
1 row deleted.
这里触发器看到的部门号为30的员工有5个。
commit;
Commit complete.
这是再回到第一个会话执行commit;
Commit complete.

然而这时部门号为三十的部门只有两个人,因此触发器验证失败。
这是功能上的问题,性能上,一个触发器对增删改操作的性能影响,至少和一个索引相当。因此在性能上来说,也得不偿失。如果是做数据验证的话,用check来做多半好一些。

没有评论: