java - 使用触发器停止插入而不将错误传播到服务器端 Java 代码

标签 java sql oracle hibernate plsql

有一个使用 Hibernate 的 Java EE webapp,我无权访问其代码,因此我无法修改或查看它。我只能访问 Oracle 数据库。

我必须根据某些条件创建一个避免插入完成的触发器。这是我现在拥有的 BEFORE INSERT 触发器的相关代码:

...

if var_some_value = :new.another_value
then
    RAISE_APPLICATION_ERROR(-12345, 'The insert will not be executed');
end if;

...

这工作正常,但问题是,这将抛出一个错误,该错误将作为 SQLException 或某种其他类型的异常传播到 webapp 服务器端代码,无论如何。

这不好,因为要求之一是 java webapp 不能注意到插入尚未完成,因此 java 代码不应抛出任何异常。

有没有其他方法可以以更“安静”的方式停止插入行?

也许我应该采用另一种策略,例如 AFTER INSERT 触发器,它会在需要时删除刚刚插入的行。我想为此我需要使用一个自治事务,执行插入并提交它,然后在它满足条件时删除。但如果可能的话,我更愿意使用 BEFORE INSERT 方法。

关于如何做到这一点有什么想法吗?谢谢!

最佳答案

可能实现此目的的唯一方法是创建一个 View 并将应用程序插入到该 View 中。然后, View 上的 instead-of 触发器可以处理 View 上的插入语句,并决定是否实际插入到表中。

关于java - 使用触发器停止插入而不将错误传播到服务器端 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35359618/

相关文章:

java - Jsoup:尝试访问页面时出现错误 307

java - Elasticsearch 因 NoNodeAvailableException 而失败

sql - COALESCE 是实现这一目标的最佳方式吗?

sql - 基本的 T-SQL 问题

c# - 如何在 C# Asp.net 中将 SELECT sql 查询结果保存在数组中

java.sql.SQLException : ORA-01005: null password given; logon denied 异常

Java 总是按值传递,那么为什么我在使用 Array.get(index) 时会得到引用?

java - 将数据插入数据库会卡住我的应用程序

sql-server - 我应该学习 SQL Server 2008 还是 Oracle 11g

sql - CASE WHEN after THEN 或 Select value from another table