方法1:使用系统触发器
方法2:修改监听器参数文件
(window nt平台,oracle 8.1.7下验证通过)
方法1:使用系统触发器
create or replace trigger sys_trigger_test
after logon on database
begin
if sys_context('userenv','ip_address')='200.200.200.35' then
raise_application_error(-20001,'logon forbidden');
end if;
end sys_trigger_test;
用户登陆时的出错提示:
ERROR:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-20001: logon forbidden
ORA-06512: 在line 3
方法2:修改监听器参数文件
在$ORACLE_HOME/network/admin/目录下的protocol.ora文件(如果没有该文件则添加)中加入两行:
tcp.validnode_checking=yes
tcp.excluded_nodes=(200.200.200.33)
其中tcp.excluded_nodes指的是要阻止的ip地址或机器名
然后重启监听器即可
注1:oracle 815及以上版本可以使用方法1,在init.ora文件中设置_system_trig_enabled=false,则系统触发器失效
注2:方法1使用灵活,可以阻止登陆的形式很多,比如说特定时间内、用户使用特定程序禁止登陆等 情况,但系统开销较大,同时对某些用户起不到阻止登陆的作用;方法2系统开销小,但功能单一
注3:对拥有系统权限ADMINISTER DATABASE TRIGGER或sysdbasysoper的用户,方法1无法阻止用户登陆,但触发器仍然会执行,系统缺省拥有ADMINISTER DATABASE TRIGGER权限的role有IMP_FULL_DATABASE、DBA,可以通过视图role_sys_priv,user_sys_priv等等来查询某个用户所拥有的系统权限