Oracle触发器更新现有行

时间:2012-06-14 14:56:45

标签: oracle plsql triggers oracle11g

我有一个看起来像这样的触发器:

create or replace
TRIGGER cluster_check
before insert on my_table
FOR EACH ROW

when (passive_server = new.server)

begin
ROLLBACK;
UPDATE my_table
set (server,passive_server) = (passive_server,server) where passive_server = new.server;
end;

我在编译时收到错误Error: ORA-04076: invalid NEW or OLD specification

基本上我要做的是检查插入以查看传入服务器是否与另一条记录中的被动服务器匹配,如果是,则取消插入并交换现有记录被动和活动服务器。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

表格上的触发器无法像这样更改操作。

您可以在my_table之上定义视图,针对视图执行INSERT,然后使用instead of insert触发器将INSERT操作更改为{ {1}}。但是那么你所有的DML都必须反对视图而不是表格。您可以重命名该表,然后创建一个名为UPDATE的视图,以便更轻松地进行转换。

然而,在你走这条路之前,你确定首先需要一个触发器吗?您确定您的应用程序无法执行某些操作,例如调用存储过程来确定要执行的操作或无法执行my_table而不是MERGE吗?