Oracle PL/SQL Tutorial/Trigger/Database Level Trigger

Материал из SQL эксперт
Перейти к: навигация, поиск

Database level trigger: AFTER STARTUP ON DATABASE

   <source lang="sql">

SQL> SQL> SQL> CREATE TABLE uptime_log (

 2      database_name       VARCHAR2(30),
 3      event_name          VARCHAR2(20),
 4      event_time          DATE,
 5      triggered_by_user   VARCHAR2(30)
 6  );

Table created. SQL> SQL> CREATE OR REPLACE TRIGGER log_startup

 2  AFTER STARTUP ON DATABASE
 3  BEGIN
 4      INSERT INTO uptime_log
 5          (database_name,
 6           event_name,
 7           event_time,
 8           triggered_by_user)
 9          VALUES (sys.database_name,
10                  sys.sysevent,
11                  sysdate,
12                  sys.login_user);
13      COMMIT;
14  END;
15  /

Trigger created. SQL> SQL> drop table uptime_log; Table dropped. SQL></source>


Database level trigger: BEFORE SHUTDOWN ON DATABASE

   <source lang="sql">

SQL> SQL> CREATE TABLE uptime_log (

 2      database_name       VARCHAR2(30),
 3      event_name          VARCHAR2(20),
 4      event_time          DATE,
 5      triggered_by_user   VARCHAR2(30)
 6  );

Table created. SQL> SQL> SQL> CREATE OR REPLACE TRIGGER log_shutdown

 2  BEFORE SHUTDOWN ON DATABASE
 3  BEGIN
 4      INSERT INTO uptime_log
 5          (database_name,
 6           event_name,
 7           event_time,
 8           triggered_by_user)
 9          VALUES (sys.database_name,
10                  sys.sysevent,
11                  sysdate,
12                  sys.login_user);
13      COMMIT;
14  END;
15  /

Trigger created. SQL> SQL> drop table uptime_log; Table dropped.</source>


Database logoff trigger

   <source lang="sql">

SQL> SQL> CREATE TABLE session_logon_statistics

 2  (user_logged VARCHAR2(30),
 3  start_time   DATE,
 4  end_time     DATE);

Table created. SQL> SQL> CREATE OR REPLACE TRIGGER logoff_log_trigger

 2  BEFORE LOGOFF
 3  ON DATABASE
 4  BEGIN
 5     UPDATE session_logon_statistics
 6     SET    end_time    = SYSDATE
 7     WHERE  user_logged = USER
 8     AND    end_time IS NULL;
 9  END;
10  /

Trigger created. SQL> SQL> SELECT user_logged,

 2         TO_CHAR(start_time, "MM/DD/YYYY HH24:MI:SS") "START TIME",
 3         TO_CHAR(end_time, "MM/DD/YYYY HH24:MI:SS") "END TIME"
 4  FROM   session_logon_statistics
 5  where  rownum < 50
 6  order by user_logged, start_time;

no rows selected SQL> SQL> drop trigger logoff_log_trigger; Trigger dropped. SQL> SQL> drop table session_logon_statistics; Table dropped.</source>


Database logon trigger

   <source lang="sql">

SQL> SQL> CREATE TABLE session_logon_statistics

 2  (user_logged VARCHAR2(30),
 3  start_time   DATE,
 4  end_time     DATE);

Table created. SQL> SQL> SQL> SQL> CREATE OR REPLACE TRIGGER logon_log_trigger

 2  AFTER LOGON
 3  ON DATABASE
 4  BEGIN
 5     INSERT INTO session_logon_statistics
 6     (user_logged, start_time)
 7     VALUES
 8     (USER, SYSDATE);
 9  END;
10  /

Trigger created. SQL> SQL> SQL> SQL> SELECT user_logged,

 2         TO_CHAR(start_time, "MM/DD/YYYY HH24:MI:SS") "START TIME",
 3         TO_CHAR(end_time, "MM/DD/YYYY HH24:MI:SS") "END TIME"
 4  FROM   session_logon_statistics
 5  where   rownum < 50
 6  order by user_logged, start_time;

no rows selected SQL> SQL> SQL> drop trigger logon_log_trigger; Trigger dropped. SQL> SQL> drop table session_logon_statistics; Table dropped.</source>


New Database triggers

   <source lang="sql">

SQL> CREATE OR REPLACE TRIGGER On_Logon

 2  AFTER LOGON
 3  ON SCHEMA
 4  BEGIN
 5    DBMS_UTILITY.ANALYZE_SCHEMA(sys.login_user,"ESTIMATE");
 6  END;
 7  /

Trigger created. SQL> SQL> drop trigger On_Logon; Trigger dropped.</source>


Save information about all errors in an after-servererror on database

   <source lang="sql">

SQL> create table userLog

 2  (error_date date,
 3   username varchar2(30),
 4   error_msg varchar2(2000),
 5   error_sql varchar2(2000));

Table created. SQL> SQL> create or replace trigger log_errors after servererror on database

 2  declare
 3     sql_text ora_name_list_t;
 4     msg varchar2(2000) := null;
 5     stmt varchar2(2000):= null;
 6  begin
 7     for i in 1 .. ora_server_error_depth loop
 8        msg := msg||ora_server_error_msg(i);
 9     end loop;
10     for i in 1..ora_sql_txt(sql_text) loop
11        stmt := stmt||sql_text(i);
12     end loop;
13     insert into userLog(error_date,username,error_msg,error_sql)values (sysdate,ora_login_user,msg,stmt);
14  end;
15  /

Trigger created. SQL> SQL> SQL> SQL> drop table userLog; Table dropped.</source>