Я пытался найти решение очень простой проблемы, но я просто не могу понять, как это сделать. У меня есть две таблицы Transactions
и Credit_Card
.SQL Server триггеры для проверки баланса кредитной карты
Сделки
transid (PK), ccid (FK: to credit_card > ccid), amount, timestamp
CREDIT_CARD
ccid (PK), Balance, creditlimit
Я хочу, чтобы создать триггер так, прежде чем кто-то вставляет транзакцию он проверяет, что сумма сделки + баланс кредитной карты делает не переходите через creditlimit
, и если это так, он отклоняет вставку.
"EDIT" Следующий код сосредоточил свой вопрос, большое спасибо Dan Guzman за вклад!
CREATE TRIGGER TR_transactions
ON transactions FOR INSERT, UPDATE
AS
IF EXISTS(
SELECT 1
FROM (
SELECT t.ccid, SUM(t.amount) AS amount
FROM inserted AS t
GROUP BY t.ccid) AS t
JOIN Credit_Card AS cc ON
cc.ccid = t.ccid
WHERE cc.creditlimit <= (t.amount + cc.balance)
)
BEGIN
RAISERROR('Credit limit exceeded', 16, 1);
ROLLBACK;
END;
, пожалуйста, отредактируйте сообщение с тем, что вы пробовали до сих пор. –
Просьба указать проблему - вы получаете сообщение об ошибке или не работает должным образом? У вас есть тестовый скрипт для воспроизведения проблемы? –
Одна очевидная проблема заключается в том, что, например, таблица 'transaction' будет иметь много записей, но вы попытаетесь загрузить один (случайный) код в' @ ccid'. Это не имеет логического смысла (и, вероятно, дает вам ошибку - ** post it **). Вероятно, вы хотите «вставлен» вместо «транзакций». Делайте что-то по одному за раз, проверяйте каждый шаг, затем переходите к следующему шагу. Также учтите, что триггеры запускаются для ~ всех ~ вставленных строк. У вас может быть 10 строк, вставленных для 10 разных кредитных карт, но только один из них переходит на баланс. Ваш триггер может остановить только ** все ** 10 вставленных записей. –