Почему ошибка Sqlite: невозможно создать триггер INSTEAD OF для таблицы? - PullRequest
6 голосов
/ 28 февраля 2012

Я пытаюсь создать триггер вместо обновления для таблицы.Обычно триггеры вместо «вместо» используются в представлениях, но в руководстве по Sqlite говорится, что триггеры «вместо» также действительны для таблиц.Но я получаю ошибку: не может создать триггер INSTEAD OF для таблицы .И мне интересно, почему.

Я использую внешние ключи:

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 ]

10 голосов
/ 18 июля 2012

Я попытался просмотреть исходный код (поиск "невозможно создать INSTEAD OF"), и, несмотря на прочтение вашей ссылки в комментарии, где инструкция создания триггера обрисована в общих чертах, я бы сказал, что триггерыс INSTEAD OF предназначены только для представлений и не могут использоваться с таблицами.

1 голос
/ 29 февраля 2012

Я надеюсь, что это просто опечатка в сообщении, но ваше create утверждение должно выглядеть так:

INSTEAD OF UPDATE ON

вы ввели:

INSTEAD OF UPDATE OF 
0 голосов
/ 02 сентября 2015

Просто создайте представление person_view as select * from person и наведите на него свой триггер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...