2009年10月19日 星期一

OEM Database Control-設定主機證明資料

當透過OEM Database Control設定備份值等設定時,都會要求輸入「主機證明資料」,如下圖所示:







所謂的主機證明資料就如字面上所解釋,你必須提供Server上登入的帳號密碼,而這帳號可以是網域帳號或者該主機作業系統上建立的帳號;但一開始大家都應該會遇到跟我相同的情況,即便你多努力的敲入正確的帳號密碼,OEM都會告訴你「密碼錯誤」之類的訊息。要解決這個問題,你得必須手動將帳號加入
以批次工作登入」的權限才行:

1. 打開 「控制台 --> 系統管理工具--> 本機安全性原則」
2. 點選左方「本機原則 / 使用者權限指派」,找到右方的「以批次工作登入」,double-click它進行設定
3. 在「本機安全性原則設定」標籤中,按下「新增使用者或群組」按紐,加入欲設定為主機證明資料的網域帳號或者Oracle所在主機的作業系統帳號。
4. 加入完成後,一路按下「確定」關閉剛剛的設定。


















再回到OEM試一次,就可以正確的辨別你輸入的帳號密碼了。

2009年10月11日 星期日

找出 Oracle Compiling Procedure會Hang住的原因

同事剛遇上一個挺有趣的 Oracle procedure Compile問題。當她以pl/sql develpoer 異動完某個procedure並按下F8執行compiling後,pl/sql develper僅僅顯示compiling訊息之外就沒再動靜, 應用程式就直接hang 在那裡,不知道到底出了什麼事情。這件事讓他困擾了一整個早上,最後只好把這個「磨練」的機會給了我。根據過往的經驗,這種情況有點類似A君開發中的時正在Edit Q Table,但剛好屁股痛去了洗手間,也忘了按Commit,而當B君也要去Edit Q Table,異動完成後按下Commit時卻怎樣也寫不進去,硬是hang在那裡。因此我查了一下解法,答案跟我想的差不多,重點只有一個: 找出誰在使用這個procefure,請它關閉或直接踢掉它就好了。

查詢語法如下:

SELECT B.OSUSER, A.*
FROM V$ACCESS A, V$SESSION B
WHERE A.OBJECT = 'MY_PROC'
AND A.SID = B.SID

結果就會告訴你:哪個session正在使用這物件,所以你無法異動該procedure。譬如說:

OSUSER SID OWNER OBJECT TYPE
--------- ---- -------------- ----------- ----------------------
murderer 519 SCHEMA_OWNER MY_PROC PROCEDURE

表示使用者murderer (sessoon id = 519)這個傢伙正在使用My_PROC這個procedure,並且尚未釋放掉。大部分的情況下就是他正在執行testing 動作,但是因為程式迴圈很大或者他也去上廁所,因此呼叫的程序仍在執行中或暫停著,被呼叫的MY_PROC也就因此跟著被咬住了。Oracle此時就會禁止其他使用者異動該procedure,直到那位仁兄上廁所回來並結束那個testing的程序。

就這樣,以後找兇手簡單多了。

2009年10月5日 星期一

SQL 2005 Express安裝後的第一件事

VS2005附贈的SQL 2005 Express的安裝並不是難事,大約10來分鐘希哩呼嚕就可以裝完完畢。但惹人嫌是,工作列你看不到任何常駐的Instance圖示,得打開「控制台/系統管理工具/服務」後才能看到SQL Server(SQLExpress)已經自動執行中。但,當你想要用windows認證登入時,SQL Express會告知你不支援以遠端的方式登入使用。根據以往經驗,"遠端"登入這件事,通訊協定就是關鍵角色。所以解法如下:

1. 打開「SQL Server 2005/組態工具/SQL Services Configuration Manager」;
2. 找到「SQL Server 2005網路組態/SQLExpress的通訊協定」;
3. 找到右邊通訊協定清單中的TCP/IP協定,按右鍵啟用它(下圖)。









4. 重新啟動 SQL Server(SQLExpress)服務

接著你就可以用windows認證的方式登入了。

2009年10月4日 星期日

DatabaseMail的郵件報表功能設定

SQL2005提供郵件通知的服務,並透過profile設定的方式,系統也可發送工作完成後的郵件報表。但很不幸的,從郵件服務設定到產生工作的郵件報表的過程有點類似樂高積木,中間眉眉角角的設定一不小心可能就會漏掉,搞得DBA只好"再度"捲起袖子巡田了。最近遇到的問題是工作完成後無法產生郵件報表,SQL Server給的錯誤訊息如下:

無法產生郵件報表。執行 Transact-SQL 陳述式或批次時發生例外狀況。未設定全域設定檔。請在 @profile_name 參數中指定設定檔名稱。

開始對這訊息是一頭務水,Mail發送測試沒問題,SQL Agent Service也重開過,怎麼還會給這莫名奇妙的訊息?查了一下才知道原來是郵件服務找不到預設的 profile 檔,所以郵件報表的也就沒辦法產生了。解法很簡單:

1. Database Mail按右鍵,點選「設定Database Mail」,會出現Database Mail組態精靈
2. 選擇「管理設定檔安全性」













3. 在「公用設定檔」頁籤下方選擇一個已建立好的Profile,並在「預設設定檔」欄位選擇「是」,這樣就成啦。













說穿了也沒什麼,但沒做這一步郵件報表就是給它看得到吃不到。給大家參看囉。