为什么Sqlite出现错误:无法在表上创建INSTEAD OF触发器?

9
我尝试为表格更新创建一个代替触发器。代替触发器的正常用途是视图,但 Sqlite 手册表示代替触发器也适用于表格。但我收到错误消息:无法在表格上创建代替触发器。我想知道原因。
我使用外键:
PRAGMA foreign_keys = ON;

我有两个表格。一个标识符表:

CREATE TABLE id
(
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    created REAL    NOT NULL DEFAULT CURRENT_TIMESTAMP
);

还有一个引用标识符的表格:

CREATE TABLE person
(
    id        INTEGER NOT NULL DEFAULT (last_insert_rowid()) REFERENCES id,
    login     TEXT,
    password  TEXT,
    firstname TEXT,
    lastname  TEXT,
    email     TEXT,
    created   REAL  NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id, created)
);

插入操作正常:

INSERT INTO id DEFAULT VALUES;
INSERT INTO person (login) VALUES ('root');
SELECT * FROM person;
1|root|||||2012-02-28 18:03:45

现在我想定义以下触发器,将更新转换为插入操作:
CREATE TRIGGER person_update INSTEAD OF UPDATE OF login, password, firstname, lastname, email ON person
BEGIN
    INSERT INTO person (login, password, firstname, lastname, email)
    VALUES (new.login, new.password, new.firstname, new.lastname, new.email);
END;

但是它失败了,并出现了上述错误,我不明白为什么。
3个回答

14

我尝试查看源代码(搜索“cannot create INSTEAD OF”),尽管阅读了您在评论中提供的链接,其中详细概述了创建触发器语句,但我认为具有INSTEAD OF功能的触发器仅适用于视图,无法与表格一起使用。


1
是的,这是正确答案。INSTEAD OF触发器仅适用于视图。 - m0skit0
1
触发器可以在视图上创建,也可以在普通表上创建,只需在CREATE TRIGGER语句中指定INSTEAD OF即可。 - Andrei Shender
@NoobSaibot,“胡说八道”这个词在官方的Sqlite文档中有提到。 - ceving

0
希望这只是帖子中的一个笔误,但你的create语句应该如下所示:
INSTEAD OF UPDATE ON

你输入了:

INSTEAD OF UPDATE OF 

不对,语法应该是 INSTEAD OF UPDATE OF column-name ON table-name。请参考这里:http://sqlite.org/lang_createtrigger.html - ceving

0
只需创建一个视图person_view as select * from person,然后将您的触发器指向它即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接