2012-02-28 10 views
5

Intento crear un disparador en lugar de una actualización en una tabla. El uso normal de desencadenantes en lugar de desencadenantes es vistas, pero el manual de Sqlite dice que, en su lugar, los desencadenadores también son válidos para las tablas. Pero obtengo el error: no se puede crear el activador INSTEAD OF en la tabla. Y me pregunto por qué.¿Por qué error de Sqlite: no se puede crear el activador INSTEAD OF en la tabla?

Puedo utilizar claves externas:

PRAGMA foreign_keys = ON; 

y tengo dos tablas. Una tabla de identificadores:

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

Y una tabla que hace referencia a los identificadores:

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

Insertar funciona bien:

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

Ahora quiero definir el siguiente trigger, que convierte una actualización en una inserción:

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; 

Pero falla con el error anterior y no entiendo por qué.

Respuesta

1

Estoy esperando que esto es sólo un error tipográfico en el puesto, pero su estado de create debe decir:

INSTEAD OF UPDATE ON 

que has proporcionado:

INSTEAD OF UPDATE OF 
+0

No, esto es incorrecto. La sintaxis es EN LUGAR DE ACTUALIZACIÓN DE nombre-columna ACTIVADO nombre-tabla. Vea aquí: http://sqlite.org/lang_createtrigger.html – ceving

7

He intentado pasar por the source code (busque "no se puede crear EN LUGAR DE") y a pesar de leer su enlace en el comentario donde se describe detalladamente la declaración de desencadenador de creación, diría que los desencadenantes con INSTEAD OF son solo para vistas y no se pueden usar con tablas.

+1

Sí, esta es la respuesta correcta. EN LUGAR DE desencadenadores son solo para vistas. – m0skit0

+1

Se pueden crear desencadenantes en las vistas, así como en las tablas ordinarias, especificando INSTEAD OF en la instrucción CREATE TRIGGER. –

+4

en serio? Eso es una mierda. +1 –

0

Solo crea una vista person_view as select * from person y apúntate a ella.

Cuestiones relacionadas