前几天听同事说,他们做了一个触发器来进行数据验证。我知道触发器有很多用途,但是用触发器来做数据验证,多半就有问题。
举例说明如下:
在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来做多半好一些。
异星工厂太空时代游戏总结
3 天前
没有评论:
发表评论