【问题标题】:I have a problem with an UPDATE BEFORE TRIGGER我在触发前更新有问题
【发布时间】:2021-12-02 18:21:09
【问题描述】:

我有以下表格:

CREATE TABLE Categorie
(categ_id NUMBER(5,0),
tip VARCHAR2(20));
CREATE TABLE Reteta
(reteta_id NUMBER(3),
nume VARCHAR2(100),
descriere VARCHAR2(200),
categ_id NUMBER(3,0),
vegetariana VARCHAR2(1) CHECK (vegetariana IN ('D','N')),
timp_preparare NUMBER(20,1),
portii NUMBER(3,1));
CREATE TABLE Set_ingrediente
(reteta_id NUMBER(3,0),
ingred_id NUMBER(3,0), 
cantitate NUMBER(5,2), 
um VARCHAR2(10) NOT NULL CHECK (um IN ('gr','ml','buc','lingurita','cana')), 
comentarii VARCHAR2(100)
);
CREATE TABLE Ingredient 
(ingred_id NUMBER(3,0), 
ingredient VARCHAR2(30));

以及以下主键/外键:

ALTER TABLE Categorie
MODIFY (categ_id CONSTRAINT categ_id_pk PRIMARY KEY NOT NULL);
ALTER TABLE Reteta
MODIFY(CONSTRAINT reteta_id_pk PRIMARY KEY (reteta_id));
ALTER TABLE Ingredient
MODIFY(CONSTRAINT ingred_id_pk PRIMARY KEY (ingred_id));
ALTER TABLE Set_ingrediente
MODIFY( CONSTRAINT reteta_id_fk FOREIGN KEY (reteta_id) REFERENCES Reteta(reteta_id) ON DELETE CASCADE);
ALTER TABLE Set_ingrediente
MODIFY( CONSTRAINT ingred_id_fk FOREIGN KEY (ingred_id) REFERENCES Ingredient(ingred_id) ON DELETE CASCADE);

我必须编写一个触发器: 如果食谱使用“油”成分,请确保素食栏不能更改。 这是我尝试过的触发器,但它不起作用:

CREATE OR REPLACE TRIGGER tr_oil BEFORE UPDATE
ON Reteta
FOR EACH ROW BEGIN
DECLARE
 ingredient_var ingredient.ingredient%type;
 SELECT ingredient
 INTO ingredient_var
 FROM Ingredint
 WHERE ingred_id=
 (SELECT ingred_id
 FROM Set_ingrediente
 WHERE reteta_id=NEW.reteta_id);
 IF ingredient_var='oil' THEN  
SET NEW.vegetariana = OLD.vegetariana;
END IF;
END;

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    这太奇怪了;直到触发代码,您发布的所有内容都完美工作,所以我无法想象当涉及到充满错误的触发器时出了什么问题(错位begin,无效的表名,缺少冒号使用:new 伪记录,...)。好像两个不同的人编写了您发布的两段代码。

    无论如何:

    SQL> CREATE OR REPLACE TRIGGER tr_oil
      2    BEFORE UPDATE ON Reteta
      3    FOR EACH ROW
      4  DECLARE
      5    ingredient_var ingredient.ingredient%type;
      6  BEGIN
      7    SELECT ingredient
      8      INTO ingredient_var
      9      FROM Ingredient
     10      WHERE ingred_id = (SELECT ingred_id
     11                         FROM Set_ingrediente
     12                         WHERE reteta_id = :NEW.reteta_id);
     13
     14    IF ingredient_var='oil' THEN
     15       :NEW.vegetariana := :OLD.vegetariana;
     16     END IF;
     17  END;
     18  /
    
    Trigger created.
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 2011-07-22
      • 2017-06-11
      • 2016-11-03
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多