#sqlite
Вопрос:
Вот мой текущий код sqllite для создания базы данных:
CREATE TABLE users(
user_id INT,
channel_id INT NOT NULL UNIQUE,
PRIMARY KEY (user_id)
);
CREATE TABLE credits(
user_id INT,
number_of_items INT CHECK(number_of_items > 0),
expiration DATETIME,
PRIMARY KEY (user_id, number_of_items, expiration),
FOREIGN KEY (user_id) REFERENCES users (user_id)
);
CREATE TABLE users_items(
user_id INT,
item_id INT,
PRIMARY KEY (user_id, item_id),
FOREIGN KEY (user_id) REFERENCES users (user_id)
);
а вот код для триггера, который я пытаюсь создать
CREATE TRIGGER check_has_enough_credits_to_monitor_item
BEFORE INSERT ON users_items
BEGIN
SELECT
CASE
WHEN (SELECT COUNT(*) FROM users_items WHERE user_id = NEW.user_id) >=
(SELECT sum(number_of_items) FROM credits WHERE user_id = NEW.user_id AND expiration >= datetime('now'))
THEN RAISE (ABORT, 'No more items allowed')
END;
END;
В моей базе данных у каждого пользователя есть кредиты, которые хранятся в credits
таблице. Эти кредиты позволяют вводить определенное количество предметов users_items
, но также с ними связан срок действия этих кредитов. Я хочу сгенерировать триггер, который не позволит пользователю добавлять запись user_items
, если у него недостаточно кредитов (срок действия которых еще не истек), но я получаю следующие ошибки на своей скрипке:
Schema Error: Error: SQLITE_ERROR: incomplete input
Schema Error: Error: SQLITE_ERROR: cannot commit - no transaction is active