在 oracle db 中共享表的替代方法

Alternatives in sharing tables in oracle db

假设我有一个 Oracle SQL Db(Oracle 数据库 11g 企业版),并且我有两个模式:schema1 和 schema2(相同的实例,集群)。我有一个 table,其中包含应在这两个模式之间共享的数据。

我有多少种方法可以做到这一点,除了:

  1. 正在向来自其他架构的用户授予权限 (like this)
  2. 复制 table(我一想到这个..同步问题等就感觉很糟糕)

提前致谢

如果两个模式应该使用相同的数据,那么您应该向第二个模式授予权限。如果 schema1 拥有 table 并且 table 的任何更改也应该被 schema2 看到,那么是的两种模式都使用相同的 table.

唯一的其他选择是:

  1. 在 table 上构建视图或 PL/SQL API 并授予对该接口对象的权限

这绝对是我的首选。它比选项 1 更好,因为它允许 schema1 (所有者)对 schema2 可以看到的内容有更多的控制(例如过滤行,公开列的子集).它还允许 schema1 更改 table 而 schema2 (必然)不必更改其调用代码。安全多了。

请注意,如果 schema2 在单独的数据库中,则选项 2 有用例。我倾向于使用物化视图而不是 table,因为这意味着 Oracle 完成了同步所需的大部分工作。这意味着即使 schema1 的数据库已关闭,schema2 也可以查询数据。 (即使两个模式在同一个数据库中,也可以使用 MViews,只是这种情况不太引人注目)。

如果 schema2 需要更新、插入或删除共享数据,2 选项是一个糟糕的选择。在那种情况下,总是需要一个接口。

如果您决定应用选项 1 并直接授予 table 权限,请让 schema2 创建一个同义词并在其代码中引用它. 不要在程序中对模式名称进行硬编码