這算是比較偏門的知識了,但是有很多實際意義,可以幫助DBA完成一些日常的管理工作,比如可以禁用一些用戶的功能(禁止用戶修改或者刪除某一個表,限制IP登陸等)。
Oracle數據庫中的System Trigger可以建立在Schema(在某些DDL語句執行的時候觸發)或者Database(主要在系統層面觸發,比如說登陸或者發生某些系統級別的報錯)。
SCHEMA trigger:
創建於某一個schema上面,並且經由某些DDL語句觸發執行。具體看下文鏈接更多的DDL event。
Database trigger:
數據庫觸發器基於數據庫之上,由某些數據庫級別的事件觸發。具體看下文鏈接更多的Database event。
與DML觸發器一樣,有兩種觸發模式
before:在語句執行前觸發
after:在語句執行後觸發
這個就不用細說了。
組織IP為192.168.100.71的機器發出的連接請求。
create or replace trigger limit_ip
AFTERLOGON on database
begin
ifSYS_CONTEXT('USERENV', 'ip_address') = '192.168.100.71' then
raise_application_error(-20999, 'Cann''t logon this database.');
end if;
end;
C:\Users\fengjun>sqlplusscott/[email protected]:1521/repo
SQL*Plus: Release 11.2.0.3.0 Production on 星期二 2月 25 09:49:182014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
ERROR:
ORA-00604: 遞歸 SQL 級別 1 出現錯誤
ORA-20999: Cann't logon this database.
ORA-06512: 在 line 2
注:如果用戶擁有DBA權限,則不受此觸發器影響。
CREATE OR REPLACE TRIGGER dexter_drop_trigger
BEFOREDROP ON dexter.SCHEMA
BEGIN
RAISE_APPLICATION_ERROR(-20999, 'Cannot drop this object.');
END;
/
dexter@REPO>drop table ttt ;
drop table ttt
*
第 1 行出現錯誤:
ORA-00604: 遞歸 SQL 級別 1 出現錯誤
ORA-20999: Cannot drop this object.
ORA-06512: 在 line 2
CREATE OR REPLACE TRIGGER DDL_TRIGGER_IOT
BEFORE ALTER OR DROP ON IOTPLATFORM.SCHEMA
BEGIN
IF SYS_CONTEXT( 'USERENV', 'ip_address' )= '192.168.0.39' AND
SYS_CONTEXT( 'USERENV', 'OS_USER' )= 'dex' AND
SYS_CONTEXT( 'USERENV', 'HOST' )= 'WORKGROUP\DEX-PC' THEN
NULL;
ELSE
RAISE_APPLICATION_ERROR(-20999, 'Connectto ur dba .' );
END IF;
END;
如果沒有使用Listener,而是使用本地IPC方式登陸數據庫,限制IP的功能會有缺失,因為sys_context無法獲得相關的IP信息。
其實重點在這裡
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#LNPLS2064
通過sys_context 獲取更多連接信息。
http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions184.htm#sthref1594