从数据库管理的角度出发,为了数据安全,DBA会限制某些数据库账号只有特定的IP才能登陆。
可以使用触发器达到上述目标。
若要实现只允许固定ip使用TRUI账号登陆数据库,可创建一个触发器,SQL语句如下:
简单版:
/* 合法IP
XX.XX.XX.10
XX.XX.XX.11
代码中隐去具体ip信息,用XX代替
*/
CREATE OR REPLACE TRIGGER system.check_ip_addresses
AFTER logon ON DATABASE
BEGIN
IF USER IN ('RUI1','RUI2') THEN
IF sys_context('USERENV','IP_ADDRESS') NOT IN ('XX.XX.XX.10','XX.XX.XX.11') THEN --括号中的ip列表为可连接数据库的IP
raise_application_error(-20000,'Can not logon in from this IP address ('
||sys_context('USERENV','IP_ADDRESS') || ')'); ----错误信息可自行编译
END IF;
END IF;
END;
验证
使用合法ip可成功登录用户RUI1和RUI2;
使用合法之外的地址登录用户RUI1或RUI2时,有如下错误提示(打码部分为服务器的ip地址):
注意:有DBA权限的用户不受该trigger的限制
复杂版:
create or replace trigger logon_check_ip
after logon ON DATABASE
declare
error1 exception;
v_ip varchar2(60) := null;
v_user varchar2(60) := null;
rightowner varchar(1) := null;
BEGIN
dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
/* 合法IP
XX.XX.XX.10
XX.XX.XX.11
代码中隐去具体ip信息,用XX代替
*/
select sys_context('userenv', 'ip_address'),
SYS_CONTEXT('USERENV', 'CURRENT_USER')
into v_ip, v_user
from dual;
select 'T'
INTO rightowner
FROM DUAL
WHERE v_ip in (
'XX.XX.XX.10',
'XX.XX.XX.11'
);
dbms_output.put_line(rightowner);
if v_user = 'TRUI' AND nvl(rightowner,'T') = 'F' then
raise error1;
end if;
exception
WHEN error1 THEN
raise_application_error(num => -20001,
msg =>nvl(rightowner,'null')|| ' Logon error,permission denied! ');
when others then
raise_application_error(num => -20001,
msg => nvl(rightowner,'null')||' Logon error,permission denied! ');
END;