Oracle跨用户表授权+同义词创建的标准脚本模板
文章目录
- 模板参数说明
- 一、单表授权+私有同义词(常用)
- 二、批量表授权+私有同义词(适合多表场景)
- 三、创建公有同义词(多用户共享场景)
- 四、权限回收(如需撤销授权)
- 使用说明
以下是Oracle跨用户表授权+同义词创建的标准脚本模板,包含单表操作、批量操作、私有/公有同义词创建等场景,可根据实际需求修改参数后直接执行:
模板参数说明
-- 需替换的参数:
<OWNER> -- 表的所有者(如MIP_OWNER)
<TARGET_USER> -- 需要访问表的用户(如CVMS_USER)
<TABLE_NAME> -- 具体表名(如T_MIP_USER)
<TABLE_LIST> -- 批量表名列表(如'T_MIP_USER,T_MIP_ORDER,T_MIP_LOG')
一、单表授权+私有同义词(常用)
-- 1. 以<OWNER>身份登录,授予权限(根据需求选择权限组合)
GRANT SELECT, INSERT, UPDATE, DELETE
ON <OWNER>.<TABLE_NAME>
TO <TARGET_USER>;-- 2. 以<TARGET_USER>身份登录,创建私有同义词(仅当前用户可用)
CREATE OR REPLACE SYNONYM <TABLE_NAME>
FOR <OWNER>.<TABLE_NAME>;
二、批量表授权+私有同义词(适合多表场景)
-- 1. 批量授权(以<OWNER>身份执行,需替换表名列表和权限)
DECLAREv_table_list VARCHAR2(1000) := '<TABLE_LIST>'; -- 表名用逗号分隔v_owner VARCHAR2(100) := '<OWNER>';v_user VARCHAR2(100) := '<TARGET_USER>';v_sql VARCHAR2(2000);v_table VARCHAR2(100);-- 游标:拆分表名列表CURSOR c_tables ISSELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_nameFROM dualCONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGINFOR rec IN c_tables LOOPv_table := rec.table_name;-- 授予权限(可修改为SELECT/INSERT等)v_sql := 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || v_owner || '.' || v_table || ' TO ' || v_user;EXECUTE IMMEDIATE v_sql;DBMS_OUTPUT.PUT_LINE('已授权表:' || v_owner || '.' || v_table);END LOOP;
END;
/-- 2. 批量创建私有同义词(以<TARGET_USER>身份执行)
DECLAREv_table_list VARCHAR2(1000) := '<TABLE_LIST>'; -- 与授权的表名列表一致v_owner VARCHAR2(100) := '<OWNER>';v_sql VARCHAR2(2000);v_table VARCHAR2(100);CURSOR c_tables ISSELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_nameFROM dualCONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGINFOR rec IN c_tables LOOPv_table := rec.table_name;v_sql := 'CREATE OR REPLACE SYNONYM ' || v_table || ' FOR ' || v_owner || '.' || v_table;EXECUTE IMMEDIATE v_sql;DBMS_OUTPUT.PUT_LINE('已创建同义词:' || v_table);END LOOP;
END;
/
三、创建公有同义词(多用户共享场景)
-- 1. 先执行单表/批量授权(同上)-- 2. 以DBA身份创建公有同义词(所有用户可访问,无需前缀)
-- 单表
CREATE OR REPLACE PUBLIC SYNONYM <TABLE_NAME>
FOR <OWNER>.<TABLE_NAME>;-- 批量(以DBA身份执行)
DECLAREv_table_list VARCHAR2(1000) := '<TABLE_LIST>';v_owner VARCHAR2(100) := '<OWNER>';v_sql VARCHAR2(2000);v_table VARCHAR2(100);CURSOR c_tables ISSELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_nameFROM dualCONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGINFOR rec IN c_tables LOOPv_table := rec.table_name;v_sql := 'CREATE OR REPLACE PUBLIC SYNONYM ' || v_table || ' FOR ' || v_owner || '.' || v_table;EXECUTE IMMEDIATE v_sql;DBMS_OUTPUT.PUT_LINE('已创建公有同义词:' || v_table);END LOOP;
END;
/
四、权限回收(如需撤销授权)
-- 单表权限回收(以<OWNER>身份)
REVOKE SELECT, INSERT, UPDATE, DELETE
ON <OWNER>.<TABLE_NAME>
FROM <TARGET_USER>;-- 删除私有同义词(以<TARGET_USER>身份)
DROP SYNONYM <TABLE_NAME>;-- 删除公有同义词(以DBA身份)
DROP PUBLIC SYNONYM <TABLE_NAME>;
使用说明
- 执行前替换所有
<参数>为实际值(如MIP_OWNER、CVMS_USER、T_MIP_XXX)。 - 权限部分根据需求调整(例如只读场景仅保留
SELECT)。 - 批量操作时,表名列表用英文逗号分隔,避免空格。
- 公有同义词需DBA权限,且需确保表名在数据库中唯一(避免冲突)。
