zoukankan      html  css  js  c++  java
  • Oracle触发器4数据库事件触发器

    创建数据库事件触发器语法


    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。

  • 相关阅读:
    Python中利用xpath解析HTML
    常见聚类算法——K均值、凝聚层次聚类和DBSCAN比较
    格式化字符串format函数
    编程语言这个垂直方向
    CLR,GC 表示什么意思?
    ASP.Net MVC开发基础学习笔记:一、走向MVC模式
    NPOI 通过excel模板写入数据并导出
    SQL 注意事项
    解决微信公众号OAuth出现40029(invalid code,不合法的oauth_code)的错误
    iis 站点中文乱码 解决方案
  • 原文地址:https://www.cnblogs.com/AlbertCQY/p/3007205.html
Copyright © 2011-2022 走看看