数据库触发器,是异步的吗?
我计划在我的网站上审核/记录一些事件(例如添加/更新/删除一些表)。我计划添加数据库触发器,我认为随着时间的推移,审计表可能会有大量数据,并且在该表中插入行可能需要更多时间。 我的问题是触发器将异步运行或者是否需要在前端调用返回之前完成?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
几乎可以肯定它们将是同步的,因为否则,您已经破坏了原子性的全部要点(可以原子地对表进行更改,然后触发器可能会失败,这意味着您的审计跟踪是无用的)。
我并不是说异步触发器不可能,但我看不出它们对您有任何用处。
如果您担心表变大,还有其他方法可以解决这个问题。一种是分区(例如基于日期),或者,如果不可用,则定期将审核行传输到基于日期的存档表,然后在主表中将其删除。
这样,主表只保存最近 N 个月的数据,所有其他数据都存储在其他地方。
Almost certainly they would be synchronous since, otherwise, you've blown the whole point of atomicity away (a change may be made to a table atomically then the trigger may fail, meaning that your audit trail is useless).
I'm not saying async triggers aren't possible but I can't see them being of any use to you.
If you're worried about the table getting large, there are other ways to handle that. One is partitioning (based on date for example) or, if that's not available, periodic transfer of audit rows to date-based archive tables, followed by their deletion in the main table.
That way, the main table only ever holds data for the last
N
months and all other data is stored elsewhere.触发器始终是同步的。它们作为事务的一部分运行,无论是显式的(使用
BEGIN TRAN
)还是隐含的(使用 INSERT 等)。在大多数应用程序中,日志记录和审核是强制性的:如果触发器中写入日志或历史表失败,则父 INSERT 等也会失败。
仅当循环编码错误、发送电子邮件或调用 时,触发器才会花费很长时间MS Word 拼写检查器 或
href="http://clicpharmacodebits.wordpress.com/2010/11/27/call-a-web-service-from-sql-server-trigger/" rel="nofollow">调用 您还可以使用 更改数据捕获
Triggers are always synchronous. They run as part of the transaction whether explicit (with
BEGIN TRAN
) or implied (with INSERT etc).In most applications, logging and auditing is mandatory: if the write to a log or history table fails in a trigger, then then parent INSERT etc fails too.
Triggers only a take a long time when coded badly with loops, or sending emails, or invoking the MS Word Spell Checker or calling web services
Instead of triggers you can also use Change Data Capture