下面把我们当前操作的数据库称之为A 客户提供给我方的为B
第一步:赋权建立dblink的权限
此处为A的dba用户赋权:切换到 sys 用户并执行以下命令,将 user 替换成你当前操作的数据库用户名
-- 授权创建数据库链接(dblink)
GRANT CREATE DATABASE LINK TO user;
-- 授权创建公共同义词
GRANT CREATE PUBLIC SYNONYM TO user;
第二步:切换回当前操作用户 即:上面提到的user
第三步:创建数据库链接 (dblink)
CREATE DATABASE LINK orcl
CONNECT TO YQZL_OPERATOR_01 IDENTIFIED BY "BR_OPERATOR_01"
USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.7.90)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
第四步:创建同义词 为远程表创建公共同义词,这样可以在本地直接使用同义词来访问远程表:
CREATE PUBLIC SYNONYM T_MI_DEPARTMENTS FOR NCCKF.T_MI_DEPARTMENTS@orcl;
CREATE PUBLIC SYNONYM T_MI_COUNTERPARTIES FOR NCCKF.T_MI_COUNTERPARTIES@orcl;
CREATE PUBLIC SYNONYM T_MI_COUNTERPARTYACCOUNTS FOR NCCKF.T_MI_COUNTERPARTYACCOUNTS@orcl;
第五步:在当前用户下使用 执行以下查询语句,验证dblink和同义词是否创建成功:
SELECT * FROM T_MI_DEPARTMENTS;
SELECT * FROM T_MI_COUNTERPARTIES;
SELECT * FROM T_MI_COUNTERPARTYACCOUNTS;
ps:清理操作:删除公共同义词 如果不再需要这些同义词,可以使用以下命令删除它们:
DROP PUBLIC SYNONYM T_MI_DEPARTMENTS;
DROP PUBLIC SYNONYM T_MI_COUNTERPARTIES;
DROP PUBLIC SYNONYM T_MI_COUNTERPARTYACCOUNTS;
查不到数据检查操作:
001-- 在远程数据库上以 YQZL_OPERATOR_01 用户执行查询
SELECT * FROM NCCKF.T_MI_DEPARTMENTS;
确保 YQZL_OPERATOR_01 用户在远程数据库上对表 NCCKF.T_MI_DEPARTMENTS 具有足够的读取权限。如果没有权限读取数据,你只能看到表结构而没有数据。
即客户给你的用户到底有没有权限?
002 -- 查看数据库链接配置
SELECT * FROM USER_DB_LINKS;
确保数据库链接配置正确,特别是连接描述符中的服务名、主机地址和端口号:
003 在本地数据库中,使用创建的 dblink 直接查询远程表,确认是否能获取数据。
-- 在本地数据库上通过 dblink 查询远程表
SELECT * FROM NCCKF.T_MI_DEPARTMENTS@orcl;
如果这条查询语句返回数据,则表示 dblink 本身是正常的,问题可能出在同义词的创建上。
004 验证同义词创建
确保同义词正确创建并指向正确的远程表。
-- 查看同义词信息
SELECT * FROM USER_SYNONYMS WHERE SYNONYM_NAME = 'T_MI_DEPARTMENTS';