Oracle中的触发器是请求的一部分吗?
Posted
技术标签:
【中文标题】Oracle中的触发器是请求的一部分吗?【英文标题】:Is trigger in Oacle the part of request? 【发布时间】:2020-10-03 20:14:50 【问题描述】:我使用 Spring Repository 和 Oracle DB。 我有一个表并在插入/更新/删除时触发。如果我对表执行一些插入/删除/更新并触发器得到一个 SQL 错误(锁定资源或其他东西),Repository 方法会出现异常吗?还是 Oracle 触发器作为插入/删除/更新语句的单独部分执行?
【问题讨论】:
我不能专门为 Spring 说话,但它应该。如果触发器产生错误,则事务失败,调用代码应该知道这一点。 【参考方案1】:我不知道 Spring Repository,但我知道在 - 例如:Oracle Forms、Application Express、Reports - 触发器错误会一直向上传播。 一切在这种情况下都会停止。
假设我有一个表格并输入一些数据。数据库触发器触发并尝试执行它所做的任何操作,但它以raise_application_error
失败。什么都没有完成,我在表单中看到错误,例如“ORA-20001:我的自定义错误”。
因此,我认为您在 Spring Repository 中也会遇到同样的情况。毕竟,测试它不会花费太多,对吧?如果可以的话我会,但我不能这样做 - 自己做。
【讨论】:
【参考方案2】:当您尝试将数据插入表时,您的 Spring 存储库将出错。如果我们的关联触发器中有任何错误,我们的 DML 命令将不会执行。
我主要在我的 PLSQL 过程中使用 DML 进行插入,并使用 GET_LOCKED_TRANSACTION() 过程来检查是否有任何资源忙。
FUNCTION GET_LOCKED_TRANSACTION ( P_WIP_ENTITY_ID IN NUMBER, P_PRODUCTION_NOTE_NUMBER IN NUMBER ) 返回布尔值是 ROW_LOCKED 异常; PRAGMA EXCEPTION_INIT(ROW_LOCKED, -54); 开始 /* 带有 noWAIT 属性的光标 */ 对于抄送输入(选择 * 从我的表 WIP_ENTITY_ID = P_WIP_ENTITY_ID 现在更新)循环 空值; 结束循环; 返回错误; 例外 当 ROW_LOCKED 时 返回真; 结束 GET_LOCKED_TRANSACTION;
【讨论】:
以上是关于Oracle中的触发器是请求的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章