oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?
從Oracle8i開始,Oracle引入了特殊的觸發器,這些觸發器并不是和特殊的DML事件相關聯的(DML事件,如,INSERT,UPDATE和DELETE)。這些系統級別的觸發器包括數據庫啟動觸發器,DDL觸發器和最終用戶登陸/注銷觸發器。
當Oracle提供了這些新的觸發器的功能后,卻還不清楚該如何使用這些觸發器來追蹤系統的使用情況。這篇文章描述了我是如何使用創建終端用戶登陸/注銷的方法來追蹤終端用戶的活動的。剛開始實行的追蹤終端用戶系統級觸發器是非常新的,就因為它非常的新,所以它在功能上還是不夠完善。
雖然用戶登陸/注銷觸發器會告訴你用戶登陸和用戶注銷的準確時間,可是代碼卻無法獲取在用戶會話階段所進行活動的任何信息。 這些用戶的登陸/注銷觸發器對于使用時間戳用戶的應用程序而言是非常有用的。所謂的時間戳用戶,就是那些在訪問應用程序的時候被給定一個唯一的Oracle用戶ID的人。
不使用時間戳Oracle用戶ID的應用程序使用這些登陸/注銷觸發器可能沒有什么用。 既然我們知道了基本的知識,那么,讓我們看看該如何設計用戶審計表來追蹤用戶的活動。 設計一個用戶審計表 第一步就是創建一個用于存儲終端用戶登陸/注銷觸發器信息的Oracle表。
為了合理地設計這些觸發器,讓我們先來看看系統級的觸發器。首先,我們在登陸的時候就會獲取以下信息: 用戶 ID—用戶的ID ,用于執行登陸操作; 會話 ID—Oracle為用戶控制會話的ID; 主機—計算機的名稱; 登陸時間—一個用戶登陸時間一樣的Oracle時間數據類型,精確到0。
001秒。 現在,我們將獲得僅僅優先于用戶注銷的信息。當用戶在注銷的時候,Oracle系統級觸發器就可以提供這個用戶當前的會話狀態和活動信息: 最后的程序—用戶在注銷時執行的最后一個程序的名稱。 最后的活動—用戶在會話種執行的最后一個活動。 最后的模塊—用戶在注銷前訪問的最后一個模塊的名稱。
注銷時間—一個和用戶實際注銷時間一樣的一個Oracle時間數據類型,精確到0。001秒。 現在,我們知道了登陸和注銷的信息,那么我們如何搜集這些信息,并管理它們呢?讓我們來看看可用的選擇。 用戶表的標準化 因為用戶的登陸/注銷觸發器是兩個分離的實體,所以我們在設計支持存放這些信息的表的時候就可以有多種選擇。
我們可以設計兩個隔離的表格:一個用戶登陸表和一個用戶注銷表。如果我們這樣做了,那么在把這兩個表連接起來的時候和判斷哪個用戶的登陸引起了哪個用戶的注銷等等事情的時候就會有困難。這個投機取巧的方法可能會給錯誤的產生制造機會。諸如,用戶24在登陸前是如何注銷的?等等。
現在,讓我們考慮一個更好的選擇。為了很好的使用表的信息,我們可以創建一個數據庫,它里面包含一個單一的表,用于記錄登陸和注銷時間信息。這個方法就省去了連接表和關聯數據的麻煩。另外,我們還將創建一個區域,用于計算每個用戶在特定會話中所用去的時間。
這個計算預先由觸發器做好,這樣就可以節省時間,并且可以創建一個豐富的報表,這個我們后面會提到。 設計一個登陸觸發器 一旦表格設計好了以后,接下來的步驟就是創建一個系統級的登陸觸發器,它可以在發生登陸時間的時候記錄盡可能多的信息。我創建的登陸審計觸發器。
正像你看到的一樣,我在這個表中創建了一些在登陸時可以使用到的信息值: 用戶—建立Oracle會話的Oracle用戶ID 會話ID—使用Oracle的SYS context功能從v$session 表中直接獲取Oracle的會話ID。主機—使用Oracle的SYS context功能,在Oracle會話被創建的時候獲取主機名。
請注意,對于使用Oracle并行服務器或者實際應用群的時候,獲取主機名是非常重要的,因為我們可能同時和許多不同的遠程主機都有會話連接。 登陸時間—獲取實際工作登陸的時間,精確到0。001秒。請注意我們是如何把登陸時間劃分成兩個區域的。產生一個登陸日期和一個登陸時間可以給最后的報表帶來很強的可讀性。
既然登陸觸發器已經創建好了,我們就需要創建一個注銷觸發器來獲取用戶完成會話的所有信息。
全部
總結
以上是生活随笔為你收集整理的oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 一行输出八个数字_R语言笔记(三
- 下一篇: junit跳过datasource_ma