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.是的,我预计高负载数据库的性能会滞后.从理论上讲,它应该在具有相同配置的服务器上顺利运行.
但是,同样,订户方没有触发器.任何想法,替代品?
MS SQL Server具有"更改跟踪"功能,可能对您有用.您启用数据库以进行更改跟踪并配置要跟踪的表.然后,SQL Server会在每次更新时创建更改记录,在表上插入,删除,然后让您查询自上次检查以来所做记录的更改.这对于同步更改非常有用,并且比使用触发器更有效.它比管理自己的跟踪表更容易管理.这是自SQL Server 2005以来的一项功能.
更改跟踪仅捕获表的主键,让您查询哪些字段可能已被修改.然后,您可以查询这些表上的表连接以获取当前数据.如果您希望它捕获数据,您也可以使用Change Capture,但它需要更多的开销,至少需要SQL Server 2008企业版.
一般过程是:
然后,只要您想订阅下一组更改,就可以重复此过程.SQL Server为您提供了存储更改和版本控制的幕后策略.您还可能需要查看快照隔离...它可以很好地使用它.链接的文章有更多相关信息.