觸發器六 系統觸發器 學習筆記

2022-04-19 23:21:29 字數 4953 閱讀 1809

系統觸發器用於監視資料庫服務的開啟、關閉、錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法

create

[or replace

]trigger

觸發器名稱

[before | after][

資料庫事件]on

[database | schema][

when 觸發條件][

declare][

程式宣告部分 ;

]begin

程式**部分 ;

end[

觸發器名稱

] ;

no.事件

觸發時機描述1

startup

after

資料庫例項啟動之後觸發

2shutdown

before

資料庫例項關閉之前觸發

3servererror

after

出錯誤時觸發

4logon

after

使用者登入後觸發

5logoff

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

orreplace

trigger

logon_trigger

after logon

ondatabase

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

orreplace

trigger

logon_trigger

before logoff

ondatabase

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

notnull

, eventuser

varchar2(50) not

null

);--

查詢表select

*from db_event_log;

--

建立啟動之後觸發器

create

orreplace

trigger

startup_trigger

after startup

ondatabase

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

orreplace

trigger

shutdown_trigger

before

shutdown

ondatabase

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

orreplace

trigger

error_trigger

after servererror

ondatabase

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;

觸發器六 系統觸發器 學習筆記

系統觸發器用於監視資料庫服務的開啟 關閉 錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法 create or replace trigger 觸發器名稱 before after 資料庫事件 on database schema when 觸發條件 decl...

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

替代觸發器和系統觸發器

為什麼使用instead of觸發器?在簡單的檢視上往往可以執行insert update delete操作的,但在複雜檢視上是有限制的,比如有分組 集合運算子的,這時就需要建立替代觸發器 instead of是只適用於檢視上的一種觸發器,不能指定before和after選項,create orre...