Oracle 19c,主数据库和活动数据库备用数据库。
当用户登录到数据库时,是否有人有幸自动更改了会话参数STANDBY_MAX_DATA_DELAY?
我们希望在只读模式下连接到备用数据库的用户在同步延迟大于某个阈值(5分钟)时得到一个错误。
已尝试在主服务器上创建并复制到备用服务器的此登录触发器:
CREATE OR REPLACE TRIGGER STANDBY_MAX_DATA_DELAY
AFTER LOGON ON database
WHEN
(SYS_CONTEXT('USERENV','DATABASE_ROLE') in ('PHYSICAL STANDBY') and
SYS_CONTEXT('USERENV','SESSION_USER')!='SYS' and
SYS_CONTEXT('USERENV','SERVICE_NAME')='serv_name.sn.vcn.oraclevcn.com')
BEGIN
execute immediate 'ALTER SESSION SET STANDBY_MAX_DATA_DELAY=300';
END;
但是,只要非DHCP用户使用指定的服务连接到备用服务器,触发器就会执行并失败,并出现以下错误:
ORA-04088: error during execution of trigger 'SYS.STANDBY_MAX_DATA_DELAY'
ORA-00604: error occurred at recursive SQL level 1
ORA-03174: STANDBY_MAX_DATA_DELAY does not apply to SYS users
ORA-06512: at line 204088. 00000 - "error during execution of trigger '%s.%s'"
*Cause: A runtime error occurred during execution of a trigger.
*Action: Check the triggers which were involved in the operation.Vendor code 4088
通过测试使用登录触发器的不同方式和参数,我得出结论,无论谁登录,触发器总是以立即执行的方式执行。我还尝试在同一条ALTER SESSION语句上更改CURRENTSCHEMA会话参数,但这不起作用,会话需要更改,或者需要设置某些变量以针对SESSION_USER环境来更改参数。
1条答案
按热度按时间b0zn9rqh1#
解决方案是在一个单独的模式(而不是XML)上创建触发器,即一个具有ADMINISTER DATABASE TRIGGER sys权限的用户。仍然是AFTER LOGON ON DATABASE类型触发器。它就是这样工作的,只要触发器不属于你。任何其他登录到数据库的用户都会获得会话参数STANDBY_MAX_DATA_DELAY设置,我们通过停止应用进程在待机上引入延迟来测试,用户开始获得ORA-03172错误,这是期望的结果。