我想将本地内部数据库(发布者)复制到公共数据库(订阅者),但有一些限制:并非所有来自内部数据库的行/列/数据都应该复制/推送到公共数据库。最重要的是,必须过滤一些个人用户数据(必须将其排除在公共数据库中)。
技术
示例表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!
公共数据库(订户)上的目标表:
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!
公共数据库(订阅者)上的目标表:
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
是否有可能满足此要求?
答案 0 :(得分:0)
我想我通过使用模式绑定索引视图找到了解决问题的方法。该视图将作为表格复制到订阅者。
对于上面的示例,需要执行以下步骤:
使用SELECT-IF-Statement将字段设置为空
SELECT ...,(MARTIAL_STATUS_PUBLIC = 1,MARTIAL_STATUS ELSE NULL END)
通过输入名称(等于表: PERSON )将视图添加到“要发布的对象”列表中,并将标记“在订阅者处创建模式”设置为true
在订阅者上,视图将作为表生成。如果要使用其他列/行过滤器,则必须使用“WHERE”-Statement将它们放入视图中。
另见:https://sqlship.wordpress.com/2010/04/14/replicate-indexed-views-transactional-replication/