根据另一个 table 中的另一列触发编辑 table 列

Trigger to edit a table column depending on another column from another table

我有这些 table:

CREATE TABLE Functions
  (
    id_f NUMBER (5) NOT NULL,
    id_gFK NUMBER (5) NOT NULL
  ) ;

--id_gFK is foreign key from Salaries table

CREATE TABLE Salaries
  (
    id_g NUMBER (5) NOT NULL ,
    g1_g1 NUMBER (6) ,
    g1_g2 NUMBER (6) ,
    g1_g3 NUMBER (6) ,
    g2_g1 NUMBER (6) ,
    g2_g2 NUMBER (6) ,
    g2_g3 NUMBER (6) ,
    g3_g1 NUMBER (6) ,
    g3_g2 NUMBER (6) ,
    g3_g3 NUMBER (6)
  ) ;

--g1_g1 means - grade 1, gradation 1

CREATE TABLE Employee
  (
    id_e  NUMBER (5) NOT NULL ,
    id_fFK NUMBER (5) NOT NULL ,
    grade NUMBER (1) ,
    gradation NUMBER (1) ,
    salary NUMBER (6)
  ) ;

 --id_fFK is foreign key from Functions table

当我插入一名员工时,一切正常,他正在根据该列领取薪水。但是,我可以在 Salaries table 中编辑薪水。

例如

id_g=101, g1_g1=5000....g3_g3=1200Salaries table

id_f=201, id_gFK=101Functions table

id_e=1001, id_fFK=201, grade=1, gradation=1, salary=5000 in Employee table(5000 取自 Salaries table 取决于 id_fFK, grade and gradation)。

之后,我将在 Salaries table 中编辑工资 5000,例如 4000,我希望此编辑自动完成Employee table。

我确信我可以用触发器来做到这一点。我试过了,但是没有。

可以谁能告诉我必须使用哪种触发器以及如何使用?

谢谢!!!

请看下面的例子,其中 updatinginserting 一条记录到 emp_sal table 并且同样被插入到 employee table 通过 trigger.

CREATE OR REPLACE TRIGGER change_salary
   AFTER INSERT OR UPDATE ON emp_sal
   FOR EACH ROW
BEGIN

IF INSERTING THEN 

  INSERT INTO Employee (employee_id,first_name,salary)
  values (:new.eno,:new.ename,:new.sal);

END IF;

IF UPDATING THEN 
   UPDATE Employee
      SET salary = nvl(:NEW.sal,:old.sal)
      WHERE employee_id = :new.eno; 
 end if;

 END;

执行:

SQL>  select sal from emp_sal  where eno = 3 ;

       SAL
----------
     80006

SQL>  select salary from employee where employee_id = 3;

    SALARY
----------
     50000

SQL>  update emp_sal 
 set sal = 1234
 where eno = 3 ;   

1 row updated.

SQL> commit;

Commit complete.


SQL> select sal from emp_sal  where eno = 3 ;

       SAL
----------
      1234

SQL> select salary from employee where employee_id = 3;

    SALARY
----------
      1234

SQL>  insert into emp_sal(eno,ename,sal)
        values
       (9,'XING',40000);    

   1 row created.

SQL> commit;

    Commit complete.

SQL> select salary from employee where employee_id =9;  

    SALARY
----------
     40000

编辑: 我不确定你的 trigger 是什么,但我确实看到数据设置有误。我阅读了您的 requirement 并按照我的方式进行了工作并经过了测试。见下文:

包含数据的表:

CREATE TABLE Salaries
  (
    id_g NUMBER (5) NOT NULL PRIMARY KEY ,
    g1_g1 NUMBER (6) ,
    g1_g2 NUMBER (6) ,
    g1_g3 NUMBER (6) ,
    g2_g1 NUMBER (6) ,
    g2_g2 NUMBER (6) ,
    g2_g3 NUMBER (6) ,
    g3_g1 NUMBER (6) ,
    g3_g2 NUMBER (6) ,
    g3_g3 NUMBER (6)
  ) ;

Insert into SALARIES
 Values
   (101, 5000, 2000, 3000, 4000, 
    6000, 7000, 8000, 6000, 12000);
COMMIT;
--------------------------------

CREATE  TABLE Functions
  (
    id_f NUMBER (5) NOT NULL,
    id_gFK NUMBER (5) NOT NULL PRIMARY KEY,
    CONSTRAINT fk_sal
    FOREIGN KEY (id_gFK)
    REFERENCES Salaries(id_g)

  ) ;

Insert into FUNCTIONS
   (ID_F, ID_GFK)
 Values
   (201, 101);
COMMIT;  
--------------------------
  CREATE TABLE Employees
  (
    id_e  NUMBER (5) NOT NULL ,
    id_fFK NUMBER (5) NOT NULL ,
    grade NUMBER (1) ,
    gradation NUMBER (1) ,
    salary NUMBER (6),
    CONSTRAINT fk_id_emp
    FOREIGN KEY (id_fFK)
    REFERENCES Functions(id_gFK)
  ) ;

 Insert into EMPLOYEES
   (ID_E, ID_FFK, GRADE, GRADATION, SALARY)
 Values
   (101, 101, 1, 1, 5000);
COMMIT;

触发器:

CREATE OR REPLACE TRIGGER change_salary_new
   AFTER UPDATE ON Salaries
   FOR EACH ROW
BEGIN   
   UPDATE Employees
      SET salary = nvl(:NEW.g1_g1,:old.g1_g1)
      WHERE id_e = :new.id_g; 
End ;

执行:

SQL> select id_g,g1_g1 from Salaries;

      ID_G      G1_G1
---------- ----------
       101       5000

SQL> select id_e,salary from  Employees;

      ID_E     SALARY
---------- ----------
       101       5000

SQL> update Salaries set g1_g1 = 10202 where id_g = 101;

1 row updated.

SQL> commit;

Commit complete.

SQL> select id_e,salary from  Employees;

      ID_E     SALARY
---------- ----------
       101      10202