如何在oracle中创建只读数据库链接

时间:2010-10-08 06:17:06

标签: oracle

考虑以下场景......

我有一个主用户MASTER。

我有一个测试用户TEST。

对于两个用户,表结构是相同的。两个用户都可以在不同的oracle服务器上。

然后我通过使用以下命令以sql plus身份登录测试用户来创建数据库链接作为master_link

创建数据库链接master_link通过密码使用连接到主设备(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.9.139)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME) = orcl)))

通过以测试用户身份登录并使用数据库链接名称,我可以修改主用户中的表。例如

更新table1 @ master_link set display_title ='PONDS';

此查询更新主用户的表table1。

我的要求是我想给数据库链接(master_link)提供只读权限,这样测试用户就无法使用数据库链接修改或插入到主用户的任何表中。

2 个答案:

答案 0 :(得分:7)

在MASTER架构所在的任何数据库上,您需要创建一个新用户(即MASTER_READ_ONLY)。在所有MASTER表上授予MASTER_READ_ONLY用户SELECT访问权限(最有可能通过角色)。 (可选)在MASTER_READ_ONLY模式中创建公共同义词或私有同义词,以引用MASTER中的对象。然后,在创建数据库链接时,请使用MASTER_READ_ONLY帐户而不是MASTER帐户。

这样的东西

作为DBA

CREATE USER master_read_only
  IDENTIFIED BY password2;

GRANT create session, create synonym
   TO master_read_only;

CREATE ROLE master_ro_role;

GRANT master_ro_role
   TO master_read_only;

作为MASTER

BEGIN
  FOR x IN (SELECT * FROM user_tables)
  LOOP
    EXECUTE IMMEDIATE 
      'GRANT SELECT ON master.' || x.table_name || 
        ' TO master_ro_role';
  END LOOP;
END;

作为MASTER_READ_ONLY

BEGIN
  FOR x IN (SELECT * FROM all_tables WHERE owner='MASTER')
  LOOP
    EXECUTE IMMEDIATE 
      'CREATE SYNONYM ' || x.table_name || 
        ' FOR master.' || x.table_name;
  END LOOP;
END;

在已创建TEST用户的数据库中

CREATE DATABASE LINK master_link 
  CONNECT TO master_read_only 
  IDENTIFIED BY password2 
  USING (DESCRIPTION = 
          (ADDRESS_LIST = 
            (ADDRESS = 
              (PROTOCOL = TCP) 
              (HOST =192.168.9.139)
              (PORT = 1521))) 
            (CONNECT_DATA = (SERVICE_NAME = orcl)))

答案 1 :(得分:2)

如果以用户master连接,则使用该链接的任何人都具有该用户在远程数据库上的权限。要隔离它,您可以在具有master模式的实例上创建新用户,让该用户在(选定的)master表上选择privs,并使用只读方式构建数据库链接用户。

(我假设您没有在主实例上update any table授予public ...)

<小时/> 或者,如果您无法在主实例上创建新用户,则可以在测试实例上创建新用户。如果在该新用户的架构中创建数据库链接,则可以使用test用户可以访问的链接创建只读视图,而不会暴露数据库链接本身。对于后来跟踪发现正在发生的事情的人来说,这可能会更复杂,但这是一种选择。