我正在开发一个部署为两个独立站点的ASP.NET web应用程序。每个站点都有自己的相同(相同模式) ORACLE数据库(10g)实例作为后盾,但是每个数据库都包含“单独的”数据。一个站点只包含“安全数据”,而另一个站点只包含“开放数据”。只有少数用户可以看到安全站点和安全数据,而公司的大多数人都可以访问开放站点。
安全站点用户现在希望能够从安全站点查看安全数据和开放数据。此外,他们希望能够修改开放数据,并且需要将来自安全站点的开放数据更改传播到开放站点,并且需要相应地处理冲突。
我希望有一个仅用于数据库的解决方案,因为我们有绑定到存储过程的报告,这些存储过程现在需要为安全用户显示安全和开放的数据。
我们可以假设数据相应地被标记为安全(Y/N)。
我们目前所走的道路似乎不太可取。它涉及修改安全数据库以包括到开放数据库的数据库链接。我们还向安全数据库添加了额外的视图,以通过数据库链接“联合”安全和开放数据。同时,我们正在检查安全站点上的原始存储过程,以处理CRUD操作,例如
if (someRecord.IsSecure = 'Y')
update secure data;
else
update open data;在我们继续之前,我想联系一下,看看是否有更好的方法来解决这个问题,比如通过复制。
我一直在看multi-master replication。这看起来像是正确的道路吗?有没有人遇到过这种情况?
发布于 2013-03-14 01:22:18
在我正在工作的项目中,我们使用Oracle Streams来支持多主机复制(我们在纽约、伦敦和新加坡全球运营3个站点,都需要读取和更新相同数据的能力)。
Streams支持条件复制,我们利用它来满足监管要求(例如,在新加坡,私人银行客户数据不能离开这个国家)。
例如,使用Streams,您可以复制整个模式(DML和/或DDL)或仅复制一组表。在事务中,您可以控制流,以便复制对象上的单个行操作不会复制..eg:
if (is_secure)
then
dbms_streams.set_tag('01'); -- set a non null tag to prevent replication.
end if;
insert into your_table ()..values ();
if (is_secure)
then
dbms_streams.set_tag(''); -- set a the null tag back
end if;
insert into your_table ()..values ();对于is_secure为true的场景,仅复制第二个规则(您可以将复制规则设置为如果存在非空的streams标记,则不复制)。所以在你的代码中,如果数据是安全的,你只需要设置这个标签。这样,streams就不会将此事务应用于远程站点。
对于多主机复制,您应该预先考虑“冲突”的可能性,即two+站点并行修改相同的数据。您应该对此进行处理(您可以为复杂场景设置应用处理程序)以解决冲突,而不会导致应用错误。例如,对于复制的对象,这将是一个糟糕的设计:
create table foo
(
id number primary key,
data
);
create sequence foo_seq start with 1 increment by 1;如果这是在两个站点上创建的,并且有人在站点1上并行发出:
insert into foo (id, data) values (foo_seq.nextval, 'a');和站点2:
insert into foo (id, data) values (foo_seq.nextval, 'b');两个站点都尝试在主键中插入"1“。这将在复制时失败,您将以应用错误结束。
您可以在每个环境上设置不同的序列,例如一个环境上的start with 100 increment by 100和另一个环境上的start with 101 increment by 100,这将消除此问题,或者/并为每个站点添加一个设置为1或2等的location_id列。
此外,对于更新,您需要使用ale来处理同时更新同一行的two+站点(因为sites..the之间总是有一些延迟,延迟越大,进入需要冲突处理的场景的变化就越多)。
Streams的设置和理解有点复杂,所以你需要仔细阅读这个主题。它非常成熟,仍然得到支持,但就增强而言,从现在开始,它不会得到太多改进,因为Oracle专注于Goldengate (GG是一个许可产品,因此会产生额外的成本,而Streams是企业许可的一部分)。
https://stackoverflow.com/questions/15391571
复制相似问题