Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在实际项目中使用数据库触发器?_Sql_Entity Framework_Triggers - Fatal编程技术网

Sql 如何在实际项目中使用数据库触发器?

Sql 如何在实际项目中使用数据库触发器?,sql,entity-framework,triggers,Sql,Entity Framework,Triggers,在上一篇文章中,我学到了很多关于触发器和活动数据库的知识,但我对这些真实世界的例子有一些疑问 在工作中,我们将实体框架与ASP.Net和MSSQL服务器结合使用。我们只使用自动生成的约束,不使用触发器 当我听说触发器时,我问自己以下问题: 触发器可以执行哪些任务? e、 g:报告数据的生成:目前报告的数据是在vb中创建的,但我认为触发器也可以处理这个问题。vb中的创建需要很多时间,用户不需要等待,因为这不是他的工作所必需的。 这是一个完美的触发器任务的例子吗 或映射器如何处理触发器操纵的数据?

在上一篇文章中,我学到了很多关于触发器和活动数据库的知识,但我对这些真实世界的例子有一些疑问

在工作中,我们将实体框架与ASP.Net和MSSQL服务器结合使用。我们只使用自动生成的约束,不使用触发器

当我听说触发器时,我问自己以下问题:

  • 触发器可以执行哪些任务? e、 g:报告数据的生成:目前报告的数据是在vb中创建的,但我认为触发器也可以处理这个问题。vb中的创建需要很多时间,用户不需要等待,因为这不是他的工作所必需的。 这是一个完美的触发器任务的例子吗

  • 或映射器如何处理触发器操纵的数据? e、 g:是否有人或映射器识别触发器是否操纵了数据?实体框架似乎缓存了大量数据,因此我不确定在处理框架中的插入/更新/删除之后,如果触发器操纵数据,它是否会读取更新的数据

  • 数据库中应该有多少约束处理? e、 g:有时数据库中的约束似乎比上面的层(vb.net,…)中的约束更容易、更快,但是如何将异常抛出到上层,这些异常可以由OR映射器处理? 是否有一个很好的解决方案来处理任意或映射器中的SQL异常(来自触发器)


  • 提前感谢

    我使用触发器有两个主要目的:审核和更新修改/插入时间。审核时,触发器将数据推送到相关的审核表。这不会以任何方式影响ORM,因为这些表通常不会映射到主数据上下文中(当需要查看审计数据时,会使用单独的审计数据上下文)

    在记录/修改插入/修改时间时,我通常将模型中的那些属性标记为
    [DatabaseGenerated(DatabaseGenerationOptions.Computed)]
    这可以防止在数据层中设置的任何值被保留回DB,并允许触发器正确地强制设置日期时间字段


    我用这种方式管理审计和这些日期并不是一条硬性规定。有时,我需要比数据库本身更多的审计信息,而在数据层处理审计。有时我想强制应用程序更新日期/时间(因为在同一时间更新的多个行/表上,它们可能需要相同)。在这些情况下,我可能会使字段为空,但模型中的
    [必需]
    会强制在模型可以持久化之前设置日期/时间。

    旧的Infomodeler/Visiomodeler ORM(不是您认为的-它是对象角色建模)在生成物理模型时提供了一种替代方法。它将通过触发器提供所有引用完整性。原因有二:

  • 一些DBMS(尤其是Sybase/SQL Server)还没有声明性RI,并且
  • 它可以提供更细粒度的完整性,例如“不超过两个孩子”或“儿子或女儿但不是两个”或“强制性儿子或女儿但不是两个”
  • 因此,触发与模型相关的逻辑的方式与任何RI约束的方式相同。在SQL Server中,它使用RAISERROR处理违规行为


    触发器的一个概念性问题是,它们本质上是上下文无关的——它们总是在不考虑上下文的情况下触发(至少没有太大的麻烦,您最好将它们的逻辑与上下文特定逻辑的其余部分包括在一起)因此,全局域约束是我发现它们唯一有用的地方——我想这是识别“引用完整性”的另一种通用方法。

    当你听说一个新工具或设备时,并不意味着你必须到处使用它。您应该考虑应用程序的设计

    当逻辑在数据库中时,触发器被大量使用,但是如果您在数据库的顶部构建ORM层,那么您希望使用ORM在业务层中使用逻辑。这并不意味着你不应该使用触发器。这意味着您应该以与存储过程或数据库函数相同的方式将它们与ORM一起使用——只有在有意义或提高性能时才使用。若你们将大量的逻辑传递给数据库,你们可以扔掉ORM,也许整个业务层,使用两层架构,UI将直接与数据库对话,数据库将完成你们需要的一切——这种架构被认为是“旧的”

  • 当使用ORM触发器时,它对某些DB生成的数据(如审核列或主键值的自定义序列)很有帮助
  • 当前ORM大多不喜欢触发器-它们只能对当前处理的记录的更改做出反应,因此,例如,如果您保存订单记录,并且您的更新触发器将修改所有订单项,则无法自动让ORM知道这一点-您必须手动重新加载数据。在EF中,在数据库中修改或生成的所有数据必须设置为
    StoreGeneratedPattern.Identity
    StoreGeneratedPattern.Computed
    -EF完全遵循数据库或应用程序中的逻辑模式。一旦定义了在数据库中分配的值,就不能在应用程序中更改它(它不会持久化)
  • 应用程序逻辑应该负责数据验证,并且只有在验证通过时才调用持久性。当您可以预先知道事务将失败时,应该避免不必要的事务和到数据库的往返

  • 触发器用于维护数据的完整性和一致性(通过使用约束),帮助数据库设计者确保某些操作已完成,并创建数据库更改日志

    例如,给定数值输入,如果希望将值限制为小于100,则可以编写一个触发器,在更新或插入时为每一行触发,如果