oracle触发基于终端的用户限制

时间:2017-08-09 05:13:57

标签: oracle triggers

我想限制Oracle用户登录数据库,除了几个终端。我在下面写了触发器。

protected void Button1_Click(object sender, EventArgs e)
{
  Timer1.Enabled = true;
}

即使它工作正常并且处于异常部分,这应该在技术上发生。但与此同时,它允许连接而不是向用户显示错误消息。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

此类触发器仅适用于非DBA用户,没有一个恰好是没有adminster database trigger权限的用户。

否则您可能会阻止整个数据库。

答案 1 :(得分:0)

根据PL/SQL Language Reference

  

如果系统触发器是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