PLSQL_trigger_check重复帐号有错误

时间:2017-03-31 06:26:56

标签: plsql

尝试创建一个触发器,以防止重复的acct#和null acct平衡。触发器能够创建,但是当插入重复的acct#来测试触发器时,得到错误消息,"触发器无效并且重新验证失败"。

create or replace trigger update_acct#  
before insert or update on ACCOUNT  
for each row  
declare
    v_cta# NUMBER;    
begin  
    select count(:new.A#) into v_cta# from account group by A#;   
    if (v_cta#>1 or :new.bal=null) then     
        raise_application_error (-20011, 'DUPLICATE ACCOUNT NUMBER OR BAL CANNOT BE NULL');                    
    end if;  
end;

1 个答案:

答案 0 :(得分:0)

您绝对肯定不想为此使用触发器。使用唯一约束来防止重复的帐号。

ALTER TABLE account ADD CONSTRAINT a#_unique UNIQUE (a#);

使您的余额字段不接受空值。

ALTER TABLE account MODIFY bal NOT NULL;

出于纯粹的教育目的,这里是如何使用触发器来实现此目的。除了您要使用:new.a#来计数行而不在COUNT()中明确包含行,并且您想要AFTER触发器,因为您想查看新添加的帐户是否是第一个重复帐户,您的帐户已经很久了。

create or replace trigger update_acct#  
after insert or update on ACCOUNT  
for each row  
DECLARE
  v_cta# INTEGER;
BEGIN
  SELECT COUNT(*)
    INTO v_cta#
    FROM account
   WHERE a# = :new.a#;

  IF v_cta# > 1 OR :new.bal = NULL THEN
    raise_application_error(-20011,
                            'DUPLICATE ACCOUNT NUMBER OR BAL CANNOT BE NULL');
  END IF;
END update_acct#;
/