在 oracle db 中共享表的替代方法
Alternatives in sharing tables in oracle db
假设我有一个 Oracle SQL Db(Oracle 数据库 11g 企业版),并且我有两个模式:schema1 和 schema2(相同的实例,集群)。我有一个 table,其中包含应在这两个模式之间共享的数据。
我有多少种方法可以做到这一点,除了:
- 正在向来自其他架构的用户授予权限 (like this)
- 复制 table(我一想到这个..同步问题等就感觉很糟糕)
提前致谢
如果两个模式应该使用相同的数据,那么您应该向第二个模式授予权限。如果 schema1 拥有 table 并且 table 的任何更改也应该被 schema2 看到,那么是的两种模式都使用相同的 table.
唯一的其他选择是:
- 在 table 上构建视图或 PL/SQL API 并授予对该接口对象的权限
这绝对是我的首选。它比选项 1 更好,因为它允许 schema1
(所有者)对 schema2
可以看到的内容有更多的控制(例如过滤行,公开列的子集).它还允许 schema1
更改 table 而 schema2
(必然)不必更改其调用代码。安全多了。
请注意,如果 schema2
在单独的数据库中,则选项 2 有用例。我倾向于使用物化视图而不是 table,因为这意味着 Oracle 完成了同步所需的大部分工作。这意味着即使 schema1
的数据库已关闭,schema2
也可以查询数据。 (即使两个模式在同一个数据库中,也可以使用 MViews,只是这种情况不太引人注目)。
如果 schema2
需要更新、插入或删除共享数据,2 选项是一个糟糕的选择。在那种情况下,总是需要一个接口。
如果您决定应用选项 1 并直接授予 table 权限,请让 schema2
创建一个同义词并在其代码中引用它. 不要在程序中对模式名称进行硬编码。
假设我有一个 Oracle SQL Db(Oracle 数据库 11g 企业版),并且我有两个模式:schema1 和 schema2(相同的实例,集群)。我有一个 table,其中包含应在这两个模式之间共享的数据。
我有多少种方法可以做到这一点,除了:
- 正在向来自其他架构的用户授予权限 (like this)
- 复制 table(我一想到这个..同步问题等就感觉很糟糕)
提前致谢
如果两个模式应该使用相同的数据,那么您应该向第二个模式授予权限。如果 schema1 拥有 table 并且 table 的任何更改也应该被 schema2 看到,那么是的两种模式都使用相同的 table.
唯一的其他选择是:
- 在 table 上构建视图或 PL/SQL API 并授予对该接口对象的权限
这绝对是我的首选。它比选项 1 更好,因为它允许 schema1
(所有者)对 schema2
可以看到的内容有更多的控制(例如过滤行,公开列的子集).它还允许 schema1
更改 table 而 schema2
(必然)不必更改其调用代码。安全多了。
请注意,如果 schema2
在单独的数据库中,则选项 2 有用例。我倾向于使用物化视图而不是 table,因为这意味着 Oracle 完成了同步所需的大部分工作。这意味着即使 schema1
的数据库已关闭,schema2
也可以查询数据。 (即使两个模式在同一个数据库中,也可以使用 MViews,只是这种情况不太引人注目)。
如果 schema2
需要更新、插入或删除共享数据,2 选项是一个糟糕的选择。在那种情况下,总是需要一个接口。
如果您决定应用选项 1 并直接授予 table 权限,请让 schema2
创建一个同义词并在其代码中引用它. 不要在程序中对模式名称进行硬编码。