首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于终端的oracle用户限制触发器

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

Stack Overflow用户
提问于 2017-08-09 05:13:57
回答 2查看 1.6K关注 0票数 1

除了两个终端之外,我希望限制Oracle用户登录数据库。我写了下面的触发器。

代码语言:javascript
复制
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;

尽管它运转良好,而且在技术上应该是例外的部分。但同时,它允许连接,而不是向用户显示错误消息。

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

发布于 2017-08-09 05:58:48

这样的触发器只适用于非DBA用户,没有一个不具有adminster database trigger权限的用户。

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

票数 0
EN

Stack Overflow用户

发布于 2017-08-09 06:07:26

根据PL/SQL语言引用

如果系统触发器是数据库登录触发器,且用户具有“管理数据库触发器”权限,则即使触发器引发异常,用户也能够成功登录。对于架构登录触发器,如果用户登录是触发器所有者或具有任何触发器权限,则允许登录。只回滚触发器操作,并在跟踪文件和警报日志中记录错误。

您可以通过引发将破坏整个会话的ORA-600错误来解决此限制。错误消息不会对用户有帮助,但至少会阻止他们。

下面的示例代码将绝对阻止每个人连接到数据库,甚至SYSDBA。非常小心地运行它。确保您有另一个会话连接到数据库,并在测试完成后运行drop trigger TRG_IP_RESTRICT;

代码语言:javascript
复制
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用户在连接时也会收到此错误消息:

代码语言:javascript
复制
ERROR:
ORA-00600: internal error code, arguments: [600], [], [], [], [], [], [], [],
[], [], [], []
ORA-06512: at line 21
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45582131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档