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

Oracle中的SystemTriggers(DDL觸發器)

編輯:Oracle教程

這算是比較偏門的知識了,但是有很多實際意義,可以幫助DBA完成一些日常的管理工作,比如可以禁用一些用戶的功能(禁止用戶修改或者刪除某一個表,限制IP登陸等)。

概述

Oracle數據庫中的System Trigger可以建立在Schema(在某些DDL語句執行的時候觸發)或者Database(主要在系統層面觸發,比如說登陸或者發生某些系統級別的報錯)。

SCHEMA trigger:

創建於某一個schema上面,並且經由某些DDL語句觸發執行。具體看下文鏈接更多的DDL event。

Database trigger:

數據庫觸發器基於數據庫之上,由某些數據庫級別的事件觸發。具體看下文鏈接更多的Database event。

觸發模式

與DML觸發器一樣,有兩種觸發模式

before:在語句執行前觸發

after:在語句執行後觸發

這個就不用細說了。

簡單示例

限制IP登陸

組織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

根據IP判斷是否可以刪除對象

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信息。

拓展閱讀

其實重點在這裡

更多的DDL event

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC

更多的Database event

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

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