Sql 在插入时验证金融交易

Sql 在插入时验证金融交易,sql,postgresql,Sql,Postgresql,我正在为一个数据库编写模式,该数据库处理可能持有不同货币余额的账户之间的货币交易 我希望确保只有当源帐户和目标帐户的货币与事务的货币相同时,事务才会成功,否则回滚并发出错误信号。到目前为止,我已经: CREATE TRIGGER transactions_same_currencies BEFORE INSERT ON "Transactions" FOR EACH ROW EXECUTE PROCEDURE public.same_currencies(); 其中,我将相同的货币

我正在为一个数据库编写模式,该数据库处理可能持有不同货币余额的账户之间的货币交易

我希望确保只有当源帐户和目标帐户的货币与事务的货币相同时,事务才会成功,否则回滚并发出错误信号。到目前为止,我已经:

CREATE TRIGGER transactions_same_currencies BEFORE INSERT
   ON "Transactions" FOR EACH ROW
   EXECUTE PROCEDURE public.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;
声明s整数;
声明d整数;
开始
选择s=货币\u id
从帐户a
其中a.id=新的.source\u id;
选择d=货币\u id
从帐户a
其中a.id=新的.destination\u id;
如果是新的,则为.currency_id@s
或新的。货币_id@d
然后回滚事务;
如果结束;
结束;

除了我的代码是否正确之外,我还想知道我是否应该在触发器中执行此操作,以及在何处放置我需要的任何其他验证(我编写了非负帐户余额作为检查约束)。

我认为您需要检查数据结构,并使用外键引用强制执行此类约束,而不是一个触发器


交易
表似乎同时包含交易的账户和货币。每个帐户也有一种货币。您可以通过将(帐户、货币)对作为外键引用来强制执行所需内容。这样就不需要强制执行触发器。您需要在
账户

中的(账户、货币)对上建立索引,谢谢!我使用了
创建唯一索引
。鉴于“account”已被索引,是否可以只对
Accounts
中的(account、currency)设置唯一约束,而不添加索引?@topynate。唯一约束是使用唯一索引实现的,因此无法避免索引。