SQL 使用高级数据过滤器进行复制
SQL Replication with advanced filter on data
我想将我的本地内部数据库(发布者)复制到 public 数据库(订阅者),但有一些限制:并非所有来自内部数据库的 rows/columns/data 都应该是 replicated/pushed到 public 数据库。最重要的是,必须过滤一些个人用户数据(必须在 public 数据库中排除它们)。
技术
- 微软 SQL 服务器 2014
例子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.
复制到订阅者
对于上面的示例,需要执行以下步骤:
- 创建名为 REPLICATION_PERSON
的 PERSON Table 的视图
- 将视图属性 "Bind to Schema" 设置为 true 并使用来自 table PERSON 的 ID 作为唯一聚集索引
使用 SELECT-IF 语句将字段设置为空
SELECT ..., (CASE WHEN MARTIAL_STATUS_PUBLIC = 1 THEN MARTIAL_STATUS ELSE NULL END)
通过输入名称(等于 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/
我想将我的本地内部数据库(发布者)复制到 public 数据库(订阅者),但有一些限制:并非所有来自内部数据库的 rows/columns/data 都应该是 replicated/pushed到 public 数据库。最重要的是,必须过滤一些个人用户数据(必须在 public 数据库中排除它们)。
技术
- 微软 SQL 服务器 2014
例子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.
复制到订阅者对于上面的示例,需要执行以下步骤:
- 创建名为 REPLICATION_PERSON 的 PERSON Table 的视图
- 将视图属性 "Bind to Schema" 设置为 true 并使用来自 table PERSON 的 ID 作为唯一聚集索引
使用 SELECT-IF 语句将字段设置为空
SELECT ..., (CASE WHEN MARTIAL_STATUS_PUBLIC = 1 THEN MARTIAL_STATUS ELSE NULL END)
通过输入名称(等于 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/