Oracle跨用户表授权+同义词创建的标准脚本模板

文章目录

以下是Oracle跨用户表授权+同义词创建的标准脚本模板,包含单表操作、批量操作、私有/公有同义词创建等场景,可根据实际需求修改参数后直接执行:

模板参数说明

plaintext 复制代码
-- 需替换的参数:
<OWNER>        -- 表的所有者(如MIP_OWNER)
<TARGET_USER>  -- 需要访问表的用户(如CVMS_USER)
<TABLE_NAME>   -- 具体表名(如T_MIP_USER)
<TABLE_LIST>   -- 批量表名列表(如'T_MIP_USER,T_MIP_ORDER,T_MIP_LOG')

一、单表授权+私有同义词(常用)

sql 复制代码
-- 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>;

二、批量表授权+私有同义词(适合多表场景)

sql 复制代码
-- 1. 批量授权(以<OWNER>身份执行,需替换表名列表和权限)
DECLARE
  v_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 IS
    SELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_name
    FROM dual
    CONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGIN
  FOR rec IN c_tables LOOP
    v_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>身份执行)
DECLARE
  v_table_list VARCHAR2(1000) := '<TABLE_LIST>'; -- 与授权的表名列表一致
  v_owner      VARCHAR2(100)  := '<OWNER>';
  v_sql        VARCHAR2(2000);
  v_table      VARCHAR2(100);
  CURSOR c_tables IS
    SELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_name
    FROM dual
    CONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGIN
  FOR rec IN c_tables LOOP
    v_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;
/

三、创建公有同义词(多用户共享场景)

sql 复制代码
-- 1. 先执行单表/批量授权(同上)

-- 2. 以DBA身份创建公有同义词(所有用户可访问,无需前缀)
-- 单表
CREATE OR REPLACE PUBLIC SYNONYM <TABLE_NAME> 
FOR <OWNER>.<TABLE_NAME>;

-- 批量(以DBA身份执行)
DECLARE
  v_table_list VARCHAR2(1000) := '<TABLE_LIST>';
  v_owner      VARCHAR2(100)  := '<OWNER>';
  v_sql        VARCHAR2(2000);
  v_table      VARCHAR2(100);
  CURSOR c_tables IS
    SELECT regexp_substr(v_table_list, '[^,]+', 1, LEVEL) AS table_name
    FROM dual
    CONNECT BY regexp_substr(v_table_list, '[^,]+', 1, LEVEL) IS NOT NULL;
BEGIN
  FOR rec IN c_tables LOOP
    v_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;
/

四、权限回收(如需撤销授权)

sql 复制代码
-- 单表权限回收(以<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>;

使用说明

  1. 执行前替换所有<参数>为实际值(如MIP_OWNERCVMS_USERT_MIP_XXX)。
  2. 权限部分根据需求调整(例如只读场景仅保留SELECT)。
  3. 批量操作时,表名列表用英文逗号分隔,避免空格。
  4. 公有同义词需DBA权限,且需确保表名在数据库中唯一(避免冲突)。
相关推荐
不剪发的Tony老师6 分钟前
国产数据库之GaussDB:固若金汤
数据库·gaussdb
雨辰AI37 分钟前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
基德爆肝c语言1 小时前
MySQL表的操作
前端·数据库·mysql
TDengine (老段)2 小时前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据
Keano Reurink2 小时前
搜索API与GSC数据对比:发现数据盲区
数据库·python·数据挖掘
shushangyun_2 小时前
汽车服务行业B2B平台+AI解决方案哪家专业:2026年最新测评
java·运维·网络·数据库·人工智能·汽车
大黄说说2 小时前
深入理解 Go 协程 Goroutine:并发编程的核心精髓
java·数据库·python
sulikey2 小时前
数据库系统概论4 - 更新与视图 期末速成课笔记
数据库·笔记·考试·期末速成·数据库系统概论
锋行天下2 小时前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端