dblink必须为public才能跨用户执行dml;私有dblink仅创建者可用,其他用户执行dml会报ora-01031;远程表dml需满足三条件:tns可达、远程用户授表级dml权限、本地用户有dblink权限且无未提交分布式事务;update/delete须带where且避免全表扫描;重建含特殊字符密码的dblink时identified by需加双引号。

DBLink必须是PUBLIC才能跨用户执行DML
私有DBLink(CREATE DATABASE LINK)只能由创建者本人执行INSERT/UPDATE/DELETE,其他用户即使能查到表(如通过同义词),执行DML时会报ORA-01031: insufficient privileges。只有CREATE PUBLIC DATABASE LINK创建的链接,且远程用户已显式授权目标表操作权限,才能被其他用户安全修改数据。
远程表DML操作前必须确认三件事
漏掉任意一项都会导致失败:
- 本地
tnsnames.ora中USING参数指向的TNS别名必须存在且网络可达(用tnsping ORCL2验证) - 远程数据库用户(如
WANGYONG)对目标表(如COMPANY)已执行GRANT INSERT, UPDATE, DELETE ON COMPANY TO link_user(link_user是DBLink中CONNECT TO指定的账号) - 本地执行DML的用户必须有
CREATE DATABASE LINK权限(或使用PUBLIC链接),且不能处于分布式事务未提交状态(否则可能触发ORA-02049)
UPDATE/DELETE必须显式带上WHERE条件,且避免全表扫描
Oracle不会把本地WHERE条件自动下推到远程库执行。例如:
UPDATE company@TESTLINK2 SET name = 'new' WHERE id = 100;
这条语句会把整张company表拉到本地再过滤,极易超时或OOM。正确做法是确保远程表在WHERE字段上有索引,并确认该条件能被远程库直接利用。更稳妥的方式是先用SELECT COUNT(*) FROM company@TESTLINK2 WHERE id = 100验证命中行数,再执行DML。
DROP后重建DBLink时密码含特殊字符要加双引号
如果远程密码以数字开头(如123456)或含符号(如E0oOv0s#i$I1Ld),重建语句必须用双引号包裹:
CREATE PUBLIC DATABASE LINK TESTLINK2 CONNECT TO WANGYONG IDENTIFIED BY "123456" USING 'ORCL2';
否则Oracle解析失败,报ORA-01017: invalid username/password。注意:双引号仅用于IDENTIFIED BY,TNS别名USING部分仍用单引号。
SELECT或CONNECT。











