考虑以下场景......
我有一个主用户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)提供只读权限,这样测试用户就无法使用数据库链接修改或插入到主用户的任何表中。
答案 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
用户可以访问的链接创建只读视图,而不会暴露数据库链接本身。对于后来跟踪发现正在发生的事情的人来说,这可能会更复杂,但这是一种选择。