Oracle限制账户在指定的IP登录
管理员账户操作
创建表,用于记录登录信息,这里调试使用
DROP TABLE SYS.LOGIN_DEBUG;
CREATE TABLE SYS.LOGIN_DEBUG (
    log_time TIMESTAMP,
    ip_address VARCHAR2(20),
    message VARCHAR2(255)
);
步骤2:创建触发器
CREATE OR REPLACE TRIGGER SYS.TRG_PREVENT_LOGIN
AFTER LOGON ON DATABASE
DECLARE
    v_ip_address VARCHAR2(15);
    v_sid VARCHAR2(10);
    v_serial# VARCHAR2(10);
BEGIN
  IF USER = '用户名' THEN
/*
    v_ip_address := SYS_CONTEXT('USERENV', 'IP_ADDRESS');
    SELECT SID, SERIAL# INTO v_sid, v_serial# FROM V$SESSION WHERE USERNAME = '用户名' AND AUDSID = USERENV('SESSIONID');
    INSERT INTO SYS.LOGIN_DEBUG (log_time, ip_address, message) VALUES (SYSTIMESTAMP, v_ip_address, 'Login attempt for user: ' || USER || ' | SID: ' || v_sid || ' | SERIAL#: ' || v_serial#);
    COMMIT;
*/
    IF SYS_CONTEXT('USERENV', 'IP_ADDRESS') IN ('IP地址1','IP地址2') THEN
      RAISE_APPLICATION_ERROR(-20001, 'IP ' || SYS_CONTEXT('USERENV', 'IP_ADDRESS') || ' Access denied!');
    END IF;
  END IF;
END;
/
步骤3:检查
set lines 200 pages 2000;
col log_time for a30;
col ip_address for a20;
col username for a20;
col message for a60;
select * from SYS.login_debug;
SELECT SID, SERIAL#, USERNAME, STATUS FROM V$SESSION WHERE USERNAME = '用户名';
说明:
1.只能限制非DBA权限的用户,如果拥有DBA权限,该方法将不起作用
2.从本机登录用户,不受触发器的限制
3.RAISE_APPLICATION_ERROR会引起事务回滚,因此脚本中需要COMMIT命令
 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号