如何强制触发器以指定账户连接远程数据库并排查连接身份
问题解决方案
一、从REMOTE视角确定尝试连接的模式
- 查询REMOTE数据库的会话视图,筛选通过数据库链接发起的会话:
SELECT username, program, machine FROM v$session WHERE program LIKE '%(DBLINK)%';
该语句会返回当前通过dblink连接到REMOTE的用户名称,能直接定位LOCAL侧发起连接的用户。
- 启用REMOTE的登录失败审计,记录无效登录尝试:
- 开启审计:
AUDIT SESSION WHENEVER NOT SUCCESSFUL;- 查询审计记录:
通过审计记录的SELECT username, timestamp, action_name FROM dba_audit_session WHERE returncode != 0;username字段,可直接看到触发ORA-01017错误的用户(即ACTORS)。
二、强制触发器以USERS模式同步到REMOTE
有两种可靠方案:
方案1:修改数据库链接,指定固定连接身份
修改LOCAL侧的公共数据库链接,明确指定以USERS身份连接REMOTE,无论LOCAL侧哪个用户触发操作,都会用USERS身份访问REMOTE:
ALTER PUBLIC DATABASE LINK [你的dblink名称] CONNECT TO USERS IDENTIFIED BY [REMOTE侧USERS的密码];
需提前知晓REMOTE数据库中USERS用户的密码。
方案2:修改触发器为定义者权限模式
触发器默认采用AUTHID CURRENT_USER(调用者权限),会以触发它的用户(即ACTORS)身份执行。将触发器改为AUTHID DEFINER(定义者权限),就能以创建触发器的USERS身份执行,从而用USERS身份通过dblink连接REMOTE:
CREATE OR REPLACE TRIGGER USERS.accounts_sync_trigger AFTER INSERT OR UPDATE OR DELETE ON USERS.Accounts AUTHID DEFINER FOR EACH ROW BEGIN -- 同步逻辑示例 IF INSERTING THEN INSERT INTO USERS.Accounts@[你的dblink名称] VALUES (:NEW.*); ELSIF UPDATING THEN UPDATE USERS.Accounts@[你的dblink名称] SET account_name = :NEW.account_name, balance = :NEW.balance WHERE id = :OLD.id; ELSIF DELETING THEN DELETE FROM USERS.Accounts@[你的dblink名称] WHERE id = :OLD.id; END IF; END; /
修改后,触发器会始终以USERS身份运行,避免因调用者身份不匹配导致的登录错误。
内容的提问来源于stack exchange,提问作者Jeromy French
相关产品推荐
相关产品推荐

