0 sql database oracle triggers
我试图创建一个触发器,使其像一个异常,不会让无序对在数据集中插入或更新两次.
例如,给定集合{A,B},其中A和B都是作为主键的列,并且表中存在{A,B},我不希望允许集合{B,A}存在,因为这种关系已经用{A,B}定义.
这是我的尝试,但它给出了Trigger created with compilation errors.,而且我也没有看到如何对抗new和old信息.
CREATE TRIGGER pair
BEFORE INSERT OR UPDATE ON pairing
DECLARE exists_pair NUMBER;
BEGIN
SELECT MAX(COUNT_VAL) INTO exist_pair
FROM (SELECT COUNT(*) FROM pairing p, pairing p2 WHERE p2.element_one = p.element_two AND p.element_one = p2.element_two)
IF exist_pair > 0 THEN
RAISE SOME_EXCEPTION;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
显然这不是我想要的,但它提出了一个想法.这将改为每次返回0,直到输入错误,然后它会说每个有效或无效的条目都是无效的...所以这不是我想要的但我不知道如何使用:new和:old在这种情况下.
这必须适用于oracle.
这是一个带有示例插入的SQLfiddle,它应该失败:http://sqlfiddle.com/#!4/1afb7/1/0
基于函数的索引将起作用:
create unique index unique_pair_ix on pairing (least(element_one,element_two),greatest(element_one,element_two));
Run Code Online (Sandbox Code Playgroud)
顺便说一句:使用行触发器从同一个表中选择将导致:
ORA-04091: table XXXX is mutating, trigger/function may not see it
Run Code Online (Sandbox Code Playgroud)
如果您尝试在单个语句中插入或更新多个行.所以你不能使用:OLD和:NEW.
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |