ora-01031报create database link权限不足的直接原因是用户未被显式授予create database link或create public database link系统权限;需用select * from user_sys_privs where privilege like upper('%database link%')确认权限状态,并由sys等高权限用户执行grant授权。

CREATE DATABASE LINK 报 ORA-01031:权限不足的直接原因
不是密码错、不是网络不通,而是当前用户根本没被授予创建 DBLink 所需的系统权限。Oracle 默认关闭所有用户对 CREATE DATABASE LINK 和 CREATE PUBLIC DATABASE LINK 的访问,哪怕你是普通业务账号,也必须显式授权才能执行。
检查当前用户是否具备 DBLink 权限
用目标用户登录后,运行以下语句查权限:
SELECT * FROM user_sys_privs WHERE privilege LIKE UPPER('%DATABASE LINK%');
常见结果有三种:
- 返回空:完全没权限,连
CREATE DATABASE LINK都不能用 - 只返回
CREATE DATABASE LINK:只能建私有 DBLink(仅自己可用) - 返回
CREATE PUBLIC DATABASE LINK:能建 public 类型,所有用户都可访问
注意:SYSTEM 用户在 11g 及以后版本默认也不带 CREATE DATABASE LINK 权限,所以用 SYSTEM 登录照样报 ORA-01031。
授什么权?怎么授?谁来授?
必须由具有管理员能力的用户(通常是 SYS 或已获 GRANT ANY PRIVILEGE 的用户)执行授权。常见组合如下:
- 只允许建私有 DBLink:
GRANT CREATE DATABASE LINK TO myuser; - 允许建 public DBLink 并能删它:
GRANT CREATE PUBLIC DATABASE LINK, DROP PUBLIC DATABASE LINK TO myuser; - 如果只是临时测试,且该用户已有
UNLIMITED TABLESPACE,部分 Oracle 版本(如 11.2.0.3)实测也能绕过权限限制建 link —— 但这属于隐式行为,不推荐依赖
授权后无需重启会话,新权限立即生效。
为什么加了 PUBLIC 还是用不了?
即使你成功执行了 CREATE PUBLIC DATABASE LINK,其他用户仍可能报 ORA-01031 访问失败,原因常被忽略:
- 远程数据库的登录用户(
CONNECT TO xxx IDENTIFIED BY yyy中的xxx)必须拥有CREATE SESSION权限,否则本地用户能建 link,但一查就报错 - DBLink 名称若含大小写或特殊字符,引用时必须用双引号包裹,例如
SELECT * FROM t@"MyLink";,否则 Oracle 自动转大写导致匹配失败 - Oracle 11g+ 默认开启密码区分大小写,若远程库密码含小写字母,而建 link 时没用双引号包住,Oracle 会把密码全转大写再传过去,导致
ORA-01017—— 表象是权限不足,实则是认证失败
最易漏的一点:public DBLink 虽然“所有人可用”,但它的底层连接凭证(用户名/密码)仍由创建者提供,且不会自动继承调用者的权限上下文。这意味着权限校验发生在两层:本地用户是否有权使用该 link,以及 link 自身能否连上远端库 —— 二者缺一不可。











