我想限制Oracle用户登录数据库,除了几个终端。我在下面写了触发器。
protected void Button1_Click(object sender, EventArgs e)
{
Timer1.Enabled = true;
}
即使它工作正常并且处于异常部分,这应该在技术上发生。但与此同时,它允许连接而不是向用户显示错误消息。
有人可以帮忙吗?
答案 0 :(得分:0)
此类触发器仅适用于非DBA用户,没有一个恰好是没有adminster database trigger
权限的用户。
否则您可能会阻止整个数据库。
答案 1 :(得分:0)
如果系统触发器是DATABASE LOGON触发器且用户具有 ADMINISTER DATABASE TRIGGER权限,然后用户就可以登录 即使触发器引发异常也会成功。对于SCHEMA LOGON 触发器,如果用户登录是触发器所有者或具有ALTER ANY 然后允许TRIGGER权限登录。只有触发动作才是 回滚并在跟踪文件和警报日志中记录错误。
您可以通过引发会破坏整个会话的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 21