Oracle 一个表字段上的触发器适用于所有表字段

Oracle 一个表字段上的触发器适用于所有表字段,oracle,plsql,oracle11g,plsqldeveloper,Oracle,Plsql,Oracle11g,Plsqldeveloper,我有一个触发器,用于表中的几个字段。但由于某种原因,如果更改了触发器中未定义的另一个字段,则它仍会激发 CREATE OR REPLACE TRIGGER INTEGRATION_EMPLOYMENT AFTER UPDATE OF start_day_of_employment, end_of_employment ON hr_employment_data FOR EACH ROW DECLARE BEGIN IF UPDATING THEN

我有一个触发器,用于表中的几个字段。但由于某种原因,如果更改了触发器中未定义的另一个字段,则它仍会激发

CREATE OR REPLACE TRIGGER INTEGRATION_EMPLOYMENT
    AFTER UPDATE OF start_day_of_employment, end_of_employment ON hr_employment_data
    FOR EACH ROW
    DECLARE
    BEGIN
         IF UPDATING THEN
            MERGE INTO ad_integration intg USING dual ON (intg.user_id = :NEW.user_id AND intg.integrated = 'NO')
            WHEN MATCHED THEN
                UPDATE SET
                         intg.start_day_of_employment = decode(:NEW.start_day_of_employment, NULL, ' ', :NEW.start_day_of_employment),
                         intg.end_of_employment = decode(:NEW.end_of_employment, NULL, ' ', :NEW.end_of_employment),
                         intg.manager_status = :NEW.manager_status,
                         intg.pid = (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id),
                         intg.network_access_start_date = (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id)
             WHEN NOT MATCHED THEN
                INSERT (intg.user_id, intg.start_day_of_employment, intg.end_of_employment, intg.manager_status, intg.pid, intg.network_access_start_date
                VALUES (:NEW.user_id, :NEW.start_day_of_employment, :NEW.end_of_employment, :NEW.manager_status, (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id));
END IF;

END HR_ADINTEGRATION_EMPLOYMENT;
是因为我使用了双重密码还是我遗漏了什么


干杯-

如果希望保持结构不变,并且只在指定字段更改时处理触发器,则只需快速比较新代码行7和8:

CREATE OR REPLACE TRIGGER INTEGRATION_EMPLOYMENT
AFTER UPDATE OF start_day_of_employment, end_of_employment ON hr_employment_data
FOR EACH ROW
DECLARE
BEGIN
     IF UPDATING 
        AND (:NEW.start_day_of_employment <> :OLD.start_day_of_employment
        OR   :NEW.end_of_employment <> :OLD.end_of_employment)  THEN
        MERGE INTO ad_integration intg USING dual ON (intg.user_id = :NEW.user_id AND intg.integrated = 'NO')
        WHEN MATCHED THEN
            UPDATE SET
                     intg.start_day_of_employment = decode(:NEW.start_day_of_employment, NULL, ' ', :NEW.start_day_of_employment),
                     intg.end_of_employment = decode(:NEW.end_of_employment, NULL, ' ', :NEW.end_of_employment),
                     intg.manager_status = :NEW.manager_status,
                     intg.pid = (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id),
                     intg.network_access_start_date = (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id)
         WHEN NOT MATCHED THEN
            INSERT (intg.user_id, intg.start_day_of_employment, intg.end_of_employment, intg.manager_status, intg.pid, intg.network_access_start_date
            VALUES (:NEW.user_id, :NEW.start_day_of_employment, :NEW.end_of_employment, :NEW.manager_status, (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id));
END IF;

END HR_ADINTEGRATION_EMPLOYMENT;

可能还有另一个触发器没有指定列。您如何更新HR\U就业数据?如果您通过某种用户界面进行更新,则用户界面可能会更新所有列,即使只有部分列的值发生了更改。此外,您是否有充分的理由不使用视图按需从HR_EMPLOYMENT_数据中查找值,而不是使用触发器来尝试保持AD_集成的最新状态?使用触发器很难正确执行此操作。您是否在HR\U就业数据上有插入和删除触发器?关于AD_集成的更新和插入触发器呢?是的,有一些触发器是罪魁祸首,所以我想使用view是最好的选择。为什么我以前没想到这个?那么,为什么它会触发?这仍然没有答案,Brian猜测即使没有更改,用户界面也会对所有列进行更新,对吗?我看不出触发器有什么问题。除了非常聪明的评论,你可以使用一个视图,而不是保留冗余数据。