2015-05-18 153 views
0

我正在制作一个名为Employees的表,其中first_namelast_name存储为(作为varchar)。我创建触发器下面检查姓和名的组合已经存在:由于'无效的触发器规范',SQL触发器无法正常工作

CREATE OR REPLACE TRIGGER VALIDATE_NAME 
BEFORE INSERT ON EMPLOYEES 
IF (SELECT count(*) FROM employees 
    WHERE firs_name = new.first_name AND LAST_NAME = new.last_name) = 0 
    BEGIN 
    END 
ELSE IF (SELECT count(*) FROM employees 
      WHERE firs_name = new.first_name AND LAST_NAME = new.last_name) >= 1 
    BEGIN 
    RETURN FALSE; 
    END; 

不过,我收到一条错误消息Invalid trigger specification,我不明白。有人能澄清我做错了什么吗?我已经删除了第一个BEGIN/END的内容,因为它只是存储了它应有的新信息。

P.S .:这是一个理论案例研究,我知道检查重复条目的正确方法是不使用名字和姓氏,因为两个人可能共享相同的名称。我知道,所以请不要着手它:-)

+0

哪个DBMS? (你的代码不是ANSI SQL ...) – jarlh

+0

我应该clarrified @jarlh,我使用Oracle与SQL Developer –

+1

我也添加了标签。 –

回答

1

您的触发器在其当前形式没有多大意义。触发器不是一个函数,所以你不能从它返回一个值。

而且,你的触发器是不是行级触发器,但语句级一个,所以你不能引用新的值(因为你触发每声明触发一次,不是每个) - 一个行级触发器必须声明为FOR EACH ROW

的正确方法,以确保其唯一性是不触发,而是一种独特的约束(见AskTom on using triggers):

ALTER TABLE employees ADD CONSTRAINT employees_name_uq UNIQUE(firstname, lastname); 
+0

我已经将它更改为行级触发器(因为我需要验证新的输入)。我必须为这种情况使用触发器,所以我不能使用这样的约束。 –

+0

@KevinVoorn不够公平,但请阅读我更新的答案中的链接,并确保您完全理解使用触发器执行业务约束的含义。 –

+0

感谢您的帮助,我正在阅读您的链接。 –