在复制(目标)数据库上使用触发器时的注意事项

JHF*_*HFB 8 replication trigger sql-server

我们的 SQL Sever 2008 应用程序数据库从服务器 A 复制到服务器 B(推送复制)。我们使用服务器 B 上的副本(我们称之为 database_b)来创建报告并运行其他查询,以便我们的报告不会干扰应用程序。目前,我们利用低效的视图在 database_b 中跨多个表组合数据,以便为我们的报告编写者(具有基本 SQL 技能)简化报告编写。

99.9% 的数据库活动是 INSERTS,所以我们正在探索一种用我们可以优化的表替换低效视图的方法。这是一个简化的示例:

有一个appointment表和一个location(查找)表。每次安排新约会时,都会向appointment表中添加一行。每次这个 INSERT 发生时,我想把appointment_id它和它对应的位置名称(location_id从两个表连接)插入到一个报告表中。

我已经通过服务器 B 上 database_b 中的约会表上的触发器完成了此操作。

我的问题是 - 鉴于 database_b 是复制副本,是否有任何特殊考虑?我是否需要担心失败的触发器会破坏整个(推送)复制过程?还有什么我想念的吗?

不幸的是,在我们的开发环境中很难对此进行测试,因此我没有机会进行大量的反复试验。

db2*_*db2 7

这听起来是使用索引视图的好时机。这些几乎就是它们听起来的样子:一个视图将其结果物理存储在数据库中,并在更新基表时自动更新。

一些注意事项:

  • 在您的订阅数据库中有很多这些可能会减慢复制速度(但很多触发器也会如此)。
  • 为了创建它们,您需要更改一些严格的 SET 选项,并且在创建视图时必须使用 WITH SCHEMABINDING。
  • 对于您认为的内容,还有其他严格的要求。例如,您不能使用外部联接、聚合或交叉/外部应用。
  • 如果您使用的是标准版,则需要使用 WITH (NOEXPAND) 提示按名称查询视图。如果您尝试查询其基表,SQL Server 不会自动使用该视图。

本文中有(很多)更多细节,以及使用 AdventureWorks 数据库的一个很好的示例:http :
//msdn.microsoft.com/en-us/library/ms191432%28v=sql.100%29.aspx

如果它是一个相对简单的查询,只是由于大量数据和(内部)连接而表现不佳,那么这可能是一种改进它的简单方法。