考虑以下场景….
我有一个主用户MASTER.
我有一个测试用户TEST.
对于两个用户,表结构是相同的.两个用户都可以在不同的oracle服务器上.
然后我通过使用以下命令以test用户身份登录到sql plus来创建数据库链接作为master_link
创建数据库链接master_link通过密码使用连接到主机(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.9.139)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))
通过以测试用户身份登录并使用数据库链接名称,我可以修改主用户中的表.例如
update table1 @ master_link set display_title =’PONDS’;
此查询更新主用户的表table1.
我的要求是我想给予数据库链接(master_link)的只读权限,以便测试用户不能使用数据库链接修改或插入主用户的任何表.
解决方法
在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)))