2012-02-28 14 views
5

Tablodaki bir güncelleştirme için bir tetikleyici oluşturmaya çalışıyorum. Tetikleyicilerin normal kullanımı görünümlerdir, ancak Sqlite kılavuzu, tetikleyici yerine tabloların da geçerli olduğunu söylemektedir. Ancak hatayı alıyorum: , tablosunda INSTEAD OF tetikleyicisi oluşturamaz. Ve nedenini merak ediyorum.Sqlite Hatası: Neden tablodaki INSTEAD OF tetikleyicisi oluşturamıyor?

Ben yabancı tuşlarını kullanın:

PRAGMA foreign_keys = ON; 

Ve İki tablo var. Bir tanımlayıcı tablosu:

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

Ve tanımlayıcıları başvuran bir tablo:

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) 
); 

takın çalışıyor:

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

Şimdi bir güncelleme dönüştürür aşağıdaki tetiği, tanımlamak istediğiniz bir ek içine:

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; 

Ama yukarıdaki hata ile başarısız ve neden anlamıyorum.

INSTEAD OF UPDATE ON 

yazdığınız:

INSTEAD OF UPDATE OF 

cevap

1

bu yazı sadece bir yazım hatası olduğunu, ancak create deyimi okumalısınız umuyorum "INSTEAD OF oluşturulamıyor" için arama) ve create trigger ifadesinin ayrıntılı olarak özetlendiği yorumda bağlantınızı okumanıza rağmen, INSTEAD OF ile tetikleyicilerin yalnızca görünümler için olduğunu ve tablolarla birlikte kullanılamayacağını söyleyebilirim.

+0

Hayır, bu yanlış. Sözdizimi, sütun adı ON tablo adı GÜNCELLENMESİ'NDİR. Buraya bakın: http://sqlite.org/lang_createtrigger.html – ceving

7

Ben the source code geçmekte çalıştı (

+1

Evet, bu doğru cevap. INSTEAD OF tetikleyicileri sadece görüş içindir. – m0skit0

+1

Tetikleyiciler, CREATE TRIGGER deyiminde INSTEAD OF belirtilerek görünümlerin yanı sıra sıradan tablolar üzerinde oluşturulabilir. –

+4

Cidden? Bu biraz saçmalık. +1 –

0

Sadece görünümünüzü oluşturun person_view as select * from person ve tetikleyiciyi üzerine getirin.

İlgili konular