如何在现实世界的项目中使用数据库触发器?

如何解决如何在现实世界的项目中使用数据库触发器?

| 在上一个弱点中,我已经学到了很多有关触发器和活动数据库的知识,但是我对现实世界中的示例有一些疑问。 在工作中,我们将实体框架与ASP.Net和MSsql Server一起使用。我们只使用自动生成的约束,而没有触发器。 当我听说触发器时,我问自己以下问题: 触发器可以执行哪些任务? 例如:报告数据的生成:目前,报告的数据是在vb中创建的,但我认为触发器也可以处理此问题。在vb中创建文件会花费很多时间,并且用户不需要等待它,因为这对于他的工作不是必需的。 这是触发器完美任务的一个例子吗? OR-Mapper如何处理触发操作的数据? 例如:OR-Mapper是否可以识别触发器是否操纵了数据?实体框架似乎缓存了很多数据,因此,在处理来自框架的插入/更新/删除操作之后,如果触发器操作数据,我不确定它是否读取更新的数据。 数据库中应进行多少约束处理? 例如:有时数据库中的约束似乎比上一层(vb.net,...)更加容易和快捷,但是如何将异常抛出到OR-Mapper可以处理的上层呢? 是否有一个很好的解决方案,可以在任何OR-Mapper中处理sql异常(来自触发器)? 提前致谢     

解决方法

        当您听说新工具或功能时,并不表示您必须在任何地方使用它。您应该考虑应用程序的设计。 当逻辑在数据库中时,会使用很多触发器,但是如果您在数据库之上构建ORM层,则需要使用ORM在业务层中使用逻辑。这并不意味着您不应该使用触发器。这意味着您应该以与存储过程或数据库函数相同的方式将它们与ORM一起使用-仅在有意义或提高性能时才使用。如果您将大量逻辑传递给数据库,则可以丢弃ORM,甚至可以丢弃整个业务层,并使用两层体系结构,其中UI将直接与数据库进行通信,这将满足您的所有需求-这种体系结构被认为是“旧的”。 使用ORM触发器时,对于某些数据库生成的数据(例如审核列或自定义主键值序列)可能会有所帮助。 当前的ORM大多不喜欢触发器-它们只能对当前处理的记录的更改做出反应,因此,例如,如果您保存了订单记录,并且更新触发器将修改所有订购的商品,则没有自动的方法让ORM知道-必须手动重新加载数据。在EF中,数据库中所有修改或生成的数据都必须设置为“ 0”或“ 1”-EF完全遵循模式,即逻辑在数据库中还是在应用程序中。一旦定义了在数据库中分配的值,就无法在应用程序中更改它(该值将不会持久)。 您的应用程序逻辑应仅对验证通过负责数据验证和调用持久性。当您事先知道事务将失败时,应避免不必要的事务和数据库往返。     ,        我将触发器用于两个主要目的:审核和更新修改/插入时间。审计时,触发器将数据推送到相关的审计表。这不会以任何方式影响ORM,因为这些表通常不会映射到主数据上下文中(需要在单独的审核数据上下文中查看审核数据)。 在记录/修改插入/修改时间时,我通常将模型中的那些属性标记为“ 2”。这可以防止将数据层中设置的任何值持久化回数据库,并允许触发器正确地设置DateTime字段。 我以这种方式管理审计和这些日期并不是一个硬性规定。有时,我需要的审核信息比数据库本身可用的更多,而需要在数据层中处理审核。有时我想强制应用程序更新日期/时间(因为在同一时间更新的几行/表中它们可能需要相同)。在那些情况下,我可能使该字段可为空,但是模型中的“ 3”会强制设置日期/时间,然后才能保留该模型。     ,旧的Infomodeler / Visiomodeler ORM(不是您想的那样-对象角色建模)在生成物理模型时提供了一种替代方法。它将通过触发器提供所有参照完整性。有两个原因: 某些dbmses(尤其是Sybase / SQL Server)还没有声明性的RI,并且 它可以提供更精细的完整性-例如“不得超过两个孩子”或“儿子或女儿,但不能两个都”或“强制性儿子或女儿,但不能两个都”。 因此,以与任何RI约束相同的方式触发与模型相关的逻辑。在SQL Server中,它使用RAISERROR处理违规行为。 触发器的一个概念性问题是,它们基本上是无上下文的-不论上下文如何,它们总是会触发(至少不会造成很大的痛苦,并且您最好将它们的逻辑与上下文相关的其余逻辑一起包括在内。)因此,全局域约束是我发现它们唯一有用的地方-我猜这是识别“参照完整性”的另一种通用方法。     ,        触发器用于维护数据的完整性和一致性(通过使用约束),帮助数据库设计人员确保完成某些操作并创建数据库更改日志。 例如,给定数字输入,如果希望将值限制为小于100,则可以编写一个触发器,该触发器将在更新或插入时为每一行触发,如果该列的值不等于,则会引发应用程序错误遇到那个矛盾。 假设您要将历史更改记录到表中。您可以创建一个触发器,在每个INSERT,UPDATE和DELETE之后触发,该触发器还将数据插入到日志表中。如果您需要执行自定义的自定义逻辑,那么触发器可能会吸引您。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?