授予在另一个模式上创建同义词(Oracle)

时间:2015-05-08 15:27:43

标签: oracle oracle11g

我只是想知道是否有任何选项可以在不给出“ANY”选项的情况下授予在不同架构上创建同义词的权限。我只想缩小授权范围,以便为安全目的提供必要的许可。

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

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

B.b_synonym maps to A.b_object

2 个答案:

答案 0 :(得分:5)

您需要CREATED ANY SYNONYM权限才能将其作为A,因此

GRANT CREATE ANY SYNONYM TO A;

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

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;

答案 1 :(得分:0)

您无法授予仅适用于其他架构的权限。你必须给予任何 - 即使是暂时的,例如在创建/修改主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对象的必要权限,您需要以某种方式授予这些对象 - 同义词本身并不提供任何访问权限。