Oracle上的varchar值触发器无法正常工作

时间:2016-07-20 21:46:36

标签: oracle triggers varchar

我有2张桌子'标签'和'音乐家'

CREATE TABLE label
(labId varchar(10) NOT NULL PRIMARY KEY,
labName varchar(20) NOT NULL
);



CREATE TABLE musician
(musId varchar(10) NOT NULL PRIMARY KEY,
 musName varchar(30) NOT NULL,
 labId varchar(10) NOT NULL,
 CONSTRAINT MusLabel FOREIGN KEY (labId) REFERENCES label(labId)
);

我创建了一个触发器来限制标签​​在a中的音乐家数量 范围为1到5;所以例如标签x不能有6位音乐家:

CREATE OR REPLACE TRIGGER before_musician_insert
BEFORE INSERT ON musician
FOR EACH ROW
DECLARE 
total integer;
BEGIN
SELECT COUNT(*) INTO total
FROM musician, label
WHERE musician.labId=label.labId;
IF (total < 0 OR total > 5)
THEN
DBMS_OUTPUT.PUT_LINE('Invalid');
END IF;
END;
/

当我将第6位音乐家插入具有相同标签ID的表中时,insert语句不会“触发”TRIGGER,并且第6个值将添加到表中。 我不知道如何解决这个问题。 我尝试了一个检查约束,但是使用了varchar值,它也没有工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您的代码有多个问题。例如,它没有访问:new。触发器位于错误的表格上。它没有错误生成。

我可能会建议这样的事情:

CREATE OR REPLACE TRIGGER before_labels_insert
BEFORE INSERT ON labels
FOR EACH ROW
DECLARE 
  v_total integer;
  user_xcep EXCEPTION;
  PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
BEGIN

    SELECT COUNT(*) INTO v_total
    FROM labels l
    WHERE l.labId = :new.labId;
    IF (v_total >= 5) THEN
        DBMS_OUTPUT.PUT_LINE('Invalid');
        RAISE user_xcep
    END IF;
END;

答案 1 :(得分:0)

您的触发器在插入之前触发,因此执行查询时第六个条目不存在。

如果你想在插入第6个条目时出错,你可以使它成为一个AFTER触发器(并且每个语句触发一次,而不是FOR EACH ROW)。