發表文章

目前顯示的是有「microsoft」標籤的文章

PHP的query timeout對於lock中的tbale是否有效

之前有介紹過 如何設定 sybase 的 lock timeout ,將FreeTDS更新到0.91後,順便測試當資料庫發生鎖定時,query timeout是否能夠強制程式中斷,程式不會因此卡住?依舊同時測試MS SQL、及Sybase。 測試的假設狀況為…刻意將測試用table產生lock,同時以php程式去查詢已經被lock的table,該主機上使用FreeTDS 0.91,並且設定了query timeout為五秒(請參考 php存取mssql、sybase時,如何設定query timeout )。 測試的結果…FreeTDS果然對於這兩家資料庫的處理不同… MS SQL:查詢超過五秒後,查詢被中斷,控制權回到程式(不需設定lock timeout) Sybase:查詢超過五秒後,程式依舊卡住。(除非將lock的table解除lock,或設定lock timeout。控制權才會回到程式) 當然, FreeTDS 對於MS SQL的處理行為,是比較符合預期的… 在測試過程中,無意間發現一個現象…

php存取mssql、sybase時,如何設定query timeout

以前在整理 php.ini 、及 freetds.conf 的設定時,注意到兩者都有支援(query)timeout、及connect timeout,當時也作了設定。但最近的一些狀況,讓我好奇(query)timeout設定是否真的有發揮效果? 由於 FreeTDS 可以支援MS SQL、Sybase(FreeTDS is a set of libraries for Unix and Linux that allows your programs to natively talk to Microsoft SQL Server and Sybase databases.),所以就一併測試這兩種資料庫。首先,看一下相關設定的說明,php.ini 中對於MS SQL、Sybase的設定、及freetds的設定,分別如下… MS SQL Server configuration options ,提到mssql.timeout、mssql.connect_timeout這兩個參數 Sybase configuration options ,提到sybct.login_timeout、sybct.timeout這兩個參數 freetds.conf ,則提到(query)timeout、及connect timeout這兩個參數 測試的結果,無論是MS SQL、Sybase的timeout居然都沒效果。 難道又是文件和實際不符合嘛?找了些資料,看到 Bug #34647 mssql.timeout has no affect 中的討論、說明後,去挖出freetds change log,終於有點眉目。原來是因為我所使用的FreeTDS版本太舊,timeout機制在FreeTDS v8.2( freetds v0.82 change log )才開始支援。

CodeIgniter的Connecting to Multiple Databases,是否會造成大量連線數?

最近有人問了一個關於 CodeIgniter 的資料庫連線問題。問題是,當一個controller執行時,可能呼叫多的model。如果這些model在開資料庫連線時,全都採用"Connecting to Multiple Databases"的方式,豈不是一個網頁就會產生多個資料庫連線? CI採用singleton pattern。但"Connecting to Multiple Databases"的模式,卻是return instance。所以,這個疑問是有可能發生的。於是測試了一下… 做了一個小實驗。寫一個controller,他會呼叫三個不同的model。這三個model都採用"Connecting to Multiple Databases"方式,都連到同一台資料庫。如此,該資料庫上是不是就會有三個連線? 用var_dump()看每個連線,果然每個連線的resoure id都不同(共三個)。但直接在資料庫上看連線數,卻只有一個。這樣的結果蠻奇怪的。想了一下,原來是和php開啟資料庫處理方式有關。 我這次測試,使用兩種資料庫-Sybase、MSSql。兩者的狀況分別如下…

在trigger中利用@@rowcount

最近在對於系統作些調整、修改。其間,為了資料的一致性,最後還是決定採用觸發(trigger) 。為了照顧好資料庫(的效能),於是在思考如何減少trigger內不必要的語法執行(也就是沒資料被異動時,就算trigge被呼叫起來也不需要作任何動作) 翻了一下手上的工具書- Inside Microsoft SQL Server 2005:T-SQL PROGRAMMING 中文版 。在這本書(個人覺得這本書非常充實,欲瞭解MS SQL 2005、新功能、調教資料庫與進階應用等,建議可以看看本書)中提到一個作法,利用@@rowcount來協助判斷。 也就是在trigger一開始,就直接利用@@rowcount來判斷使否有資料被異動(以我的案例,我是要針對是否有資料真的被刪除,才去作一些處理)。有資料被異動,也就是@@rowcount傳回大於0的值,方才執行後續的SQL語法。否則就直接跳出,避免多作任何SQL語法,造成無用的資源浪費。 不過,一開始嘗試時卻是失敗的… 後來才注意到,因為我是利用SQL 2005 Studio 產生的trigger範例語法,因此他內建會放入SET NOCOUNT ON; ,這會導致@@rowcount不傳回值。 可是,在 MS SQL官方文件 中明明提及 - 即使 SET NOCOUNT 是 ON,也會更新 @@ROWCOUNT 函數。但…trigger中使用@@rowcount,就是會被影響! 以下,就是最基本的處理範例 CREATE TRIGGER [dbo].[tri_test] ON [dbo].[table_test] AFTER DELETE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. --SET NOCOUNT ON; --以上三行語法為 SQL 2005 內建會產生的 IF @@rowcount=0 BEGIN --直接離開 RETURN ; END ELSE BEGIN ...

PowerShell大量建立AD帳號

最近在Windows 2008上面玩AD(Active Directory),當相關設定完成後,就遇到一個問題-如何快速建立大量的帳號?雖然在 Windows Server 2008 Active Directory目錄服務 這本書中有提到可以使用 PowerShell、vbscript等方式都可以做。但有鑑於Windows 2008已經有內建PowerShell,以及他的彈性比較高,所以決定使用 PowerShell 加上 excel(帳戶資料)的模式來產生大量的AD帳號! 在此之前從未接觸過Windows 2008,一時間居然不知如何執行PowerShell!查了很久才知道所謂『Windows 2008內建PowerShell』,並非如我所想像的內建就已經安裝,還是要自己去勾選安裝。總之,將遇到的一些狀況記錄下來… 如何在Windows 2008內使用PowerShell 如何用PowerShell加上 excel(帳戶資料)建立帳號 如何看AD帳戶的屬性名稱 如何在Windows 2008內使用PowerShell 開啟系統管理工具,開啟伺服器管理員(Server Manager)、選擇新增功能(Add a Feature),將PowerShell 打勾,就可以安裝了 如何用PowerShell加上 excel(帳戶資料)建立帳號 基本的操作方式,可以參考 Windows PowerShell自動化目錄管理 這篇文章。裡面有介紹如何使用 Quest Software 結合Import-CSV方式快速建立資料。這個範例,雖然簡單短短一行就解決了。但是,裡面的範例實在『太基本』,在實用上還需要做些調整。 一個AD帳號,絕對不會只設定如範例中設定那麼少的屬性。以我的需求來講,我需要讓AD上面的帳號,在做第一次登入時,要『強迫更換密碼』!一開始,我是先找出這屬性所對應的屬性英文名稱…花了不少時間嘗試,才確定對應的屬性名稱為 - pwdLastSet,且必須設定為pwdLastSet=0。但很不幸的,怎麼設定都沒作用…(我覺得,應該是這個屬性無法再建立AD帳號時直接設定。但是再建立AD帳號後再去修改,就會生效。這個狀況,是讓我浪費很多時間在確定屬性是否真的為pwdLastSet) 後來無意間找到有文章指出,可以下參數 -UserMustChangePassword ...

用powershell實做wget

在unix-like系統上,有個wget,可以用來抓取遠方主機的檔案(如網頁)下來,然後做後續的處理…在windows除非特別去找軟體來裝,否則沒此工具可用。 最近在玩Flickr的API,需要這樣的功能。加上電腦上都有裝powershell。於是乎,就想利用powershell來模擬wget的處理。 一開始,寫了如下的function來使用… function wget([string]$url, [string]$file){    $client = new-object System.Net.WebClient    $client.DownloadFile($url, $file) } Flickr所回傳的XML是抓下來了。不過,因為他是web service,編碼是採用utf8。因此,抓下來的檔案中如果有中文字,不經轉碼直接拿來處理的話…不幸的,會有問題…… 因此,做如下的處理來轉碼。利用get-content 先將抓回來的檔案轉成utf8後,再去處理。這樣,XML才會正常! $dl_file=[System.IO.Path]::GetTempFileName() wget("http://url", $dl_file) [xml]$list = get-content $dl_file -encoding utf8 不過,玩到後來,因為每次所抓的資料不多,不想將Flickr API所傳回的資料存放在檔案內。想直接在記憶體內處理即可。但…怎麼找,都找不到一個簡單的轉字串編碼的處理方式。 只好還是乖乖K一下 MSDN ,沒想到,其實只要如下的一行設定,問題就輕鬆解決了! function wget([string]$url){    $client = new-object System.Net.WebClient    $client.Encoding = [System.Text.Encoding]::GetEncoding("utf-8")    return $client.DownloadString($url) } 修改後的wget,使用方式如下… $result=wget("http://url"...

TRANSACTION ISOLATION vs LOCK

話說SQL server有支援下列幾種隔離模式 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SNAPSHOT(2005新增) SERIALIZABLE 當中READ COMMITTED為內定所採用的模式。內定採用這樣的模式是好?是壞?見仁見智吧~不過,有時還真的是需要READ UNCOMMITTED模式。所以做個測試,著手把connection的模式修改為READ UNCOMMITTED模式… 在ASP中的作法如下… db.IsolationLevel = adXactReadUncommitted 或者 db.IsolationLevel = 256 修改好後,跑個ASP來測試,卻發結果並非我所想像,依舊因為LOCK問題,導致程式卡在那兒~ (我在 SQL Server Management Studio Express上直接下 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ,結果卻是我所預期--不會受到 lock影響,依舊可以抓到資料) select * from [test_table] 於是,只好到google上找找資料,看看為何設定後卻無效果~說法千奇百怪…結果,還是在 MS官方資料 上看到一句很關鍵的話,照者測試的結果,果真有效… 程式修改如下 db.BeginTrans() select * from [test_table] db.RollBackTrans 不過,這樣感覺有點脫褲子放屁…看來,以後還是直接用下列方式就好了… select * from [test_table] WITH (NOLOCK)

powershell下如何呼叫FTP,並等FTP作業完成

知道有powershell後,K了官方網站上所提供的文件後就來試試看。把原本一個作業改用powershell來處理,我只能說,雖然powershell跟以往比起來算跨了一大步,但是很多東西跟UNIX下來比還是礙手礙腳,當然也許跟我要處理的作業有關吧! 首先,我遇到的問題,就是要利用FTP,去取得遠方的資料回來處理。查了一下,有個要$的可以用,但一想到$還是算了,所以有找看看有無其他用.Net寫的class可以拿來利用。看了看,想想還是呼叫cmd 下的FTP算了… 一旦確定要用cmd呼叫FTP,就開始去做。這點不困難,在原本官方的user guide這文件中就有範例,但實際運作時,卻發現一個重大的問題! 因為在powershell所呼叫的ftp,由於是產生一個cmd的process去執行,所以,程式並不會等這ftp跑完,反而繼續我程式中後續的動作。偏偏我後面的動作會把ftp抓回來的資料搬一到其他地方去作為log之用!結果,就是powershell跑完了,但ftp卻『尚未』把資料抓回來。也就是說,powershell的程式,認為沒資料(因為ftp還沒把資料抓回來),所以就結束運作! :( 這點非常嚴重,找了不少資料,終於在MS的相關網站上找到解決之道…終於可以先確認ftp這段執行完畢後,原程序再繼續執行!下面就是處理方式~ PS: 但是在我測試時,我還是遇到一個詭異的問題(有遇過幾次,但不常見)。因為我在程式一開始運作,會先產生一個暫存的子目錄,等到最後,把該目錄內的資料搬移(Move-item )到LOG的目錄內,最後再把該暫存子目錄砍掉(Remove-Item)。這樣的流程,並無問題,但…就是發生,檔案還沒移走,但後面的砍掉子目錄動作卻已經做了。造成我的log資料不完整。這樣的狀況,就很難理解 function getFtpFile{ $todayfile= $args[0] $todayfile_m= $args[1] $ftphost= "127.0.0.1" $ftpuser= 'user' $ftppass= 'password' Set-Content -path ftp.txt $ftpuser Add-Content -path ftp.txt $ftppass Add-Content -path f...

powershell

圖片
最近再看一篇sql server的管理文章時,注意到他是用一種沒見過的shell - powershell 來設定、管理sql 2005,仔細看後,發覺M$終於想通了,給了一個比較像樣的shell。不然很多工作(如一些批次處理),在以往我可能都採用AP或網頁的方式去處理 !但,每次看到同事們在unix-like的系統下,卻都有好用的shell script,總是挺羨慕的 所以就去下載、安裝來試試看…初步感覺還不錯,應該可以來拿替代原本一些批次處理的程式 附註: power shell下載點 參考文件一 (user guide這份一定要好好看一下,因為該文件中會和unix下的shell做些小比較、說明。蠻詳細的在介紹power shell的一些基礎觀念和作法) 參考文件二 (撰寫時必備的參考文件)