如何在触发器中创建警告消息?

问题描述

是否可以在 Firebird 2.5 的触发器中创建警告消息?

我知道我可以创建一个异常消息来阻止用户保存记录更改,但在这种情况下,我不介意用户是否继续。

我可以调用生成消息的过程吗?

解决方法

Firebird 没有在 PSQL 代码中产生警告的机制,你只能引发异常,这在触发器中会导致触发触发器的已执行语句的效果被撤消。

简而言之,这是不可能的。

有可能的变通方法,但这些需要“外部”协议,例如,将警告消息插入全局临时表,要求调用代码在执行后从该临时表中显式选择。

,

SQL 模型确实提供将查询置于暂停状态,然后等待来自客户端的额外输入来解冻或使其失败。 SQL 不是用户交互式服务,也没有确认对话框。您必须重新考虑您的应用程序设计。


一种可能的途径,名义上保留在 2 层客户端 - 服务器框架中,将为您要保存的所有数据(例如事务范围 GTT)创建临时表,然后有两个存储过程。一个 SP 将进行完整性检查并返回警告列表(如果有)。然后,另一个 SP 会将数据从 GTT 转储到主持久表中,而无需进行这些检查。

您的客户端应用程序将首先select来自 check-SP 的警告,如果它返回任何警告,然后将它们显示给用户,然后调用 save-SP 并提交,或者不调用 save-SP 进行回滚。>

这是滥用 C/S 的想法,所以会有龙。首先,您必须有几个 GTT 和两个 SP,用于在您的应用中保存 E-V-E-R-Y 可暂停数据。这可能很多。

另外,请注意,在调用 check-SP 之后和调用 save-SP 之前,数据库数据可能会改变。因为在其他地方运行的某些其他应用程序可能会在暂停期间更改和提交数据。特别是如果您的交易是 READ COMMMITTED 类型的。但也有 SNAPSHOT tx。


更好的方法是放弃 C/S 方案并转到 3 层模型,AKA 多层模型,AKA“应用程序服务器”。这样您的客户端应用程序将数据的“公文包”发送到应用程序服务器,它将由应用程序服务器(而不是 SQL 触发器)执行所有数据验证,然后将其保存到数据存储后端、SQL 或任何其他。

当然,仍然存在那个问题,数据可能已被其他用户更改,为什么您暂停一个用户并等待他阅读并做出决定。但是,与使用普通 SQL 相比,应用服务器在数据协调方面具有更大的灵活性。