1
私はのsqlite3データベースに次のスキーマを持っています。SQLトリガー:更新の前に
これは、製品に対するユーザーの入札価格を格納し、アプリケーションコードから有効性チェックをオフロードするために使用するトリガーです。
ここでの目標は、新しい入札単価が前回の入札額よりも大きいかどうかを確認し、そうでない場合はアプリケーションにエラーを発生させることです。 INSERT
ではうまくいきますが、UPDATE
は、NEW.amount
が実際には特定の商品の最大入札価格であってもエラーが発生します。
トリガがデバッグできないため、なぜこのようなことが起こっているのかわかりません。これについての提案もまた非常に高く評価されます。
CREATE TABLE IF NOT EXISTS bids (
amount INTEGER NOT NULL,
product_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
submitted DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER IF NOT EXISTS trig_beforeinsert BEFORE INSERT ON bids
BEGIN
SELECT CASE
WHEN
((SELECT MAX(amount) FROM bids WHERE product_id = NEW.product_id) >= NEW.amount)
THEN
RAISE (FAIL, "invalid amount")
END;
END;
CREATE TRIGGER IF NOT EXISTS trig_beforeupdate_amount BEFORE UPDATE OF amount ON bids
BEGIN
SELECT CASE
WHEN
((SELECT MAX(amount) FROM bids WHERE product_id = OLD.product_id) >= NEW.amount)
THEN
RAISE (FAIL, "invalid amount")
END;
END;