我目前正在玩弄的想法具有历史表一些我的表在我的数据库。基本上,我们的主要表和一个副本,表与修改后的日期和一个行动列于存储什么行动预制例如更新、删除并插入。

迄今我能想到的三个不同的地方,你可以做的历史表的工作。

  • 触发器上的主要表进行更新,插入和删除。(数据库)
  • 存储程序。(数据库)
  • 应用层。(应用程序)

我的主要问题是,哪些是优点、缺点和问题的工作在每个这些层。

一个优点我能想到的使用的触发方式是,诚信是始终保持无论什么样的程序是implmentated上的数据库。

有帮助吗?

解决方案

我把它放这种方式:

  • 储存过程: 他们绕过如果你修改表格。安全数据库上可以控制这个
  • 应用程序: 同样处理。此外,如果有多个应用程序,可能在不同的语言,就需要将实施在每个堆,这是有点多余;和
  • 触发器: 透明的程序,并将捕获的所有变化。这是我的首选方法。

其他提示

触发器是最快和最容易的方式实现了简单的历史。下述信息承担更复杂的例子在历史上处理可包括一些业务规则和可能需要登录的信息没有发现在表被跟踪。

那些认为触发安全比sprocs因为他们不可能绕过我提醒他们,他们正在做的以下假设:

!) 权限的存在,停止用户执行禁用触发[但后权限可能也存在于限制所有进入该数据库除了执行上sprocs这是一种常见的模式为企业应用程序],因此必须假设正确的权限,因此sprocs平等的触发器在安全方面的能力绕过去

!) 根据该数据库可以执行更新的语句不火的触发器。我可以利用知识的嵌套的触发执行的深度旁路的一个触发器。唯一确定的解决方案包括安全在数据库和限制获取的数据仅仅用批准机制--无论这些是触发器,sprocs或数据存取层。

我认为,选择是明确在这里。如果数据是正在访问多个应用程序,那么你想要控制历史上的最低共同的层,这将意味着数据库。

下述逻辑,选择的触发器或存储程序取决于是否存储的过程是最低的共同层。你应该喜欢的sproc在的触发因为你可以控制的绩效,副作用更好的代码被更易于维护。

触发器是可以接受的,但是尝试,以确保你不会增加锁,通过阅读数据外表正在更新。限制触发器插入日志表,日志只有你需要什么。

如果应用程序使用一种共同的逻辑存取层,这是不可能的,这将改变,随着时间的推移,我宁愿来实施这里的逻辑.使用链条的责任模式和一个插在建筑、推动这个从依赖性注入到允许的所有方式处理在你的历史模块,包括记录完全不同类型的技术,不同的数据库,一个历史记录服务或其他任何你能想象的。

已经使用的触发基础的方法为年,它拥有绝对的工作以及对我们来说,但你做的有以下几点考虑:

  1. 触发器上的大量使用(就是说,一个多租户萨基础的应用程序)可能是极其昂贵的

  2. 在某些情况下,一些领域可以获得多余的。触发器都好,只有当你是很清晰的领域要记录;虽然使用应用程序的你可以有一个拦截层可以帮你记录某些领域基于"配置";虽然有它自己的共享的间接费用

  3. 没有足够的数据库控制,一个人可以很容易地禁止触发器,修改数据和启用的触发器;所有没有提出任何警报

  4. 在情况的网络应用程序,其中的连接建立了从一个游泳池,跟踪实际的用户作出的变化可能会很麻烦。一个可能的解决办法是有的"化"领域,在每一项交易表。

迟到一个,但它增加了更多的选项,可以审议。

改变数据采集: 功能可在SQL服务器2008年R2+但是,只有在企业版。它可以让你的选择表你想跟踪和SQL服务器会做的您的工作。它的工作通过阅读的交易日志和填充的历史表的与数据。

阅读的交易日志: 如果数据库中完全恢复模式,然后交易日志可以阅读和细节上的交易几乎可以找到。

缺点是,这不是支持通过默认。选择阅读的交易日志使用无证件的功能等fn_dblog或第三方的工具,例如 ApexSQL日志.

触发器: 工作只是现的小数量的表,其中没有太多的触发进行管理。如果你有很多的表要审核的,那么你应该考虑某些第三方的工具。

所有这些工作在数据库的水平和完全透明,应用程序。

触发器的唯一可靠的方式捕获的变化。如果你这样做在储存过程或应用程序,你总是可以去和SQL远的变化,你没有一个登录为(无意中).当然,谁不想留下一个日志可以禁止触发器。但你宁愿军人禁止的记录,比希望他们记住,包括它。

通常,如果你选择该应用程序层,可以设计应用程序的代码记录,在一个单一点,将处理统所有你的历史表。不同的触发器是一个更复杂的方法来维持,因为它们是(根据数据库技术)复制的每个表:在情况下的百表量的代码,用于触发可能是一个问题。

如果你有一个支助组织将保持你的代码编写,现在,你不知道他们会保持你的代码(典型的大型工业)则不能假设其技术水平的人会做的修复您的应用程序,在这种情况下,最好是在我的意见,以使历史表工作的原则尽可能简单,和在应用层可能是最好的地方,为这一目的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top