2011-05-11

Oracle Triggers 觸發器

Oracle Database triggers 的使用時機:想要於資料庫有變化時,自動執行某種程序,如:
  • 當資料庫伺服器發生資料操作語言(DML) 事件-包含對資料表或檢視發出的 UPDATE、INSERT 或 DELETE 陳述式。
    觸發程序可協助強制執行商業規則,以及當資料表或檢視中的資料修改時協助擴充資料的完整性。

  • 當資料庫伺服器發生「資料定義語言」(Data Definition Language,DDL) 事件-包含 CREATE、ALTER、DROP 陳述式。
    觸發程序可以用來執行資料庫中的管理工作,例如稽核與管理資料庫作業。

Oracle Database triggers 的五種類型
  1. Statement triggers

    此種 trigger 跟 DML 操作(例如:DELETE、INSERT、UPDATE)有關聯,但每一次的 DML 操作僅會觸發一次 trigger。

    雖然設定在 DML 操作上的 trigger 在 DML 操作發生時僅會出發一次,但可以同時設定多個 trigger 在同一個 DML 操作上,而且還可以透過「FOLLOW」、「PRECEDES」… 等關鍵字來決定多個 trigger 觸發的先後順序。

  2. Row triggers
    當 table 中的每一列資料發生 INSERT、UPDATE 或是 DELETE 時,此種 trigger 就會觸發。大致跟 statement trigger 運作方式相同,但 row trigger 是針對「每一列」資料進行觸發;因此假設一個 DML 同時影響很多筆資料時,statement trigger 僅會出發一次,但 row trigger 卻會觸發很多次。

  3. INSTEAD OF triggers
    可以用在當使用者針對 VIEW 或是衍生欄位進行操作時,可透過 trigger 將資料進行正確的資料處理。

  4. User event triggers
    用於 DDL(例如:CREATE、ALTER、DROP、USER LOGON/LOGOFF … 等等) 以及特定的 DML 操作(分析、統計、稽核、使用者權限管理)上。

  5. System event triggers
    當資料庫啟動、關閉、或是發生錯誤的事件發生時,會進行觸發。
Trigger 語法與部份說明:

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {INSERT | DELETE | UPDATE [OF column [, column …]]} ON {[schema.] table_name | [schema.] view_name} [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ]

[WHEN condition]

BEGIN
triggered_action;
END
  • trigger name 在同一個 schema 中,trigger name 必須是唯一的。

  • {BEFORE | AFTER | INSTEAD OF}
    即該TRIGGER 是在觸發事件發生之前(BEFORE)還是之後(AFTER)觸發,也就是觸發事件和該TRIGGER 的操作順序。不是每個事件都有前後可以設定,例如:STARTUP、SUSPEND、LOGON … 等事件,就僅有 AFTER 可以用;而 SHUTDOWN、LOGOFF … 等事件就僅有 BEFORE 可以用。

  • {INSERT | DELETE | UPDATE [OF column [, column …]]} ON {[schema.] table_name | [schema.] view_name}

    何種情況下觸發TRIGGER; 例如:INSERT, UPDATE, DELETE。

  • REFERENCING
    說明相關名稱,在ROW Triggers的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,預設的相關名稱分別為OLD和NEW。觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。

  • WHEN
    說明觸發約束條件。Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢語句,也不能調用PL/SQL 函數。WHEN 子句指定的觸發約束條件只能用在ROW Triggers的BEFORE 和AFTER 不能用在INSTEAD OF。
  • triggered_action:trigger 所要執行的程式內容。



Trigger 的設計原則與限制

雖然 trigger 看似很好用,可以作很多的管理與控制,但最好還是注意以下幾點原則與限制:

  1. 過度使用 trigger 或許會產生複雜的依賴關係,後續的維護變得很困難。
  2. 確定當某個特定工作執行後,所有相關與相依的工作都有被一一執行。
  3. 避免將 recursive trigger 的發生,否則記憶體裝再多都沒用。
  4. 避免 trigger 的工作會觸發另一個 trigger 而造成連鎖效應,以免造成非預期的情況發生,或是對資料庫效能造成影響。
  5. 不要用 trigger 作一些資料庫已經能做的工作,例如:參考完整性的檢查。
  6. 確定「BEFORE」、「AFTER」的使用有符合規則與需求。
  7. trigger 的程式碼不宜過多(Oracle 限制不能超過 32 Kb),若是程式碼太多,或許可以考慮寫成 stored procedure 來處理。
  8. 確定 trigger 中運作的工作符合資料庫與商業邏輯規則,若是要針對特定人物、特定團體或是特定 application 客製化工作需求,別用 trigger,寫在 application 裡面吧!
  9. 在 trigger 中無法使用 COMMIT、ROLLBACK、SAVEPOINT … 等關鍵字,因為 DDL 操作已經隱含 COMMIT 在裡面了。

<範例>
資料表 employees 內容若有修改,記錄修改的使用者、時間、及修改的型態到employees_log。(在employees建立Row triggers 名為 biud_employee)

Create or replace trigger biud_employee Before insert or update or delete On employees FOR EACH ROW;

Begin
if inserting then l_action:=’Insert’;
elsif updating then l_action:=’Update’;
elsif deleting then l_action:=’Delete’;
else raise_application_error(-20001,’You should never ever get this error.’);
Insert into employees_log(Who,action,when) Values( user, l_action,sysdate);
End;


參考網站:

2010-12-15

Android 初探 -網路資源



什麼是 Android 應用程式框架 (Application framework)?


對於應用程式的開發者來說,他得以透過Java程式呼叫應用程式框架所提供的應用程式界面(Application Programming Interface, API),來實作更底層的函式庫(Libraries)功能。在這個應用程式框架之中,包含了活動管理者(Activity Manager)、視窗管理者(Window Manager)、內容提供者(Content Providers)、外觀元件系統(View System)、程式管理者(Package Manager)、電話功能管理者(Telephony Manager)、資源管理者(Resource Manager)、地理位置管理者(Location Manager)以及訊息管理者(Notification Manager)等服務或者系統。


什麼是 Dalvik 虛擬機器 (Dalvik virtual machine)?


Android SDK會將所有檔案壓縮包裏成單一的Android封裝檔(副檔名為 .apk,Android application package)。在Andorid當中的每一個應用程式都會對應”一個”專屬它的Dalvik VM。如此的設計,可以確保每一個應用程式之間都是相互獨立而彼此不影響。


什麼是 Webkit 網頁引擎 (Web browser engine)?


它可以讓正常網頁(非手機版本)如同在個人電腦般,自動調整成頁寬(auto fit page)的方式完整縮小呈現在手機的小螢幕中,如此可以方便使用者立即在手機上看到正常網頁的全觀(如下圖所示),如果要近看某區塊之內容時,只要將該區塊放大即可。這是其它舊式網頁引擎不容易做到的事,但應用Webkit網頁引擎卻可輕易達成。


Android API 已內含Webkit相關的函式庫,應用程式需要內嵌顯示網頁內容或者需要執行Java Script客戶端網頁程式碼等狀況時,皆可運用Webkit函式庫來進行整合的動作。


什麼是 OpenGL ES?


Android的圖形處理分成兩個部份,一為2D圖形處理,這部份是採Android自行規範定義的2D圖形處理函式庫(2D graphics library)。二為3D圖形處理,此部份則採行OpenGL ES 3D圖形處理函式庫。


什麼是 SQLite 資料庫?


開發者在開發應用程式的過程之中,難免會有資料儲存的需求,比如需要儲存應用程式的設定資料或者上一次遊戲關卡的資料等…。因此,Android內建了一個名為SQLite的關聯式資料庫引擎(Relational database engine)。Android應用程式的開發者則採呼叫API的方式來與SQLite作溝通。同時,SQLite當中的資料庫是以單一檔案的方式儲存在手機硬體當中。


Android 支援那些感應器(Sensor)?


Andorid應用程式開發者所能發揮的空間,除了取決於作業系統的版本之外,也指涉了手機硬體上的週邊設備。亦即,開發者能夠應用智慧型手機上的數位相機鏡頭(手機照相機)、衛星定位裝置、電子羅盤(方向感應器)與重力感應器等週邊設備,去創造更多深具創新價值的應用程式。


什麼是 Android SDK?


Google為了讓更多開發者參與Android應用程式的開發行列,因此,它開放給大眾免費下載安裝Android 軟體開發工具包(software development kit, SDK)。而且,這個工具包可以安裝在Windows、Linux以及Mac等不同的作業系統環境當中。 Android SDK除了提供了完整的Android API之外,更包括了Android應用程式除錯工具(Android Debug Bridge, ADB)以及Android 手機模擬器(Android Emulator,此為在個人電腦上模擬Android手機的環境)。如此免費與開放是Android之所以在近來深受手機應用程式開發者喜愛的主因之一。除了Android SDK之外,其它配合它的軟體也是免費性質。這些軟體包括了Eclipse整合開發環境(Integrated Development Environment, IDE)以及Eclipse專用之Android開發工具外掛(ADT Plugin for Eclipse)。再加上原本就免費開放下載的Java開發工具包(Java Development Kit, JDK)。開發者幾乎不用花費到一毛錢,便可以自己建構一個很完整且便利的Android應用程式開發環境,並專心構思與發展屬於自己的應用程式。不過,如果開發者要上傳應用程式到Android Market網站供大家免費下載或收費販售時,則需要再付25美元的帳號註冊費。


開發套件的流程順序


2010-06-28

觀察電腦效能:效能監視器

電腦效能的觀察,主要就幾個關鍵:CPU、MEMORY、HDD IO、網路流量。Windows 提供「系統監視器」可讓您收集和檢視記憶體、磁碟及處理器用量等活動的即時資料。在系統中的效能監視器,可以監看系統上的各項效能趨勢,而且隨著你在系統中安裝的軟體愈多,它也會增加各項相對應的計數器可以使用。

要使用系統監視器監視系統,請依下列步驟進行:
  • 按 開始 / 控制台 / 系統管理工具 / 效能 ,進入系統監視器視窗。



  • 在 計數器記錄檔 上按一下右鍵,並從快顯功能表中選擇新增記錄檔設定(1) 。出現 新記錄檔設定 對話方塊後,在這裡輸入您的記錄檔設定名稱(2) ,最後按一下 確定 。
  • 點選 [新增計數器](3) ,並鍵入您想要在 [電腦] 方塊中監視的電腦的名稱。比方說鍵入 \ \ computername。
  • 選擇想要監視的項目(4),並選擇想要收集的數據內容(5),以及監視的個體(6)
  • 不清楚可看解說(7)



監視 CPU 使用狀況
持續偏高的 CPU 使用量比率可能代表必須將 CPU 升級,或增加多個處理器。此外,偏高的 CPU 使用率可能代表應用程式的微調或設計不良。將應用程式最佳化後可降低 CPU 的使用率。

Processor:% Processor Time
是指處理器執行非閒置執行緒的時間百分比。計算方式是,先計算在某個取樣區間中,閒置執行緒處於使用中的時間,再減去這個時間。(每個處理器都有一個閒置執行緒,如果沒有執行其他執行緒的話,閒置執行緒會不停執行迴圈來消耗時間。)這個計數器式處理器活動的主要顯示器,會顯示取樣區間中執行工作的平均百分比。計算方式是,監視服務停用時間,然後用 100% 減去這個時間值。

狀態維持在 80% 到 90%,可能代表必須將 CPU 升級或增加更多處理器。使用多處理器系統時,可針對每個處理器監視此計數器的不同執行個體。此值代表特定處理器上的處理器時間總和。

Processor:%User Time
是在使用者模式中所用到的處理器時間百分比。使用者模式是一種限制性的處理模式,設計給應用程式,環境子系統,及整合子系統使用。另外一種模式是特殊權限模式,設計給作業系統元件使用,允許直接存取硬體及所有的記憶體。作業系統會將應用程式執行緒轉換到特殊權限模式來存取作業系統服務。這個計數器用百分比格式來顯示忙碌時間平均值。

Processor:% Privileged Time
相當於處理器花費在執行 Microsoft Windows 核心命令的時間百分比。不同的磁碟控制器和驅動程式會使用不同的核心處理 (kernel Process) 時間量。有效率的控制器和驅動程式將使用較少的授權時間,留下較多的處理時間供使用者應用程式使用,同時增加整體的處理能力。


監視記憶體使用狀況
定期監視 Server 執行個體,以確認記憶體使用量是在一般範圍內。您需要確定處理序並未缺少記憶體或消耗太多記憶體。

Memory:Available Bytes
是指在電腦上可用記憶體的數量 (以位元組計算)。它等於記憶體清單中所有歸零記憶體,可用記憶體及待命記憶體加總,此數值代表目前有多少記憶體位元組可供處理序使用。小於4M或是實體記憶體總數的5%表示不足

Memory:Pages/sec
是從磁碟讀取或寫入磁碟,以便解決硬體分頁錯誤的速度。這個計數器是偵測導致系統延遲這類錯誤的主要指示器。超過20也表示不足。


監視硬碟使用狀況

PhysicalDisk:Avg. Disk sec/Transfer
是磁碟轉移操作的平均時間,以秒為單位。在執行 SQL Server 的電腦上,Average Disk Sec/Transfer 時間通常少於 15 毫秒。如果 Average Disk Sec/Transfer 值增加,表示磁碟 I/O 子系統並未以最佳的方式應付 I/O 需要。