ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 客户端非授权登录限制管理

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

原创 Linux操作系统 作者:golden_zhou 时间:2013-04-09 11:33:48 0 删除 编辑
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-03-09

  • 博文量
    238
  • 访问量
    301795