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命令

 

posted @ 2025-04-17 11:03  jhtchina  阅读(25)  评论(0)    收藏  举报