sql-server - 对数据进行高级筛选的 SQL 复制

标签 sql-server database filter database-replication

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

技术

  • 微软 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。过滤器:社交号码

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

replication column filter

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

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

如果字段 IS_PUBLIC 设置为真,则只应复制一个人。如果不是,则此人不应公开,因此不应复制他的所有数据。这可以通过在表上使用行过滤器来实现。成功了!

replication row filter

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

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 或空或其他任何值。无论标志如何,都应复制所有其他人的数据。

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

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

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

最佳答案

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

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

  1. 从名为 REPLICATION_PERSONPERSON 表创建一个 View
  2. 将 View 属性“Bind to Schema”设置为 true 并将表 PERSON 中的 ID 用作唯一的聚集索引
  3. 使用 SELECT-IF 语句将字段设置为空

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

  4. 通过输入名称(等于表:PERSON)将 View 添加到“要发布的对象”列表,并将标志“Create schemas at Subscriber”设置为 true

enter image description here

enter image description here

在订阅者上, View 将生成为一个表。如果您想使用额外的列/行过滤器,您必须使用“WHERE”语句将它们放入您的 View 中。

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

关于sql-server - 对数据进行高级筛选的 SQL 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33434637/

相关文章:

创建 jar 后出现 java.lang.ClassNotFoundException : com. microsoft.sqlserver.jdbc.SQLServerDriver

sql-server - SQL Server 上的 NVarchar 存储与 Varchar 存储

ios - 如何在coredata中创建数据库 View

javascript - $lookup 之后的 Mongodb $near

dynamic - 基于过滤器的 Spotfire 计算列

Javascript:根据多个值过滤对象数组

sql-server - 在 BIML 中的数据流之前创建表

mysql - 使用 ORDER BY 覆盖索引

swift - 快速调用复杂字典(关联数组)上的过滤器

Mysql加入查询