具有高级数据过滤功能的SQL Replication

时间:2015-10-30 11:11:41

标签: sql-server database filter database-replication

我想将本地内部数据库(发布者)复制到公共数据库(订阅者),但有一些限制:并非所有来自内部数据库的行/列/数据都应该复制/推送到公共数据库。最重要的是,必须过滤一些个人用户数据(必须将其排除在公共数据库中)。

技术

  • Microsoft SQL Server 2014

示例表PERSON

内部数据库(发布者)上的源表:

ID | NAME         | IS_PUBLIC | SOCIALNR | MARITAL_STATUS | MARITAL_STATUS_PUBLIC 
---+--------------+-----------+----------+----------------+---------------------
0  | Hans Muster  | 1         | 1234556  | married        | 1
2  | John Doe     | 1         | 5432167  | single         | 0
9  | Ingrid Meyer | 0         | 6789989  | single         | 0

1。过滤:SOCIALNUMBER

根本不应复制 SOCIALNR 列。这可以通过在表上使用列过滤器来实现。 WORKS!

replication column filter

公共数据库(订户)上的目标表:

ID | NAME         | IS_PUBLIC | MARITAL_STATUS | MARITAL_STATUS_PUBLIC 
---+--------------+-----------+----------------+---------------------
0  | Hans Muster  | 1         | married        | 1
2  | John Doe     | 1         | single         | 0
9  | Ingrid Meyer | 0         | single         | 0

2。过滤:人员,如果是IS_PUBLIC

如果字段 IS_PUBLIC 设置为true,则只应复制某人。如果没有,该人不应该公开,所以他的所有数据都不应该被复制。这可以通过在表上使用行过滤器来实现。 WORKS!

replication row filter

公共数据库(订阅者)上的目标表:

ID | NAME         | IS_PUBLIC | MARITAL_STATUS | MARITAL_STATUS_PUBLIC 
---+--------------+-----------+----------------+---------------------
0  | Hans Muster  | 1         | married        | 1
2  | John Doe     | 1         | single         | 0

第3。过滤:MARTIAL_STATUS,如果公开

现在问题的特殊性和原因:如果标志 MARTIAL_STATUS_PUBLIC 设置为true,则只应复制一个人的婚姻状况。如果该标志为false,则 MARTIAL_STATUS 中的值应为null或空或其他。无论标志如何,都应复制所有其他人员数据。

公共数据库(订阅者)上的目标表:

ID | NAME         | IS_PUBLIC | MARITAL_STATUS | MARITAL_STATUS_PUBLIC 
---+--------------+-----------+----------------+---------------------
0  | Hans Muster  | 1         | married        | 1
2  | John Doe     | 1         | NULL           | 0

是否有可能满足此要求?

1 个答案:

答案 0 :(得分:0)

我想我通过使用模式绑定索引视图找到了解决问题的方法。该视图将作为表格复制到订阅者。

对于上面的示例,需要执行以下步骤:

  1. 从名为 REPLICATION_PERSON PERSON 表创建视图
  2. 将视图属性“Bind to Schema”设置为true,并使用表 PERSON 中的ID作为唯一聚簇索引
  3. 使用SELECT-IF-Statement将字段设置为空

    SELECT ...,(MARTIAL_STATUS_PUBLIC = 1,MARTIAL_STATUS ELSE NULL END)

  4. 通过输入名称(等于表: PERSON )将视图添加到“要发布的对象”列表中,并将标记“在订阅者处创建模式”设置为true

  5. enter image description here

    enter image description here

    在订阅者上,视图将作为表生成。如果要使用其他列/行过滤器,则必须使用“WHERE”-Statement将它们放入视图中。

    另见:https://sqlship.wordpress.com/2010/04/14/replicate-indexed-views-transactional-replication/