SQL 由于 'invalid trigger specification',触发器无法正常工作
SQL Trigger is not working properly because of 'invalid trigger specification'
我正在开发一个名为 Employees
的 table,其中存储 first_name
和 last_name
(作为 varchar)。我创建了下面的触发器来检查名字和姓氏的组合是否已经存在:
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.: 这是一个理论案例研究,我知道检查重复条目的正确方法是不使用名字和姓氏,因为两个人可能有相同的名字。我知道,所以请不要开始 :-)
您当前形式的触发器没有多大意义。触发器不是函数,因此您不能 return 从中获取值。
此外,您的触发器不是行级触发器,而是语句级触发器,因此您无法引用新值(因为您的触发器每 语句触发一次 , 不是每个 row) - 行级触发器必须声明为 FOR EACH ROW
.
确保唯一性的正确方法不是触发器,而是 UNIQUE 约束(参见 AskTom on using triggers):
ALTER TABLE employees ADD CONSTRAINT employees_name_uq UNIQUE(firstname, lastname);
我正在开发一个名为 Employees
的 table,其中存储 first_name
和 last_name
(作为 varchar)。我创建了下面的触发器来检查名字和姓氏的组合是否已经存在:
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.: 这是一个理论案例研究,我知道检查重复条目的正确方法是不使用名字和姓氏,因为两个人可能有相同的名字。我知道,所以请不要开始 :-)
您当前形式的触发器没有多大意义。触发器不是函数,因此您不能 return 从中获取值。
此外,您的触发器不是行级触发器,而是语句级触发器,因此您无法引用新值(因为您的触发器每 语句触发一次 , 不是每个 row) - 行级触发器必须声明为 FOR EACH ROW
.
确保唯一性的正确方法不是触发器,而是 UNIQUE 约束(参见 AskTom on using triggers):
ALTER TABLE employees ADD CONSTRAINT employees_name_uq UNIQUE(firstname, lastname);