SQL, триггеры... Видел что есть там ключевые слова CASE, WHEN - THEN. Похоже на условные конструкции. Значит (...)
Celtic Hammer
Мудрец
(15908),
на голосовании
1 месяц назад
... есть там условия. Как тут тогда прописать в триггер какое-нибудь условие? Например выполнить INSERT INTO users_log (id,old_name,old_surname, old_age) VALUES (NULL, OLD.name , OLD.surname, OLD.age); только в том случае если поле OLD.name имеет значение допустим 'Григорий'... Прямая попытка с этим CASE выдала ошибку.. Он наверное для нескольких условий, а не для одного. Или что там?
import sqlite3 as sq
with sq.connect("test10.db") as con: cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS users2")
cur.execute("""CREATE TABLE IF NOT EXISTS users2 ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, surname TEXT, age INTEGER ) """)
cur.execute("""CREATE TABLE IF NOT EXISTS users_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, old_name TEXT, old_surname TEXT, old_age INTEGER ) """)
cur.execute(""" CREATE TRIGGER IF NOT EXISTS log BEFORE UPDATE ON users2 BEGIN INSERT INTO users_log (id,old_name,old_surname, old_age) VALUES (NULL, OLD.name, OLD.surname, OLD.age); END; """)
cur.execute("INSERT INTO users2 (id,name,surname, age) VALUES (NULL, 'Иван','Самарин', 67)") cur.execute("INSERT INTO users2 (id,name,surname, age) VALUES (NULL, 'Алесандр','Синицин', 40)") cur.execute("INSERT INTO users2 (id,name,surname, age) VALUES (NULL, 'Григорий','Петров', 36)") cur.execute("INSERT INTO users2 (id,name,surname, age) VALUES (NULL, 'Федор','Васильев', 10)")
cur.execute("UPDATE users2 SET age = age + 3 WHERE surname LIKE 'Петров'")
cur.execute("SELECT * FROM users2 WHERE surname LIKE 'Петров'") res = cur.fetchall() print(res) cur.execute("SELECT * FROM users_log") res = cur.fetchall() print(res)
CASE используется в селектах. Триггер можно так нарисовать:
CREATE TRIGGER IF NOT EXISTS log BEFORE UPDATE ON users2 WHEN OLD.name = 'Григорий' BEGIN INSERT INTO users_log (id, old_name, old_surname, old_age) VALUES (NULL, OLD.name, OLD.surname, OLD.age); END;
INSERT INTO users_log (id,old_name,old_surname, old_age) VALUES (NULL, OLD.name , OLD.surname, OLD.age);
только в том случае если поле OLD.name имеет значение допустим 'Григорий'...
Прямая попытка с этим CASE выдала ошибку..
Он наверное для нескольких условий, а не для одного. Или что там?