2010-07-12 16 views
5

Estoy trabajando en la configuración de una base de datos SQLite simple para acceder a través de Python. Hasta ahora tengo una tabla básica y un par de factores desencadenantes: quiero tener una actualización de activación en una columna de campo 'fecha_añadir' cuando se agrega un nuevo registro, y otra para actualizar una columna 'fecha_actualizada' cuando se actualiza posteriormente un registro . Aquí está mi sintaxis SQLite para los disparadores:sqlite ¿ACTUALIZACIÓN dispara el disparo en las instrucciones INSERT también?

CREATE TRIGGER add_contact AFTER INSERT ON contact_info 
BEGIN 
    UPDATE contact_info SET date_added = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

CREATE TRIGGER update_contact AFTER UPDATE ON contact_info 
BEGIN 
    UPDATE contact_info SET date_updated = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

El disparador 'add_contact' parece estar funcionando bien ... se dispara cuando agrego un nuevo registro a través de un comando SQL de inserción, como estaba previsto.

El problema parece ser el desencadenante 'update_contact' ... se dispara tanto cuando actualiza un registro a través de un comando SQL UPDATE (como estaba previsto) y cuando agrego un nuevo récord también:

es decir, cuando agrego un nuevo récord consigo esto en las columnas 'DATE_ADDED' y '' date_updated:

2010-07-12 05:00:06|2010-07-12 05:00:06 

y cuando puedo actualizar ese registro, cambia así:

2010-07-12 05:00:06|2010-07-12 05:14:26 

Supongo que no entiendo por qué el disparador de ACTUALIZACIÓN también se activa en INSERTAR?

TIA,

Monte

Editado para agregar: ¿Alguna pista sobre cómo hacer que funcione como se pretende?

Respuesta

6

Tiene una ACTUALIZACIÓN en su gatillo INSERTAR. Entonces INSERT causa una ACTUALIZACIÓN. Que has enganchado con un gatillo diferente.

+0

¡Vaya! Veo lo que quiere decir;) ¿Alguna idea de cómo lograr los objetivos originales de dos disparadores separados, uno que se activa en un INSERT y otro que se activa en ACTUALIZAR? Parece que si hubo una forma de activar el activador 'update_contact' en la actualización de cualquier campo * excepto * date_added, eso debería hacerlo. Simplemente no estoy seguro de cómo hacerlo ... – memilanuk

+1

@memilanuk: ¿Podría comparar OLD.date_added con NEW.date_added en su activador UPDATE? – Borealid

+1

Solo una actualización de un hilo antiguo, ya que hoy volví a jugar con el código en cuestión. Cambié el código de activación para leer: ACTUALIZACIÓN contact_info SET date_updated = DATETIME ('AHORA') WHERE pkid = new.pkid AND DATETIME ('NOW')! = Date_added; Parece que funciona. ¡Gracias por el empujón en la dirección correcta! – memilanuk

8

Una mejor manera de evitar el problema original es utilizar una cláusula DEFAULT (DATETIME('NOW')) para la columna DATE_ADDED en la definición de tabla, en lugar de utilizar un disparador INSERT.

+2

Y asegúrese de que las instrucciones * no * INSERT incluyan la columna fecha_agregada. SQLite3 no parece ejecutar cláusulas DEFAULT cuando se inserta NULL para una columna determinada. –

Cuestiones relacionadas