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