TSQL 使触发器静默失败

2024-03-25

我在插入后触发器中有一些代码可能会失败。这样的失败并不重要,应该not回滚事务。如何捕获触发器内的错误并让事务的其余部分正常执行?

下面的例子说明了我的意思。触发器故意创建一个错误条件,结果是原始插入 ( "1" ) 永远不会插入到表中。 Try/Catch 似乎没有起到作用。一个相似的,较旧的堆栈溢出问题 https://stackoverflow.com/questions/970266/handle-error-in-sql-trigger-without-failing-transaction除了“首先防止错误发生”之外,没有给出答案 - 这并不总是可能/容易的。

还有其他想法吗?

create table test 
(
  a int not null
);
go

create trigger testTrigger on test 
after insert as 
begin 
  insert into test select null;
end;
go

insert into test values ( 1 );

触发器不能失败并且仍然可以使事务前滚。您有几个选项可以确保触发器不会失败。

1 - 您可以通过重复检查约束的逻辑并且不尝试违反约束的操作来确保之后不会失败:

i.e.

INSERT INTO test WHERE val IS NOT NULL

2 - 您可以通过使用队列设计模式来推迟可能失败的操作,其中可能会或可能不会失败的操作通过排队到排队操作不可能失败的表来排队。

i.e.

INSERT INTO ACTION_QUEUE (action, parameters) VALUES ('INSERT INTO TEST', val)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TSQL 使触发器静默失败 的相关文章

随机推荐

  • C/C++ va_list 未正确返回参数

    我在使用 va list 时遇到问题 下面的代码适用于 int main int f1 1 float m function n f1 float function int n va list mem list va start mem l
  • 有没有更短更简洁的方法来用Javascript隐藏和显示div?

    我正在创建一个仪表板 其中包含大约 20 个以 display none 开头的 div 当使用侧边栏中的 onClick 时 它将显示特定的 div 并隐藏所有其他 div 我使用了为每个 div 创建一个函数的经典解决方案 但是 它非常
  • 为什么我的输入值没有用 React 更新?

    我的组件中有以下代码 当我更新某些内容时 它会被调用 从而替换 UI 中的一堆内容 除了用户看到的输入值之外 所有内容都在更新 let input id discount geo segment value percentage disab
  • Javascript,从“”中删除类的最快方法

    我有一个 body 元素 在上面添加了一些类 我想删除no javascript在浏览器读取它之后 从中获取类 好吧 既然之间的额外空格并不重要 我会说 document body className document body class
  • 如何在 Jetpack Compose 中监听生命周期

    我正在使用 Jetpack Compose 创建一个应用程序 该应用程序在后台进行一些网络搜索 如果用户决定按后退按钮 我想取消搜索 所以我用了DisposableEffect Composable fun SecondScreen val
  • 操作栏上没有显示操作按钮? [复制]

    这个问题在这里已经有答案了 我正在关注以下教程开发者 android com http developer android com并尝试在操作栏上添加项目 尽管我添加了所有代码 但搜索操作显示为溢出元素而不是操作按钮元素 我尝试了带有软键盘
  • 从 MySQL 中选择随机行(有概率)

    我有一个 MySQL 表 其中有一行名为 cur odds 它是一个百分比数字 表示该行被选中的百分比概率 例如 当您运行 100 个查询时 如何进行查询以大约该频率实际选择行 我尝试了以下操作 但概率为 0 35 的行最终在大约 60 7
  • 在 cordova/on android 应用程序中,使用 https 的请求失败,但使用 http 的相同请求成功

    我有一个可以通过两个端口访问的后端服务器 一个使用 HTTP 另一个使用 HTTPS 它使用自签名证书 从我的 ionic cordova 混合应用程序中 当我使用 HTTP 请求运行时 它们都成功了 在第一次请求期间 我还添加了基本授权
  • jquery mobile在手机间隙中实现方向改变事件

    有人可以让我知道手机间隙中 jquery mobile 方向改变事件的正确代码吗 我在哪里以及如何实现这个orientationChange函数 window bind orientationchange orientationHandle
  • Python Selenium(等待帧、元素查找)

    我有这些包括 from selenium import webdriver from selenium common exceptions import NoSuchElementException from selenium webdri
  • Python-替换 CSV 文件中的行值

    我有这个数据集 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 XXXX XXXX 0 基本上我想在每次运行程序后将第二
  • Rails 3.0.9 + Devise + Cucumber + Capybara 臭名昭著的“没有路线匹配 /users/sign_out”

    我正在使用 devise 1 4 2 和 Rails 3 0 9 cucumber rails 1 0 2 capybara 1 0 0 我有No route matches users sign out 当我点击注销时出现错误 我添加了
  • 为什么 git stash pop 说它无法从存储条目恢复未跟踪的文件?

    我有很多分阶段和未分阶段的更改 我想快速切换到另一个分支 然后再切换回来 所以我使用以下方法进行了更改 git stash push a 事后看来我可能可以使用 include untracked代替 all 然后 当我去弹出存储时 我收到
  • 子表单根据主表单的ID新建记录

    首先我想说 我是 Access 的初学者 我将感谢我能得到的每一点帮助 我创建了一个表单 显示一个带有三个子表单的表中的记录 记录和子表单具有一对多的关系 我现在正在为每个子表单创建按钮 以便在子表单中创建新记录 我已成功制作按钮并使用宏生
  • 为什么在函数堆栈上返回值不安全

    我在阅读 bruce eckel 时遇到了以下段落 他试图解释为什么函数在堆栈上返回值不安全 现在想象一下如果一个普通函数尝试在堆栈上返回值会发生什么您不能触及返回地址上方堆栈的任何部分 因此该函数必须将值推入返回地址下方 但是当执行汇编语
  • EF核心中的持久数据层,动态EF。将 EF 与模型分开

    我想将 EF 层与我的模型分开 我需要一个 EF Builder 将我的模型发送给它 如下所示 我找到了 mongodb 的代码 但我需要 EF core builder AddMongo builder AddMongoRepositor
  • awk 或 sed CSV 文件操作

    a004 1b North at006754 a004 1c south atytgh0 a004 1d east atrthh a010 1a midwest atyu a010 1b south rfg67 我想打印第一列和第二列 没有
  • 使用 grunt 构建的 Angular 应用程序中缺少资产

    我使用 Yeoman 和 AngularJS 以及所有与之相关的东西 如 Grunt 和 Bower 构建了一个应用程序 当使用本地运行时 一切都完美运行grunt serve 然而 在运行 grunt 并部署应用程序后 有一些丢失的资产
  • 嵌入式 MongoDB 文档在使用 C# 驱动程序保存时未获取 ID

    当我有一个包含文档列表的根文档并且我保存 插入时 根文档总是从 MongoDB 获取 ID 但列表中的文档不会 它们与ObjectId Empty 我不确定我是否做错了什么或者这是否是有意的行为 这是我正在尝试做的事情的一个例子 鉴于课程
  • TSQL 使触发器静默失败

    我在插入后触发器中有一些代码可能会失败 这样的失败并不重要 应该not回滚事务 如何捕获触发器内的错误并让事务的其余部分正常执行 下面的例子说明了我的意思 触发器故意创建一个错误条件 结果是原始插入 1 永远不会插入到表中 Try Catc