You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制触发器以指定账户连接远程数据库并排查连接身份

问题解决方案

一、从REMOTE视角确定尝试连接的模式

  • 查询REMOTE数据库的会话视图,筛选通过数据库链接发起的会话:
SELECT username, program, machine
FROM v$session
WHERE program LIKE '%(DBLINK)%';

该语句会返回当前通过dblink连接到REMOTE的用户名称,能直接定位LOCAL侧发起连接的用户。

  • 启用REMOTE的登录失败审计,记录无效登录尝试:
    1. 开启审计:
    AUDIT SESSION WHENEVER NOT SUCCESSFUL;
    
    1. 查询审计记录:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:24