仅订阅者触发器

Dan*_*til 6 t-sql sql-server replication triggers database-trigger

有两个服务器.首先是生产中的ERP系统.第二个是用于重度分析查询的BI服务器.我们每天通过备份更新BI服务器.但是,这还不够,有些用户希望比第二天更频繁地看到他们的数据更改.除了要求备份或复制之外,我无法访问ERP服务器并且无法执行任何操作.

在开始要求复制之前.我想了解是否可以使用订阅者触发器来处理并非所有数据,而是更改.有一个ETL过程可以更快地进行一些查询(索引,转换等).触发器应该可以解决问题,但我找不到在订户端使用它们的方法.ERP系统不允许在数据库级别进行任何更改.因此,订阅者数据库似乎适用于触发器(它们不会影响ERP服务器性能).尽管如此,我找不到一种方法来设置它们.处理所有数据是一个疯狂的开销.

使用案例:简化示例,比方说,我们有两个复制表:

+------------+-------------+--------+
|     dt     | customer_id | amount |
+------------+-------------+--------+
| 2017-01-01 |           1 |    234 |
| 2017-01-02 |           1 |    123 |
+------------+-------------+--------+

+------------+-------------+------------+------------+
| manager_id | customer_id | date_from  |  date_to   |
+------------+-------------+------------+------------+
|          1 |           1 | 2017-01-01 | 2017-01-02 |
|          2 |           1 | 2017-01-02 |       null |
+------------+-------------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

我需要将它们转换为以下索引表:

+----------+-------------+------------+--------+
|  dt_id   | customer_id | manager_id | amount |
+----------+-------------+------------+--------+
| 20170101 |           1 |          1 |    234 |
| 20170102 |           1 |          2 |    123 |
+----------+-------------+------------+--------+
Run Code Online (Sandbox Code Playgroud)

所以,我创建了另一个数据库,我存储上面的表.现在,为了更新表,我必须截断它并再次重新插入所有数据.我可以加入它们以检查差异,但对于大桌子它也太重了.触发器有助于仅跟踪更改的记录.第一个输入表可以使用触发器:

create trigger SaleInsert
on Table1
after insert 
begin 
    insert into NewDB..IndexedTable
    select 
    //some transformation
    from inserted
    left join Table2
    on Table1.customer_id = Table2.customer_id
    and Table1.dt >= Table2.date_from
    and Table1.dt < Table2.date_to
end
Run Code Online (Sandbox Code Playgroud)

更新,删除,第二个表的类似方法的想法相同.我可以用很少的滞后自动更新DWH.是的,我预计高负载数据库的性能会滞后.从理论上讲,它应该在具有相同配置的服务器上顺利运行.

但是,同样,订户方没有触发器.任何想法,替代品?

Bri*_*ler 5

MS SQL Server具有"更改跟踪"功能,可能对您有用.您启用数据库以进行更改跟踪并配置要跟踪的表.然后,SQL Server会在每次更新时创建更改记录,在表上插入,删除,然后让您查询自上次检查以来所做记录的更改.这对于同步更改非常有用,并且比使用触发器更有效.它比管理自己的跟踪表更容易管理.这是自SQL Server 2005以来的一项功能.

如何:使用SQL Server更改跟踪

更改跟踪仅捕获表的主键,让您查询哪些字段可能已被修改.然后,您可以查询这些表上的表连接以获取当前数据.如果您希望它捕获数据,您也可以使用Change Capture,但它需要更多的开销,至少需要SQL Server 2008企业版.

更改数据捕获

一般过程是:

  • 获取当前的同步版本
  • 获取用于获取更改的上一个同步版本
  • 获取自上一版本(插入,更新和删除)以来已更改的表的所有主键.
  • 使用数据加入密钥并下拉数据(如果不使用更改捕获).
  • 保存数据和当前同步版本(从第一步开始).

然后,只要您想订阅下一组更改,就可以重复此过程.SQL Server为您提供了存储更改和版本控制的幕后策略.您还可能需要查看快照隔离...它可以很好地使用它.链接的文章有更多相关信息.