Maintenance trigger

See Start and stop database

As sys!!

CREATE OR REPLACE TRIGGER maintenance_trg
   AFTER LOGON ON DATABASE
DECLARE
   v_sid       NUMBER;
   v_isdba     VARCHAR2 (10);
   v_program   VARCHAR2 (30);
BEGIN
   EXECUTE IMMEDIATE 'select distinct sid from sys.v_$mystat'
                INTO v_sid;
   EXECUTE IMMEDIATE 'select username from sys.v_$session where sid = :b1'
                INTO v_program
               USING v_sid;
   SELECT SYS_CONTEXT ('userenv', 'ISDBA')
     INTO v_isdba
     FROM DUAL;
   v_program := UPPER (v_program);
   IF     (NOT v_program IN
                   ('DBSNMP', 'HAMON', 'OEMAGENT', 'PATROL', 'SYS', 'SYSTEM',
                    'PERFSTAT', 'OPS$ORACLE')
          )
      AND (NOT v_program IS NULL)
   --and v_isdba = 'FALSE'
   THEN
      raise_application_error
                  (-20001,
                      'Fw IT-OP DBA Support: '
                   || 'Maintenance in corso, connessione non consentita per '
                   || v_program
                  );
   END IF;
END;
/