oracle 客户端非授权登录限制管理

CREATE OR REPLACE TRIGGER TRG_LOGON_RESTRICT
   AFTER LOGON
   ON DATABASE
DISABLE
DECLARE
   SQL_STATEMENT   VARCHAR2 (500);
   V_EXIST         NUMBER (19);

   TYPE LOGON_RECORD_TYPE                                       --定义记录类型
   IS
      RECORD (
         ID           TAB_AUDIT_LOGON_RECORD.id%TYPE,
         LOGON_TIME   TAB_AUDIT_LOGON_RECORD.logon_time%TYPE,
         SESSION_ID   TAB_AUDIT_LOGON_RECORD.session_id%TYPE,
         OS_USER      TAB_AUDIT_LOGON_RECORD.os_user%TYPE,
         IP_ADDRESS   TAB_AUDIT_LOGON_RECORD.ip_address%TYPE,
         TERMINAL     TAB_AUDIT_LOGON_RECORD.terminal%TYPE,
         HOST_NAME    TAB_AUDIT_LOGON_RECORD.host_name%TYPE,
         USER_NAME    TAB_AUDIT_LOGON_RECORD.user_name%TYPE
      );

   LOGON_RECORD    LOGON_RECORD_TYPE;
BEGIN
   SQL_STATEMENT := '0';
   V_EXIST := 0;


   SELECT   SEQ_LOGON.NEXTVAL id,
            SYSDATE,
            SYS_CONTEXT ('USERENV', 'SESSIONID'),
            SYS_CONTEXT ('USERENV', 'OS_USER'),
            SYS_CONTEXT ('USERENV', 'IP_ADDRESS'),
            SYS_CONTEXT ('USERENV', 'TERMINAL'),
            SYS_CONTEXT ('USERENV', 'HOST'),
            ORA_LOGIN_USER
     INTO   LOGON_RECORD
     FROM   DUAL;

   INSERT INTO TAB_AUDIT_LOGON_RECORD
     VALUES   LOGON_RECORD;

   SELECT   COUNT ( * )
     INTO   V_EXIST
     FROM   TAB_AUTHORIZATION_LOGON_USER
    WHERE       ip_address = LOGON_RECORD.ip_address
            AND terminal = LOGON_RECORD.terminal
            AND valid = 1;

   IF V_EXIST IS NULL
   THEN
      V_EXIST := 0;
   END IF;

   IF V_EXIST > 0
   THEN
      DBMS_OUTPUT.put_line ('Authorized user, please be careful operation!');
   ELSE
      SP_KILL_SESSION (LOGON_RECORD.HOST_NAME);

      raise_application_error (-20001,
                               'Restricted LOGON! Please contact DBA');
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.put_line ('Login session does not exist');
   WHEN OTHERS
   THEN
      RAISE_APPLICATION_ERROR (-20002,
                               'Restricted LOGON! Please contact DBA!');
END;
/


CREATE OR REPLACE PROCEDURE SYS.SP_KILL_SESSION (P_HOST_NAME IN VARCHAR)
AS
   SQL_STATEMENT   VARCHAR2 (500);
BEGIN
   SQL_STATEMENT := '0';

   --定义游标
   DECLARE
      CURSOR MACHINE_AUDIT
      IS
         SELECT   sid, serial#
           FROM   v$session
          WHERE   machine = P_HOST_NAME;

      --定义记录变量
      MACHINE_RECORD   MACHINE_AUDIT%ROWTYPE;
   --开始使用游标取数据

   BEGIN
      OPEN MACHINE_AUDIT;

      LOOP
         FETCH MACHINE_AUDIT INTO   MACHINE_RECORD;


         --游标取不到数据则退出
         EXIT WHEN MACHINE_AUDIT%NOTFOUND;


         SQL_STATEMENT :=
               'ALTER SYSTEM KILL SESSION '
            || ''''
            || MACHINE_RECORD.sid
            || ','
            || MACHINE_RECORD.serial#
            || '''';

         EXECUTE IMMEDIATE SQL_STATEMENT;
      END LOOP;

      CLOSE MACHINE_AUDIT;
   END;
END;
/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25198367/viewspace-758026/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25198367/viewspace-758026/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值