除了两个终端之外,我希望限制Oracle用户登录数据库。我写了下面的触发器。
CREATE OR REPLACE TRIGGER TRG_IP_RESTRICT
AFTER LOGON ON DATABASE
DECLARE
V_USER VARCHAR2(30);
V_GRP VARCHAR2(50);
BEGIN
SELECT USER INTO V_USER FROM DUAL;
V_GRP := SYS_CONTEXT('USERENV', 'TERMINAL');
IF V_USER IN ('<list of users>') THEN
IF V_GRP NOT IN ('<list of terminals>') THEN
RAISE_APPLICATION_ERROR(-20001,
'Access Denied by DBA TEAM : ' || V_GRP ||
' on ' || V_USER || ' from ' ||
SYS_CONTEXT('USERENV', 'IP_ADDRESS'));
END IF;
END IF;
END;尽管它运转良好,而且在技术上应该是例外的部分。但同时,它允许连接,而不是向用户显示错误消息。
有人能帮忙吗?
发布于 2017-08-09 05:58:48
这样的触发器只适用于非DBA用户,没有一个不具有adminster database trigger权限的用户。
否则,您可能会阻塞整个数据库。
发布于 2017-08-09 06:07:26
如果系统触发器是数据库登录触发器,且用户具有“管理数据库触发器”权限,则即使触发器引发异常,用户也能够成功登录。对于架构登录触发器,如果用户登录是触发器所有者或具有任何触发器权限,则允许登录。只回滚触发器操作,并在跟踪文件和警报日志中记录错误。
您可以通过引发将破坏整个会话的ORA-600错误来解决此限制。错误消息不会对用户有帮助,但至少会阻止他们。
下面的示例代码将绝对阻止每个人连接到数据库,甚至SYSDBA。非常小心地运行它。确保您有另一个会话连接到数据库,并在测试完成后运行drop trigger TRG_IP_RESTRICT;。
CREATE OR REPLACE TRIGGER TRG_IP_RESTRICT
AFTER LOGON ON DATABASE
DECLARE
V_USER VARCHAR2(30);
V_GRP VARCHAR2(50);
--Only an ORA-600 error can stop logons for users with either
--"ADMINISTER DATABASE TRIGGER" or "ALTER ANY TRIGGER".
--The ORA-600 also generates an alert log entry and may warn an admin.
internal_exception exception;
pragma exception_init( internal_exception, -600 );
BEGIN
SELECT USER INTO V_USER FROM DUAL;
V_GRP := SYS_CONTEXT('USERENV', 'TERMINAL');
IF V_USER IN ('<list of users>') THEN
IF V_GRP NOT IN ('<list of terminals>') THEN
raise internal_exception;
-- RAISE_APPLICATION_ERROR(-20001,
-- 'Access Denied by DBA TEAM : ' || V_GRP ||
-- ' on ' || V_USER || ' from ' ||
-- SYS_CONTEXT('USERENV', 'IP_ADDRESS'));
END IF;
END IF;
END;
/有了该触发器,即使DBA用户在连接时也会收到此错误消息:
ERROR:
ORA-00600: internal error code, arguments: [600], [], [], [], [], [], [], [],
[], [], [], []
ORA-06512: at line 21https://stackoverflow.com/questions/45582131
复制相似问题