Oracle觸發器4-資料庫事件觸發程序

來源:互聯網
上載者:User
建立資料庫事件觸發程序文法


1 CREATE [OR REPLACE] TRIGGER trigger_name
2 {BEFORE | AFTER} {database_event} ON {DATABASE | SCHEMA}

3 DECLARE
4 Variable declarations
5 BEGIN
6 ...some code...
7 END;

資料庫事件觸發程序是發生在資料庫範圍的事件時觸發的。有6個資料庫事件觸發程序。STARTUP

資料庫開啟時觸發的。

沒有before startup觸發器。

Example:

CREATE OR REPLACE TRIGGER startup_pinner
AFTER STARTUP ON DATABASE
BEGIN
pin_plsql_packages;
pin_application_packages;
END;

SHUTDOWN

資料庫正常關閉時觸發的。

沒有after shutdown 觸發器。

Example:

CREATE OR REPLACE TRIGGER before_shutdown
BEFORE SHUTDOWN ON DATABASE
BEGIN
gather_system_stats;
END;

注意:只有在正常關閉情況下,shutdown nomal或者shutdown immediate時觸發,非正常關閉shutdown abort不能觸發。

SERVERERROR

當資料庫發生錯誤時觸發。

沒有before servererror觸發器。

Example:

DROP TRIGGER error_logger;

DROP TABLE error_log;

CREATE SEQUENCE error_seq;

CREATE TABLE error_log
(error_id     NUMBER,
username     VARCHAR2(30),
error_number NUMBER,
sequence     NUMBER,
timestamp    DATE);

CREATE OR REPLACE TRIGGER error_logger
AFTER SERVERERROR
ON SCHEMA
DECLARE

  v_errnum    NUMBER;          -- the Oracle error #
  v_now       DATE := SYSDATE; -- current time

BEGIN

  -- for every error in the error stack...
  FOR e_counter IN 1..ORA_SERVER_ERROR_DEPTH LOOP

    -- write the error out to the log table; no
    -- commit is required because we are in an
    -- autonomous transaction
    INSERT INTO error_log(error_id,
                          username,
                          error_number,
                          sequence,
                          timestamp)
    VALUES(error_seq.nextval,
           USER,
           ORA_SERVER_ERROR(e_counter),
           e_counter,
           v_now);

  END LOOP;  -- every error on the stack

END;
/

 

LOGON

當開始一個資料庫會話時觸發。

沒有before logon觸發器。

Example:

CREATE OR REPLACE TRIGGER after_logon
AFTER LOGON ON SCHEMA
DECLARE
v_sql VARCHAR2(100) := 'ALTER SESSION ENABLE RESUMABLE ' ||
'TIMEOUT 10 NAME ' || '''' ||
'OLAP Session' || '''';

BEGIN
EXECUTE IMMEDIATE v_sql;
DBMS_SESSION.SET_CONTEXT('OLAP Namespace',
'Customer ID',
load_user_customer_id);
END;

 

LOGOFF

當一個資料庫會話正常終止時觸發。

沒有after logoff觸發器。

Example:

CREATE OR REPLACE TRIGGER before_logoff
BEFORE LOGOFF ON DATABASE
BEGIN
gather_session_stats;
END;

DB_ROLE_CHANGE

當一個備用資料庫切換成主要資料庫時或者反過來,觸發。

多用於dataguard。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.