我在数据库事件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)的情况下限制用户登录?
2条答案
按热度按时间qni6mghb1#
通过在登录触发器中引发ORA-600错误,可以阻止管理帐户登录Oracle数据库:
字符串
我不知道
使用此解决方案时要非常小心,原因如下:
1.您永远不希望出现阻止所有管理员登录的情况。
我以前用过这样的代码,它可以工作并且很有用。但是你应该意识到它的局限性,如果有更好的安全机制的话,就使用它。
5n0oy7gb2#
正如上面的注解中所提到的,DBA不能(编辑:通常)被阻止使用登录触发器错误进行连接。
如果您需要阻止某些主机名连接,编辑防火墙规则是最强大的选项。Oracle还提供了有限的选项,可以使用sqlnet.ora配置参数阻止防火墙中的IP和主机名。