创建在两个表上运行的触发器

Creating a Trigger that runs on two tables

我有两个 table,COPYBORROW。他们的专栏是:

COPY (
Copy_id,
Bk_id,
Loc_id,
Opinion
)

BORROW (
Cus_evo,
B_Date,
R_Date,
Fee,
Copy_id,
Cus_id
)

我想配置一个触发器,确保存储在确切位置(伦敦)(来自 COPY table 的 Loc-id 列)的副本不能在 12 月借出(来自B_Date BORROW 列 table).

我创建了以下触发器:

CREATE OR REPLACE TRIGGER BORROW_TRIGGER 
BEFORE INSERT ON BORROW FOR EACH ROW BEGIN
IF(TO_CHAR(TO_DATE(:NEW.B_Date, 'DD-MMM-YYYY'),'MMM'= 'DEC')
AND :NEW.Loc_id='LC0001')
THEN RAISE_APPLICATION_ERROR(-20669,'CANNOT BORROW BOOKS FROM LONDON STORE DURING MONTH DECEMBER');
END IF;
END;
/

触发器未创建且有错误请云给我正确的触发器??

我遇到的错误

Errors: TRIGGER BORROW_TRIGGER
Line/Col: 3/5 PLS-00049: bad bind variable 'NEW.LOC_ID'

您需要查询COPY table得到您需要的字段:

CREATE OR REPLACE TRIGGER BORROW_BI
  BEFORE INSERT ON BORROW
  FOR EACH ROW
DECLARE
  strLoc_id  COPY.LOC_ID%TYPE;
BEGIN
  SELECT LOC_ID
    INTO strLoc_id
    FROM DUAL
    LEFT OUTER JOIN COPY c
      ON c.COPY_ID = :NEW.COPY_ID;

  IF TO_CHAR(TO_DATE(:NEW.B_Date, 'DD-MMM-YYYY'), 'MMM') = 'DEC' AND 
     strLoc_id = 'LC0001'
  THEN
    RAISE_APPLICATION_ERROR(-20669,'CANNOT BORROW BOOKS FROM LONDON STORE DURING MONTH DECEMBER');
  END IF;
END BORROW_BI;

您可以通过使用公共列 (copy_id) 在 table 中,例如

CREATE OR REPLACE TRIGGER Trg_Borrow_Trigger_BI
  BEFORE INSERT ON borrow
  FOR EACH ROW
DECLARE    
    v_exists INT;  
BEGIN
    SELECT COUNT(*)
      INTO v_exists
      FROM copy
     WHERE copy_id = :NEW.copy_id
       AND loc_id = 'LC0001'
       AND TO_CHAR( :NEW.b_Date, 'MM' ) = '12';
      
    IF v_exists > 0 THEN
      RAISE_APPLICATION_ERROR(-20669,
                              'CANNOT BORROW BOOKS FROM LONDON STORE DURING MONTH DECEMBER');
    END IF;
END;
/

哪里

  • TO_DATE()转换是多余的
  • 无法在 loc_id 前添加 :NEW,因为触发器是为 table borrow 没有此列,而 copy table 有。

由于您只需要在 b_date 是 12 月时执行检查,因此将其作为 when 条件添加到触发器顶部会更有效。这也简化了触发逻辑。

create or replace trigger borrow_check_trg
    before insert on borrow 
    for each row
    when (to_char(new.b_date,'MM') = '12')
declare
    l_loc_id copy.loc_id%type;
begin
    select c.loc_id into l_loc_id
    from   copy c
    where  c.copy_id = :new.copy_id;

    if l_loc_id = 'LC0001' then
       raise_application_error(-20669, 'Books cannot be borrowed from the London store during December'); 
    end if;
end;