【问题标题】:grant to create synonyms on another schema (Oracle)授予在另一个模式上创建同义词 (Oracle)
【发布时间】:2015-05-08 15:27:42
【问题描述】:

我只是想知道是否有任何选项可以授予在不同架构上创建同义词的权限而不提供“任何”选项。我只想缩小授权范围,以提供安全所需的许可。

我们创建了一个与应用程序产品相关的模式名称 A。但是应用程序假设通过另一个(登录)模式 B 访问对象。我们已将资源授予模式 A,因此模式 A 所有者可以创建自己的对象。我需要使用什么授权语法来授予架构 A 在架构 B 上创建同义词,以便它可以创建同义词。

最终结果应该如下,并且可以由架构所有者 A 创建,而不受 DBA 的干扰

B.b_synonym maps to A.b_object

【问题讨论】:

  • 你试图完成的事情似乎没有意义。如果B 拥有该表,为什么要在B 模式中创建私有同义词?该同义词只能由B 使用,根据定义,他们已经可以访问基础表。 A 永远不能使用架构 B 中定义的私有同义词(因此称为私有)。如果你想创建一个私有同义词,只有在模式A 中创建它才有意义。或者您可能想创建一个公共同义词。

标签: oracle oracle11g


【解决方案1】:

您需要 CREATED ANY SYNONYM 权限才能以 A 身份执行此操作,因此

GRANT CREATE ANY SYNONYM TO A;

编辑:要避免 ANY 特权,请执行以下操作:

a) 作为 A:

GRANT SELECT ON mytable1 TO B;
GRANT SELECT, INSERT, UPDATE, DELETE ON mytable2 TO B;

b) 作为 B:

CREATE SYNONYM a_mytable1 FOR A.mytable1;
CREATE SYNONYM a_mytable2 FOR A.mytable2;

【讨论】:

  • 出于安全考虑,我不想提供任何东西。
  • 在这种情况下,B 必须创建同义词。
  • 但是 B 需要权限才能查看 A 的对象。我认为我在这里没有选项,所以作为管理员我创建了同义词。
  • A 可以将权限授予 B 并且 B 创建同义词。无需 DBA。
【解决方案2】:

您不能授予仅适用于另一个架构的权限。您必须授予 ANY - 即使是暂时的,例如在创建/修改主 A 模式期间,以减少安全影响 - 并在您拥有权限时在其他 B 用户的模式中创建所有同义词。否则用户 B 将不得不自己创建同义词;或者用户 A 可以创建公共同义词。

作为使用任何同义词的替代方法,您可以让用户 B 切换到架构 A:

alter session set current_schema = A;

然后他们可以引用 A 的对象,而不必为它们加上模式名称的前缀,尽管他们随后无法在自己的模式中看到任何对象,而无需为其添加前缀——听起来 B 不会有对象,但很难告诉。

您还可以通过登录触发器自动执行架构切换:

create or replace trigger ramread_logon_trigger
after logon on database
begin
  if user = 'B' then
    execute immediate 'alter session set current_schema = A';
  end if;
end;
/

如果您实际上有多个用户,则可以改用一个角色,并通过使用dbms_session.is_role_enabled 进行测试,为具有该角色的任何用户切换架构。可以授予相同的角色访问 A 对象的必要权限,您需要以某种方式授予这些权限 - 同义词本身不提供任何访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多