考虑以下场景….
我有一个主用户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)))