触发器执行期间跳过错误

问题描述 投票:0回答:1

我在数据库事件 LOGON 上创建了一个触发器,以避免未经许可的人错误地登录数据库。当主机名以C开头时,需要拒绝连接。

CREATE OR REPLACE TRIGGER "SYS"."LOGIN_RJ" AFTER LOGON ON DATABASE
DECLARE
HOST_NAME VARCHAR2(128):=SYS_CONTEXT('USERENV','HOST');
BEGIN
if (HOST_NAME like 'C%') then
    raise_application_error(-20000,'host login denied');
end if;
END;

这对大多数用户帐户很有用,但特定用户仍然可以登录数据库而不会出现任何 ORA 错误。

  1. 当用户成功登录数据库时,我发现数据库生成了如上的警报日志:
> Skipped error 604 during the execution of SYS.LOGIN_RJ
> 
> dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=0, mask=0x0)
> Error Stack Dump -----
> ORA-00604: error occurred at recursive SQL level 1
> ORA-20000: host login denied
> ORA-06512: at line 6
  1. 我尝试授予/撤销角色,发现DBA或IMP_FULL_DATABASE角色会影响上述触发器。当用户被授予 IMP_FULL_DATABASE 角色时,触发器不会引发应用程序错误。

有没有其他方法可以限制用户登录而不撤销角色权限(IMP_FULL_DATABASE或DBA)?

oracle oracle11g triggers
1个回答
0
投票

如上面评论中所述,无法使用登录触发器错误阻止 DBA 进行连接。

如果您需要阻止某些主机名连接,编辑防火墙规则是最强大的选择。 Oracle 还具有使用 sqlnet.ora 配置参数来阻止侦听器中的 IP 和主机名的有限选项。

© www.soinside.com 2019 - 2024. All rights reserved.