A库创建dblink访问B库数据和报错ora-12154解决方案

本文描述了一个企业IT团队在实现人力资源系统与OA系统单点登录和数据同步时遇到的问题,包括创建dblink权限不足、错误代码ORA-12154,以及最终通过调整连接方式和字段安全设置成功解决的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

早上单位人力资源系统需要和OA系统单点登录,人力系统数据同步OA,OA创建了张临时表,由人力系统主动同步数据,过程中出现了一系列问题:

1、首先人力系统直接粗暴上来创建dblink灌数据(oa数据库ip端口不方便展示,汉字代替)

create database link rs  
connect to xxx
IDENTIFIED by "abdccccc"
using 'jdbc:oracle:thin:@oa数据库ip:端口/数据库用户';
INSERT into  oa表@rs (xm,sjh,sfzh) select A0101 as xm,A0148 as sjh,A0177 as sfzh from  UsrA01;
commit;
drop database link rs;

得到的结果是:去oa查询表数据是空的,但是在人力库查到数据了

排查问题吧:

1、查看人力这边创建dblink权限,为空,也就是查询不出数据

select * from user_sys_privs where privilege like upper('%DATABASE LINK%');  

2、执行付权

grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to 人力数据库用户;  

3、再执行前面的create database link ,执行后,加上数据库连接访问oa的表,报错ora-12154,此报错截图暂时就放了

4、百度看了一段乱七八糟的,最后换种创建数据库连的方式解决

create database link 创建的dblink名字
connect to 需要访问的用户 identified b
<think>好的,我现在需要解决用户遇到的ORA-00904错误,具体是“BD BANKACCSUB""ACCNUM": invalid identifier”。首先,我需要理解这个错误的原因。ORA-00904通常表示无效的标识符,可能是列名拼写错误、大小写问题或者表别名不正确。 用户提供的SQL语句中有提到使用了bd_bankaccsub.accnum,但报错显示这个列不存在。我需要检查几个方面: 1. **表结构确认**:首先确认bd_bankaccsub表中是否存在accnum字段。可能用户误将列名写错,比如是否有拼写错误,如accnum与accnum的区别,或者实际列名不同,比如account_number等。 2. **大小写问题**:在Oracle中,如果列名在创建时使用了双引号并包含大小写,那么在查询时必须使用相同的大小写双引号。例如,如果列名为"AccNum",则必须写成bd_bankaccsub."AccNum"。否则,Oracle会默认转换为大写,导致找不到列。 3. **表别名连接条件**:检查SQL中的表别名是否正确,特别是bd_bankaccsub是否正确关联到其他表,可能存在连接条件错误导致该表未被正确引用。 接下来,我需要回顾用户之前的SQL代码,查看相关部分。例如,在gl_data的CTE中,用户可能从gl_docfree1表连接到bd_bankaccsub,并选择accnum字段。需要确认在gl_docfree1bd_bankaccsub之间的连接条件是否正确,以及bd_bankaccsub表是否确实包含accnum列。 另外,用户可能在不同的子查询或CTE中多次引用bd_bankaccsub,需要确保每个引用的地方列名都正确。例如,在之前的优化过程中,可能遗漏了某些子查询中的字段修正,导致错误。 可能的解决方案包括: - 修正列名拼写错误,如将accnum改为正确的列名。 - 如果列名使用了大小写敏感的名称,添加双引号。 - 检查表连接条件,确保bd_bankaccsub正确连接,并且该表中存在所需的列。 - 如果accnum列不存在,可能需要查找正确的列名,或者检查是否应该从另一个相关表中获取该字段。 此外,还需要检查整个SQL语句中所有涉及bd_bankaccsub表的地方,确保所有引用的列都存在且正确。例如,在gl_data的SELECT部分JOIN条件中,是否有其他列也存在类似问题。 最后,可能需要用户提供具体的表结构信息,或者通过数据库的系统表(如ALL_CONSTRAINTS或DESCRIBE命令)来验证表的列名,以确保准确无误地修正错误。</think>以下是针对ORA-00904错误的完整修正方案: ### 核心错误定位 错误发生在`bd_bankaccsub.accnum`字段引用: ```sql -- 错误原因分析 ORA-00904: "BD_BANKACCSUB"."ACCNUM": invalid identifier -- 可能原因: 1. 表名/列名拼写错误 2. 使用了大小写敏感的列名 3. 表结构变更导致字段缺失 ``` ### 修正后的完整SQL片段 ```sql -- 修改前(错误) bd_bankaccsub.accnum -- 修改后(根据实际情况选择) -- 方案1:标准修正(推荐) bd_bankaccsub.acc_num -- 假设实际字段名为acc_num -- 方案2:大小写敏感修正 "bd_bankaccsub"."AccNum" -- 如果字段用双引号定义 -- 方案3:表别名修正 bds.accnum -- 当使用别名时保持一致性 ``` ### 完整修正示例 ```sql WITH gl_data AS ( SELECT gl_detail.pk_accasoa, gl_detail.pk_org, org_orgs.name AS orgname, bd_bankaccsub.acc_num AS accnum, -- 修正字段名 'detail' AS tablefalg, ... FROM gl_detail INNER JOIN gl_docfree1 ON gl_detail.assid = gl_docfree1.assid INNER JOIN bd_bankaccsub bd_bankaccsub ON bd_bankaccsub.pk_bankaccsub = gl_docfree1.F11 AND bd_bankaccsub.fronzenstate = 0 ... ) ``` ### 关键修正点 1. **字段名验证**(最常见原因) ```sql -- 执行验证语句 DESCRIBE bd_bankaccsub -- 或 SELECT column_name FROM user_tab_columns WHERE table_name = 'BD_BANKACCSUB'; ``` 2. **大小写敏感处理** ```sql -- 如果字段使用双引号创建 CREATE TABLE bd_bankaccsub ( "AccNum" VARCHAR2(50) -- 大小写敏感 ); -- 查询时需要 SELECT "AccNum" FROM bd_bankaccsub; ``` 3. **表别名一致性** ```sql -- 修改前(错误混用) FROM ... bd_bankaccsub b LEFT JOIN ... bds.accnum -- 修改后 FROM ... bd_bankaccsub bd LEFT JOIN ... bd.acc_num ``` ### 扩展解决方案 1. **同义词/视图检查** ```sql -- 如果使用了视图,检查视图定义 SELECT text FROM user_views WHERE view_name = 'BD_BANKACCSUB'; ``` 2. **数据库链接问题** ```sql --查询时需要添加@dblink bd_bankaccsub@remote_db.acc_num ``` 3. **自动补全建议** ```sql -- 使用SQL Developer等工具自动补全字段 SELECT bd_bankaccsub. -- 输入点后触发自动提示 FROM bd_bankaccsub; ``` ### 预防措施 1. **命名规范** ```sql -- 推荐使用统一命名规范 COLUMN_NAME -> snake_case ``` 2. **开发检查清单** ```markdown - [ ] 所有字段使用DESCRIBE验证 - [ ] 大小写敏感字段添加双引号 - [ ] 表别名不超过3个字母 - [ ] 定期更新数据库字典文档 ``` 3. **自动化测试** ```sql -- 添加字段存在性检查 BEGIN EXECUTE IMMEDIATE 'SELECT accnum FROM bd_bankaccsub WHERE ROWNUM=1'; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('字段accnum不存在'); END; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值