Oracle SQL:创建触发器时表名无效

时间:2013-11-06 17:45:57

标签: sql oracle

我创建了这4个表:

create table terminatedEmployees (
    empid       number primary key,
    dept        number,
    empname     varchar2(50),
    salary      number
);

create table employees (
    empid       number primary key,
    dept        number, 
    empname     varchar2(50),
    salary      number
);

create table payroll (
    empid       number primary key,
    salary      number,
    CONSTRAINT fk_payemploy
    FOREIGN KEY (empid)
    REFERENCES employees(empid)
);

create table salaryAudit (
    empid       number primary key,
    oldsal      number,
    newsal      number, 
    datechanged date,
    changedby   varchar2(25),
    CONSTRAINT fk_salaryaudit
    FOREIGN KEY (empid)
    REFERENCES employees(empid)
);

现在我正在尝试创建一个触发器,以便在更新employees表时更新其中的两个:

CREATE TRIGGER trigger_updated_employees 
AFTER UPDATE ON employees
    FOR EACH ROW
    when (old.salary != new.salary)

BEGIN
    UPDATE INTO salaryAudit (newsal, oldsal)
        VALUES(:new.salary, :old.salary);
    UPDATE INTO payroll (salary)
        VALUES(:new.salary);
END;

但是我收到了错误:

2/5      PL/SQL: SQL Statement ignored
2/12     PL/SQL: ORA-00903: invalid table name
4/5      PL/SQL: SQL Statement ignored
4/12     PL/SQL: ORA-00903: invalid table name

我在触发器中调用的三个表是可以的,我创建了其他触发器......

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

CREATE TRIGGER TRIGGER_UPDATED_EMPLOYEES
AFTER UPDATE ON EMPLOYEES
    FOR EACH ROW
    WHEN (OLD.SALARY <> NEW.SALARY)
BEGIN
    MERGE INTO PAYROLL p
      USING (SELECT :NEW.EMPID AS EMPID FROM DUAL) d
        ON (p.EMPID = d.EMPID)
      WHEN NOT MATCHED THEN
        INSERT (EMPID, SALARY)
          VALUES (:NEW.EMPID, :NEW.SALARY)
      WHEN MATCHED THEN
        UPDATE
          SET SALARY = :NEW.SALARY;

    MERGE INTO SALARYAUDIT a
      USING (SELECT :NEW.EMPID AS EMPID FROM DUAL) d
        ON (a.EMPID = d.EMPID)
      WHEN NOT MATCHED THEN
        INSERT (EMPID, OLDSAL, NEWSAL, DATECHANGED, CHANGEDBY)
          VALUES (:NEW.EMPID, :OLD.SALARY, :NEW.SALARY, SYSDATE, 'SOME_USER')
      WHEN MATCHED THEN
        UPDATE 
          SET OLDSAL = :OLD.SALARY,
              NEWSAL = :NEW.SALARY,
              DATECHANGED = SYSDATE,
              CHANGEDBY = 'SOME_USER';
END TRIGGER_UPDATED_EMPLOYEES;

分享并享受。

答案 1 :(得分:0)

我让它正常工作只是纠正UPDATE语句语法并修改条件@BobJarvis建议,这是最终结果:

    CREATE TRIGGER trigger_updated_employees 
    AFTER UPDATE OF salary ON employees
        FOR EACH ROW
        when (old.salary <> new.salary)

    BEGIN
        UPDATE salaryAudit 
            SET (newsal, oldsal)
            VALUES (:new.salary, :old.salary)
            WHERE (salaryAudit.empid = old.empid);
        UPDATE payroll 
            SET (salary)
            VALUES (:new.salary)
            WHERE (payroll.empid = old.empid);
    END;

这个概念与@BobJarvis提出的相同,但更简单。谢谢