SQL 使用高级数据过滤器进行复制

SQL Replication with advanced filter on data

我想将我的本地内部数据库(发布者)复制到 public 数据库(订阅者),但有一些限制:并非所有来自内部数据库的 rows/columns/data 都应该是 replicated/pushed到 public 数据库。最重要的是,必须过滤一些个人用户数据(必须在 public 数据库中排除它们)。

技术

例子Table人

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

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.过滤器:社交号码

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

public 数据库(订阅者)上的目标 table:

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。过滤器:人 if IS_PUBLIC

如果字段 IS_PUBLIC 设置为真,则只应复制一个人。如果不是,那这个人应该不是public,所以他所有的数据都不应该被复制。这可以通过在 table 上使用行过滤器来实现。作品!

public 数据库(订阅者)上的目标 table:

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

3。过滤器:MARTIAL_STATUS if public

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

public 数据库(订阅者)上的目标 table:

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

是否有可能满足这个要求?

我想我通过使用架构绑定索引视图找到了解决我的问题的方法。此视图将作为 table.

复制到订阅者

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

  1. 创建名为 REPLICATION_PERSON
  2. PERSON Table 的视图
  3. 将视图属性 "Bind to Schema" 设置为 true 并使用来自 table PERSON 的 ID 作为唯一聚集索引
  4. 使用 SELECT-IF 语句将字段设置为空

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

  5. 通过输入名称(等于 table: PERSON)将视图添加到 "objects to publish" 列表并设置将 "Create schemas at Subscriber" 标记为 true

在订阅者上,视图将生成为 table。如果您想使用额外的 column/row-filters,您必须使用 "WHERE"-语句将它们放入您的视图中。

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