2012-02-28 17 views
5

テーブルの更新の代わりにトリガを作成しようとしています。代わりのトリガーの通常の使用はビューですが、Sqliteのマニュアルによれば、トリガーの代わりにトリガーもテーブルに対して有効です。しかし、私はエラーが発生します:テーブルにトリガのINSTEADを作成できません。そしてなぜ私は不思議に思っています。なぜSqliteエラー:テーブルのINSTEAD OFトリガを作成できませんか?

私は外部キーを使用します。

PRAGMA foreign_keys = ON; 

をそして私は2つのテーブルを持っています。識別子テーブル:

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; 

しかし、上記のエラーで失敗し、なぜ私は理解していません。

答えて

1

私は、これはポストでちょうどタイプミスですが、あなたのcreate文が読まなければならないことを願っています:

INSTEAD OF UPDATE ON 

あなたが入力した:

INSTEAD OF UPDATE OF 
+0

これは間違っています。構文は、INSTEAD OF UPDATE OF列名ONの表名です。こちらをご覧ください:http://sqlite.org/lang_createtrigger.html – ceving

7

は私がthe source codeを通過しようとしました( 「INSTEAD OFを作成できません」を検索してください)、作成トリガーステートメントが非常に詳細に説明されているコメント内のリンクを読んでいるにもかかわらず、INSTEAD OFのトリガーはビューのみであり、テーブルでは使用できません。

+1

はい、これは正解です。 INSTEAD OFトリガーはビューのためのものです。 – m0skit0

+1

トリガーは、CREATE TRIGGERステートメントでINSTEAD OFを指定することによって、ビューおよび通常の表で作成することができます。 –

+4

真剣に?それはいくつかの間違いです。 +1 –

0

ビューperson_view as select * from personを作成し、トリガーをポイントするだけです。