Top.Mail.Ru
Ответы

SQL, триггеры... Видел что есть там ключевые слова CASE, WHEN - THEN. Похоже на условные конструкции. Значит (...)

... есть там условия. Как тут тогда прописать в триггер какое-нибудь условие? Например выполнить
INSERT INTO users_log (id,old_name,old_surname, old_age) VALUES (NULL, OLD.name , OLD.surname, OLD.age);
только в том случае если поле OLD.name имеет значение допустим 'Григорий'...
Прямая попытка с этим CASE выдала ошибку..
Он наверное для нескольких условий, а не для одного. Или что там?

123456789101112131415161718192021222324252627282930313233343536373839404142434445
 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) 
 
По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект
11мес

CASE используется в селектах. Триггер можно так нарисовать:

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