use*_*492 2 oracle triggers plsql oracle-apex
我正在尝试创建一个触发器来检查我的emp_mb表中是否已存在员工,并且我收到此错误消息
ORA-00969:缺少ON关键字
有任何想法吗 ?
CREATE OR REPLACE TRIGGER adduser_mb
BEFORE
INSERT OR UPDATE emp_id
ON emp_mb
FOR EACH ROW
DECLARE
DUMMY INTEGER;
BEGIN
SELECT COUNT(*) INTO DUMMY
FROM emp_mb
WHERE emp_id = :new.emp_id
IF (dummy > 0)
THEN raise_application_error(-20501
'Employee ID' || :new.emp_id || ' already exists');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
您无法在单个(非复合)触发器中实际执行此操作.
行级触发器emp_mb一般不能查询emp_mb.解决语法问题后,您将获得变异表异常.
确保emp_id唯一的正确方法是在表上创建唯一约束.
alter table emp_mb
add( constraint uk_emp_id unique (emp_id) );
Run Code Online (Sandbox Code Playgroud)
如果你真的,真的,真的想用触发器来做这件事,你需要多个触发器(或者如果你使用11.2则实现多个触发器的复合触发器).你需要一个声明了一组emp_id值的包.您需要一个初始化该集合的before语句触发器.您需要一个行级触发器,将:new.emp_id值插入该包的集合中.然后你需要一个after语句触发器来遍历集合并进行检查.这是你必须实现,调试和维护的许多移动部分.
但实际上它不仅仅是代码的泛滥 - 你还需要实现自己的序列化机制.否则,假设您允许系统中有多个用户,则两个会话可以同时插入一行emp_id,每个会话的检查成功,然后让两个会话提交,从而在表中留下重复的值.这意味着您还需要实现一些逻辑,以确保在任何时间点只有一个会话可以将数据插入此表.反过来,这将极大地降低系统的可扩展性,并且很可能导致会话保持锁定的维护问题,阻止系统中的其他所有人,直到DBA找到并杀死它们.