我正在为处理可能持有不同货币余额的账户之间的货币交易的数据库编写架构。
如果源帐户和目标帐户的货币与交易的货币相同,我想确保交易成功,否则回滚并发出错误信号。到目前为止,我有:
CREATE TRIGGER transactions_same_currencies BEFORE INSERT
ON "Transactions" FOR EACH ROW
EXECUTE PROCEDURE public.same_currencies();
我将same_currencies()
定义为
DECLARE s integer;
DECLARE d integer;
BEGIN
SELECT s = currency_id
FROM Accounts a
WHERE a.id = NEW.source_id;
SELECT d = currency_id
FROM Accounts a
WHERE a.id = NEW.destination_id;
IF NEW.currency_id <> @s
OR NEW.currency_id <> @d
THEN ROLLBACK TRANSACTION;
END IF;
END;
除了我的代码是否正确之外,我还想知道我是否应该在触发器中执行此操作,以及在何处进行我需要的任何其他验证(我将非负帐户余额写为支票约束)。
答案 0 :(得分:1)
我认为您需要检查数据结构并使用外键引用强制执行此类约束,而不是触发器。
Transactions
表似乎有帐户和交易的货币。每个帐户也有一种货币。您可以通过将(帐户,货币)对作为外键引用来强制执行您想要的操作。这消除了执行触发器的需要。您需要Accounts
中的(帐户,货币)对的索引。