我想限制模式访问特定IP地址,我尝试了下面的代码,但仍然可以访问所有ip的这个数据库。 我怎样才能从下面的代码中获得这个
CREATE OR REPLACE TRIGGER system.check_ip_addresses
AFTER LOGON
ON DATABASE
DECLARE
l_ip_address VARCHAR2(16) := SYS_CONTEXT('USERENV', 'IP_ADDRESS');
BEGIN
IF USER IN ('abc') THEN
IF l_ip_address IN ('189.14.1.54') THEN
NULL;
ELSE
RAISE_APPLICATION_ERROR(-20000, 'Can not log in from this IP address (' || l_ip_address || ')');
END IF;
END IF;
END;
/
答案 0 :(得分:0)
你的问题在这里:
IF USER IN ('abc') THEN
用户将始终以大写形式返回用户,即“ABC”,除非你做了疯狂的事情并在定义用户时使用双引号。
因此,请将您的代码更改为:
IF USER IN ('ABC') THEN
它应该有用。
希望有所帮助。
答案 1 :(得分:0)
试试这个:
SYS_CONTEXT('USERENV','HOSTNAME')
IP_ADDRESS指令并不总是有效。您可以通过在select中运行它来判断,如下所示:
SQL> select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
SYS_CONTEXT('USERENV','IP_ADDRESS')
-------------------------------------------------------------------
SQL> select SYS_CONTEXT('USERENV','HOST') from dual;
SYS_CONTEXT('USERENV','HOST')
-------------------------------------------------------------------
orcl.prod