我在数据库事件 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 错误。
> 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
有没有其他方法可以限制用户登录而不撤销角色权限(IMP_FULL_DATABASE或DBA)?
如上面评论中所述,无法使用登录触发器错误阻止 DBA 进行连接。
如果您需要阻止某些主机名连接,编辑防火墙规则是最强大的选择。 Oracle 还具有使用 sqlnet.ora 配置参数来阻止侦听器中的 IP 和主机名的有限选项。