尝试创建一个触发器,以防止重复的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;
答案 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#;
/