опции для исключений на триггере перед обновлением - PullRequest
0 голосов
/ 24 мая 2019

Я хочу создать два триггера в sqlite. Один триггер для остановки обновлений и один триггер для изменения вставленной даты. Моя проблема заключается в том, что я не могу найти решение обновить введенное значение без активации первого триггера. В sqlite есть возможность отключить триггер или сказать, что обновления не разрешены, без обновлений в одном столбце?

create trigger if not exists update_buchung before update on Buchung <br>
 begin <br>
  select RAISE(FAIL, "UPDATE NOT ALLOWED"); <br>
 end;<br>

 CREATE TRIGGER if not exists insert_buchung AFTER INSERT  ON Buchung <br>
 BEGIN <br>
  update Buchung SET Datum = datetime('now') WHERE ID = NEW.ID; <br>
 END;<br>

1 Ответ

0 голосов
/ 24 мая 2019

Полагаю, вы могли бы покончить с insert_buchung TRIGGER, но вместо этого определите столбец с помощью: -

......., Datum TEXT DEFAULT CURRENT_TIMESTAMP 

или

......., Datime TEXT DEFAULT (datetime('now'))

Рассмотрим: -

DROP TABLE IF EXISTS buchung;
CREATE TABLE buchung (othercolumn TEXT, Datum TEXT DEFAULT (datetime('now')), otherDtaum TEXT DEFAULT CURRENT_TIMESTAMP);
INSERT INTO buchung (othercolumn) VALUES('x'),('y'),('z');
SELECT * FROM buchung;

Это демонстрирует и результат, и результат: -

enter image description here

т.е. Текущее время устанавливается, когда строка (и) вставлена ​​(вставлены).

Однако , insert_buchung TRIGGER может быть ( предложение WHEN предполагает только одно условие ): -

CREATE TRIGGER IF NOT EXISTS update_buchung BEFORE UPDATE ON Buchung
WHEN old.Datum IS NOT NULL -- <<<<<<<<<<<< ADDED
BEGIN
    SELECT RAISE(FAIL, "UPDATE NOT ALLOWED");
END;

Как пример: -

DROP TABLE IF EXISTS buchung;
DROP TRIGGER IF EXISTS update_buchung;
DROP TRIGGER IF EXISTS insert_buchung;
-- CREATE TABLE buchung (othercolumn TEXT, Datum TEXT DEFAULT (datetime('now')), otherDtaum TEXT DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS buchung (ID INTEGER PRIMARY KEY,othercolumn TEXT, Datum TEXT);
CREATE TRIGGER IF NOT EXISTS update_buchung BEFORE UPDATE ON Buchung
    WHEN old.Datum IS NOT NULL
    BEGIN
        SELECT RAISE(FAIL, "UPDATE NOT ALLOWED");
    END;
CREATE TRIGGER IF NOT EXISTS insert_buchung AFTER INSERT ON Buchung 
    BEGIN 
        update Buchung SET Datum = datetime('now') WHERE ID = NEW.ID; 
    END;

INSERT INTO buchung (othercolumn) VALUES('x'),('y'),('z');
SELECT * FROM buchung;

Результат: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...