【问题标题】:Is there any way to create this trigger or should I use something else?有什么方法可以创建这个触发器还是我应该使用其他东西?
【发布时间】:2020-12-08 09:23:35
【问题描述】:

这些是表格:

CREATE TABLE Staff 
(
     staffID INTEGER,
     staffName VARCHAR(20),
     staffSurname VARCHAR(20),
     DOB DATE NOT NULL,
     staffBranchNo INTEGER,
     salary DECIMAL(5,2),
     startDateOfWork DATE
);

ALTER TABLE Staff
ADD (CONSTRAINT staff_pk PRIMARY KEY(staffID));

CREATE TABLE Branch 
(
     branchNo INTEGER,
     branchCity varchar(20),
     branchTotalStaffNumber INTEGER
);

ALTER TABLE Branch
ADD (CONSTRAINT branch_pk PRIMARY KEY(branchNo));

我需要一个根据staffBranchNo更新branchTotalStaffNumber的触发器,当添加新员工时,会更新或删除现有员工。

我尝试了一些触发器,但没有一个包含我需要的其中三个操作。 下面的触发器不起作用。

CREATE OR REPLACE TRIGGER staff_trigger
BEFORE INSERT OR UPDATE OR DELETE ON Staff
FOR EACH ROW
BEGIN

  CASE
    WHEN INSERTING THEN
    INSERT INTO branch (branchTotalStaffNumber) 
    VALUES(:NEW.branchTotalStaffNumber);
         
    WHEN UPDATING THEN
    UPDATE branch SET branchTotalStaffNumber = :NEW.branchTotalStaffNumber;
    
    WHEN DELETING THEN
    delete from branch where staffBranchNo = :new.branchTotalStaffNumber;
    
  END CASE;
END;
/

【问题讨论】:

  • 请向我们展示您到目前为止所尝试的方法,并解释哪些方法不起作用。
  • 我编辑了问题@GMB
  • 这不是一个好方法。不要在数据库中存储根据其他数据计算的值(例如,每个分支机构的员工人数)。这种计算属于视图,而不是存储表。如果您需要非常快速地访问这些数字,您可以使用物化视图。 (例如:如果您采用触发方式,您将如何计算创建或消除的分支?或合并?等等。)

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

您不应使用trigger 来存储计算值。但是如果你正在学习,那么你应该使用下面的代码(见内联 cmets)

CREATE OR REPLACE TRIGGER staff_trigger
  BEFORE INSERT OR UPDATE OR DELETE ON Staff
  FOR EACH ROW
  BEGIN
      IF INSERTING THEN -- used IF . CASE usage is not allowed as IF
        UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
    Where branchno = :new.staffBranchNo; -- used :new to identify the record
    
      ELSIF UPDATING THEN 
        -- update the branch table only if staffBranchno is updated
        -- adding one staff to the new branch
        IF :new.staffBranchNo <> :old.staffBranchNo THEN
          UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
    Where branchno = :new.staffBranchNo;
          -- removing one staff from old branch
          UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
    Where branchno = :old.staffBranchNo;
        END IF;
      ELSE -- IF DELETING can be omitted
        -- removing one staff from branch for delete action 
        UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
    Where branchno = :old.staffBranchNo;
        
      END IF;
END;
/

请注意,您也可以使用OF 子句和其中的列名来创建触发器。仅当OF 子句中提到的列的值发生更改时才会执行触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 2011-02-02
    • 1970-01-01
    • 2014-02-10
    • 2011-06-11
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多