2012-06-07 51 views
2

我需要開發一個觸發器,當某個字段的值不是'Y'或'N'時觸發。我的代碼不能正常工作,低於該
Oracle觸發器不起作用

CREATE OR REPLACE TRIGGER ONLY_Y_N 
BEFORE INSERT OR UPDATE OF flag 
ON checktable 
FOR EACH ROW 
BEGIN 
IF :new.flag <>'Y' OR :new.flag <>'N' THEN 
RAISE_APPLICATION_ERROR(-20100, 'Please insert Y or N '); 
END IF; 
END ONLY_Y_N; 

請幫

回答

4

適當的方法,這將是一個檢查約束,而不是一個觸發器。

也許NOT NULL約束以及

4

當大衛阿爾德里奇說,你要檢查約束不觸發。然而,你的觸發器不起作用的原因是這樣的條件:

IF :new.flag <>'Y' OR :new.flag <>'N' THEN 

由於「Y」 <>「N」和「N」 <>「Y」這絕不會是真的!您需要:

IF :new.flag <>'Y' AND :new.flag <>'N' THEN 

或更簡潔:

IF :new.flag not in ('Y', 'N') THEN 

所以檢查約束的解決辦法是:

alter table checktable add constraint only_y_n check (flag in ('Y', 'N')); 
1

簡單:你應該有AND而不是OR。無論FLAG的值如何,您當前的代碼都會引發異常。更好的是,使用NOT IN代替:

IF :new.flag NOT IN ('Y', 'N') THEN 
    RAISE_APPLICATION_ERROR(-20100, 'Please insert Y or N '); 
END IF;