前请检查是否触发是否有效通过焙烧下面的查询..
SELECT *
FROM ALL_OBJECTS
WHERE OBJECT_NAME = trigger_name
AND OBJECT_TYPE = 'TRIGGER'
AND STATUS <> 'VALID'
的触发更新后烧制.. 尝试作为@phonetic_man指出出门,你隐藏任何错误,你抓住when others
并采取任何行动。没有异常块,你会看到你正在引起一个变异表错误(ORA-04091),因为你指的是触发器所针对的同一个表。
如果您拿出for each row
部分将其转换为语句级触发器,那么您将避免该问题,但现在您将有一个无限循环(ORA-00036) - 当您尝试从内部更新表触发器,更新本身会导致同一触发器再次触发;它试图再次更新同一个表,这会导致触发器再次触发;等到Oracle发现并杀死进程。
使用before-insert行级别触发器来确保行的新值与您尝试强制执行的任何模式相匹配会更有意义。也许是这样的:
CREATE OR REPLACE TRIGGER ref_upd_user_phi_details
BEFORE INSERT OR UPDATE --of emp_email_address, ssn_nb
ON ref_adp_employees
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
IF upper(:NEW.emp_email_address) NOT LIKE 'QA_%'
AND upper(:NEW.emp_email_address) LIKE '%@KEENAN.COM'
THEN
:NEW.emp_email_address := 'QA_' || :NEW.emp_email_address;
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NULL THEN '123-45-6789' END;
END IF;
END;
/
而要看看它做什么:
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (1, 'TEST_1', '123-45-6789');
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (2, '[email protected]', '123-45-9876');
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (3, 'QA_TEST_1', null);
select emp_id, emp_email_address, ssn_nb from ref_adp_employees;
EMP_ID EMP_EMAIL_ADDRESS SSN_NB
---------- ------------------------------ -----------
1 TEST_1 123-45-6789
2 [email protected]
3 QA_TEST_1
不知道,如果你真的打算用NULL替换集核潜艇,并把空到固定值;我怀疑你是真的想取代固定字符串设定值,独自离开零点,在这种情况下,这将是:
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NOT NULL THEN '123-45-6789' END;
您可能还需要动议IF
外块,所以不管它的完成电子邮件地址;我已经复制了你原来的代码试图做的事情,但这可能是不对的。
如果您想要修改现有数据以匹配这些更改,请对整个表执行一次性更新 - 请勿尝试在触发器内执行此操作。
你为什么捕捉到WHEN OTHERS异常,并且对此无能为力。暂时删除您的异常部分,并重新编译触发器。做一个插入/更新,看看它是否抛出任何错误。 –
此外,您的更新语句似乎是一个静态更新。您没有在触发器中新创建或更新的记录中使用任何值。你试图通过这个触发器达到什么目的? –
@phonetic_man:在删除异常部分后,让我检查您要求我做的第一个条件。我想在插入任何新记录或任何现有记录更新时触发此触发器。 –