我想编写一个Trigger来验证一个列是否只有一个特定值,如果某个用户尝试更新或插入一个具有相同值的行,则会触发该触发器。但触发器编译不好。你有什么主意吗?你知道化合物触发器是否在10g中可用吗?
注意:mon_oficial列只有一个“S”值可用。如果某些用户尝试插入新记录或使用第二个“S”值更新,则会触发触发器。
表:
触发:
CREATE OR REPLACE TRIGGER check_mon_oficial_trg
FOR INSERT OR UPDATE
ON monedas
COMPOUND TRIGGER
v_check_moneda NUMBER(8);
BEFORE STATEMENT IS
BEGIN
SELECT COUNT(:NEW.mon_oficial)
INTO v_check_moneda
FROM monedas
WHERE mon_oficial = 'S';
IF
v_check_moneda > 1 THEN
RAISE_APPLICATION_ERROR(-20010, 'Only one official money in table');
END IF;
END BEFORE STATEMENT;
END check_mon_oficial_trg;
错误:
答案 0 :(得分:2)
复合触发器在11gR1
中引入复合触发
复合触发器是一种数据库操作语言(DML)触发器,可以在多个时间点触发。
复合触发器的主体支持其所有部分的代码都可以访问的公共PL / SQL状态。当触发语句启动时会建立公共状态,并在触发语句完成时销毁,即使触发语句导致错误。
在版本11.1之前,应用程序开发人员使用辅助包对公共状态进行建模。当触发语句导致错误并且语句后触发器没有触发时,这种方法编程既麻烦又容易出现内存泄漏。复合触发器可以更轻松地编写一种方法,您希望为各种时序点实现的操作共享公共数据。