程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 觸發器六(系統觸發器)(學習筆記),系統觸發器學習筆記

觸發器六(系統觸發器)(學習筆記),系統觸發器學習筆記

編輯:Oracle教程

觸發器六(系統觸發器)(學習筆記),系統觸發器學習筆記


系統觸發器

系統觸發器用於監視數據庫服務的打開、關閉、錯誤等信息的取得,或者是監控用戶的行為操作等。如果要創建系統觸發器,可以使用如下的語法

 

CREATE [OR REPLACE] TRIGGER 觸發器名稱
    [BEFORE | AFTER] [數據庫事件] ON [DATABASE | SCHEMA]
    [WHEN 觸發條件]
    [DECLARE]
        [程序聲明部分 ;]
    BEGIN
        程序代碼部分 ;
    END [觸發器名稱] ;

 

使用管理員才可以創建系統觸發器

系統觸發器事件

NO. 事件 觸發時機 描述 1 STARTUP AFTER 數據庫實例啟動之後觸發 2 SHUTDOWN BEFORE 數據庫實例關閉之前觸發 3 SERVERERROR AFTER 出錯誤時觸發 4 LOGON AFTER 用戶登錄後觸發 5 LOGOFF BEFOR 用戶注銷前觸發

示例一、登錄登出日志功能

--創建序列
CREATE SEQUENCE user_log_seq;
--創建日志表
CREATE TABLE user_log(
             logid          NUMBER CONSTRAINT  pk_logoid PRIMARY KEY,
             username       VARCHAR2(50)           NOT NULL,
             logodate       DATE,
             logoffdate     DATE,
             ip             VARCHAR2(20),
             logtype        VARCHAR2(20)
);
--創建登錄觸發器
create or replace trigger logon_trigger
  AFTER LOGON ON DATABASE
  
declare
 
begin
   INSERT INTO user_log(logid,username,logodate,ip,logtype)
  VALUES(user_log_seq.nextval,ora_login_user,SYSDATE,ora_client_ip_address,'LOGON');
end logon_trigger;
--創建登出觸發器
CREATE OR REPLACE TRIGGER LOGON_TRIGGER
  BEFORE LOGOFF ON DATABASE

DECLARE

BEGIN
  INSERT INTO USER_LOG
    (LOGID, USERNAME, LOGOFFDATE, IP, LOGTYPE)
  VALUES
    (USER_LOG_SEQ.NEXTVAL,
     ORA_LOGIN_USER,
     SYSDATE,
     ORA_CLIENT_IP_ADDRESS,
     'LOGFF');
END LOGON_TRIGGER;

切換用戶進行登錄

使用管理登錄,查看user_log表

SELECT * FROM user_log;

示例二、 系統啟動和關閉時,日志記錄功能

 

--創建索引
CREATE SEQUENCE db_event_log_seq;
--查詢索引
SELECT * FROM user_sequences WHERE sequence_name='DB_EVENT_LOG_SEQ';
--創建數據庫記錄事件表
CREATE TABLE db_event_log(
             eventid          NUMBER    CONSTRAINT pk_eventid PRIMARY KEY,
             enentType        VARCHAR2(50)        NOT NULL,
             enentDate        DATE                 NOT NULL,
             eventUser        VARCHAR2(50)         NOT NULL
);
--查詢表
SELECT * FROM db_event_log;
--創建啟動之後觸發器
create or replace trigger startup_trigger
  after startup ON DATABASE    

declare
 
BEGIN
   INSERT INTO db_event_log(eventid,enenttype,enentdate,eventuser)
   VALUES(db_event_log_seq.nextval,'STARTUP',SYSDATE,ora_login_user);
   COMMIT;
end startup_trigger;

--創建關閉之前觸發器
create or replace trigger shutdown_trigger
  before shutdown  ON DATABASE   

declare
  
begin
   INSERT INTO db_event_log(eventid,enenttype,enentdate,eventuser)
   VALUES(db_event_log_seq.nextval,'SHUTDOWN',SYSDATE,ora_login_user);
   COMMIT;
end shutdown_trigger;
-測試在sqlplus中執行
SHUTDOWN ABORT; --立刻關閉
startup          --啟動
SELECT * FROM db_event_log;

示例三、 錯誤信息日志

--創建索引
CREATE SEQUENCE db_error_seq;
--查詢索引
SELECT * FROM user_sequences WHERE sequence_name='DB_ERROR_SEQ';
---創建一張記錄錯誤信息的數據表
CREATE TABLE db_error(
             eid             NUMBER  CONSTRAINT pk_eid PRIMARY KEY,
             username        VARCHAR2(50),
             errorDate       DATE,
             dbname          VARCHAR2(50),
             CONTENT         CLOB
);
--查詢表
SELECT * FROM db_error;
--創建數據庫錯誤觸發器
create or replace trigger error_trigger
  after servererror ON DATABASE   

declare
  
begin
     INSERT INTO db_error(eid,username,errordate,dbname,content)
     VALUES(db_error_seq.nextval,ora_login_user,SYSDATE,ora_database_name,dbms_utility.format_error_stack);
     --ora_login_user     用戶名
     --ora_database_name  數據庫名
     --dbms_utility包
     --dbms_utility.format_error_stack錯誤內容
end error_trigger;
--測試
--使用普通用戶
SELECT * FROM orcl;
INSERT INTO dept(deptno,dname,loc)
VALUES(10,'111','SZ');
--查詢表
SELECT * FROM db_error;

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved