更新触发器

时间:2016-04-29 17:46:12

标签: sql database firebird database-trigger

这是我正在尝试为视图创建的更新触发器。我很清楚我想要实现的目标:

SET TERM !! ;
CREATE TRIGGER SST_Insert FOR SpaceSpaceTypes
BEFORE INSERT AS
DECLARE VARIABLE NEW_TYPE_ID;
BEGIN
NEW_TYPE_ID=(SELECT MAX(type_id) FROM SpaceTypes WHERE type_name=NEW.type_name);
INSERT INTO Space values (NEW.address,NEW.company_id,NEW.area,NEW_TYPE_ID);
END!!
SET TERM ; !!

我尝试了!!;的不同组合。我试着删除一个变量。它没有帮助。上述查询的错误是: 语句失败,SQLSTATE = 42000

  

动态SQL错误   -SQL错误代码= -104    - 未知 - 第3行,第29栏    - ;

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

DECLARE VARIABLE NEW_TYPE_ID;

您尚未指定NEW_TYPE_ID的类型,因此该语句不完整且该位置的分号是意外的,这会导致令牌未知错误。

DECLARE VARIABLE的语法是:

DECLARE [VARIABLE] <varname>
  {<datatype> | <domain> | TYPE OF {<domain> | COLUMN <rel.col>}
    [NOT NULL]  [CHARACTER SET <charset>] [COLLATE <collation>]
    [{DEFAULT | = } <initvalue>];

所以至少你需要使用:

DECLARE VARIABLE NEW_TYPE_ID INTEGER;

或更高级:

DECLARE VARIABLE NEW_TYPE_ID TYPE OF COLUMN SpaceTypes.type_id;

答案 1 :(得分:0)

最好的选择是将其保留为

   SET TERM !! ;
    CREATE TRIGGER SST_Insert FOR SpaceSpaceTypes
    BEFORE INSERT AS
    BEGIN
    INSERT INTO Space values (NEW.address,NEW.company_id,NEW.area,(SELECT        MAX(type_id) FROM SpaceTypes WHERE type_name=NEW.type_name));
END!!
SET TERM ; !!