搜尋本站文章

2008-11-30

無法啟動 SQL Server:當使用 WITH NORECOVERY 選項還原 model 系統資料庫,資料庫狀態呈現:RESTORING 狀態



有朋友遇到以下的狀況:

將系統資料庫 model,將其資料庫狀態,設定為:RESTORING。
使用版本:SQL Server 2005、SQL Server 2008


進一步討論此狀況,可能會遇到的問題:
若是將系統資料庫 model,將其資料庫狀態,設定為:RESTORING。



將可能造成以下的問題:
停止、再重新啟動 SQL Server,但是系統資料庫 model 卻是 RESTORING 狀態,導致無法啟動 SQL Server。


而且在啟動 SQL Server 時,系統將自動重新建立系統資料庫 tempdb,這時也需要參考到系統資料庫 model。

要能成功啟動 SQL Server 執行個體,三個系統資料庫必須已成功還原。
三個系統資料庫是指:master、model、tempdb 資料庫。

系統資料庫 model 是做為範本用,也會用來建立 tempdb 系統資料庫。


如果無法成功地復原 model 資料庫,會 SQL Server 無法建立 tempdb 資料庫,也不會成功啟動 SQL Server 執行個體。


以下是 SQL Server 錯誤記錄檔的節錄內容:

...
2008-11-23 14:42:47.35 spid9s      Starting up database 'model'.
2008-11-23 14:42:47.39 spid9s      The database 'model' is marked RESTORING and is in a state that does not allow recovery to be run.
2008-11-23 14:42:47.40 spid9s      Error: 927, Severity: 14, State: 2.
2008-11-23 14:42:47.40 spid9s      Database 'model' cannot be opened. It is in the middle of a restore.
2008-11-23 14:42:47.42 spid9s      Could not create tempdb. You may not have enough disk space available. Free additional disk space by deleting other files on the tempdb drive and then restart SQL Server. Check for additional errors in the event log that may indicate why the tempdb files could not be initialized.
2008-11-23 14:42:47.42 spid9s      SQL Trace was stopped due to server shutdown. Trace ID = '1'. This is an informational message only; no user action is required.
...


...
2008-12-01 12:18:15.34 spid15s     Starting up database 'model'.
2008-12-01 12:18:15.34 spid7s      Server name is 'SQL2K8'. This is an informational message only. No user action is required.
2008-12-01 12:18:15.35 spid15s     The database 'model' is marked RESTORING and is in a state that does not allow recovery to be run.
2008-12-01 12:18:15.35 spid15s     錯誤: 927,嚴重性: 14,狀態: 2。
2008-12-01 12:18:15.35 spid15s     資料庫 'model' 無法開啟。它目前正在還原當中。
2008-12-01 12:18:15.35 spid15s     Could not create tempdb. You may not have enough disk space available. Free additional disk space by deleting other files on the tempdb drive and then restart SQL Server. Check for additional errors in the event log that may indicate why the tempdb files could not be initialized.
2008-12-01 12:18:15.38 spid17s     錯誤: 9954,嚴重性: 16,狀態: 1。
...


可能的解法:

推想各個資料庫的狀態是寫在系統資料庫 master 內,但是系統資料庫 model 卻是 RESTORING 狀態,導致無法啟動 SQL Server。


目前想到的作法是:
(1)

重建 master 資料庫。再執行復原(Restore) master作業。


請參考以下的文件:
重建 master 資料庫的考量
http://msdn.microsoft.com/zh-tw/library/ms191431(SQL.90).aspx

(2)
複製另外一台正常的 SQL Server 之 master 資料庫,覆蓋掉受影響的 SQL Server 之 master 資料庫。再執行復原(Restore) master作業。


或許各方高手有更好作法,可以分享一下,在此先謝謝各位的指教與建議。
以下是將系統資料庫 model,設定為 RESTORING 狀態的範例碼,請在測試環境上執行。

-- 以下是對系統資料庫 model 執行完整備份
USE master
GO
BACKUP DATABASE [model]
TO  DISK = N'C:\model.bak'
GO

-- 以下是對系統資料庫 model 執行交易記錄檔備份
/*
搭配 BACKUP LOG 所使用的參數。

參數:NORECOVERY
它會備份記錄的結尾,資料庫會保留在 RESTORING 狀態。當進行容錯移轉,將工作交給次要資料庫時,或在 RESTORE 作業之前儲存記錄結尾時,NORECOVERY 非常有用。

若要執行略過記錄截斷的最大速率記錄備份,再使資料庫自動進入 RESTORING 狀態,請同時使用 NO_TRUNCATE 和 NORECOVERY 選項。

參數:NO_TRUNCATE
它指定不截斷記錄,且使 Database Engine 不論資料庫狀態為何,都一律嘗試進行備份。因此,利用 NO_TRUNCATE 取得的備份可能會有不完整的中繼資料。在資料庫已損毀的情況下,您可以利用這個選項來進行記錄的備份。
*/
BACKUP LOG [model]
TO  DISK = N'C:\model.bak'
WITH  NO_TRUNCATE, NORECOVERY
GO



後記:

經過數位同好的建議,筆者這邊又在整理出一份可行的方案,請各位參考:
方法: 利用追蹤旗標 3608 來啟動 SQL Server,可防止復原 master 資料庫以外的資料庫。



步驟如下:

1. 在「命令提示列」視窗中,輸入執行以下命令:

-- 如果是預設 (MSSQLSERVER) 執行個體,請執行下列命令:
NET START MSSQLSERVER /T3608 /c
--如果是具名執行個體,請執行下列命令:
NET START MSSQL$instancename /T3608 /c

/*
啟動參數說明:
T3608:追蹤旗標 3608 可防止 SQL Server 復原 master 資料庫以外的資料庫。
-c:縮短從命令提示字元啟動 SQL Server 的啟動時間。
一般而言,SQL Server Database Engine 會呼叫「服務控制管理員」,以服務方式啟動。因為從命令提示字元啟動時,SQL Server Database Engine 不會以服務方式啟動,所以請使用 -c 略過這個步驟。
*/

請參考下圖所示:



2. 在sqlcmd 的「命令提示列」視窗中,輸入執行以下命令:
-- 使用信任連接登入到預設執行個體
sqlcmd -S localhost -E


3. 在利用 sqlcmd 登入到執行個體後,在「命令提示列」視窗中,輸入執行以下命令:
SELECT name, state_desc FROM sys.databases
GO
/*
我們可以觀察到系統資料庫 model,在 master 上所記錄的狀態是:RESTORING 狀態。這是造成系統無法啟動的主因。
系統資料庫 model 是 RESTORING 狀態,導致無法啟動 SQL Server。
而且在啟動 SQL Server 時,系統將自動重新建立系統資料庫 tempdb,這時也需要參考到系統資料庫 model。
*/

請參考下圖所示:



4. 繼續在 sqlcmd 的「命令提示列」視窗中,輸入執行以下命令:
RESTORE DATABASE model WITH RECOVERY
GO
SELECT name, state_desc FROM sys.databases
GO
-- 檢視系統資料庫 model 是否已經回復到 ONLINE 狀態。


請參考下圖所示:





一般而言,如果遇到一些應該修復系統資料庫的問題時,多半會使用「單一使用者模式」的模式來啟動 SQL Server。


但是在本情境下,可能不適合使用以下的兩個參數:

-f:啟動只含最小組態的 SQL Server 執行個體。
如果組態值設定 (如過度調配記憶體) 造成伺服器無法啟動,這就很有用。

有趣的,使用 -f 啟動參數,系統也將會以「單一使用者模式」來啟動。


-m:當您以單一使用者模式啟動 SQL Server 執行個體。
以單一使用者模式啟動 SQL Server 執行個體時,只有單一使用者可以進行連接,且不會啟動 CHECKPOINT 處理序。



CHECKPOINT 會保證將交易規律地從磁碟快取區寫到資料庫裝置。(一般而言,如果遇到一些應該修復系統資料庫的問題時,就會使用這個選項)。


這個選項會啟用 sp_configure allow updates 選項。根據預設,allow updates 是停用的。


上述的這兩個參數,若是執行 RESTORE DATABASE model WITH RECOVERY ,將產生以下的錯誤。

「訊息 3112,當伺服器處於單一使用者模式時,不得還原 master 資料庫以外的任何資料庫。」


請參考下圖所示:




以下是使用啟動參數:-f 來啟動 SQL Server,以下是 SQL Server 錯誤記錄檔的節錄內容:


...
2008-12-01 14:28:21.94 Server      Command Line Startup Parameters:
/f
2008-12-01 14:28:21.94 Server      Warning: The server instance was started using minimal configuration startup option (-f). Starting an instance of SQL Server with minimal configuration places the server in single-user mode automatically.  After the server has been started with minimal configuration, you should change the appropriate server option value or values, stop, and then restart the server.
2008-12-01 14:28:21.94 伺服器         SQL Server is starting at normal priority base (=7). This is an informational message only. No user action is required.
2008-12-01 14:28:21.94 伺服器         Detected 4 CPUs. This is an informational message; no user action is required.
2008-12-01 14:28:21.98 伺服器         Using locked pages for buffer pool.
2008-12-01 14:28:21.99 伺服器         Perfmon counters for resource governor pools and groups failed to initialize and are disabled.
2008-12-01 14:28:21.99 伺服器         Using dynamic lock allocation.  Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node.  This is an informational message only.  No user action is required.
2008-12-01 14:28:22.04 伺服器         Node configuration: node 0: CPU mask: 0x000000000000000f Active CPU mask: 0x000000000000000f. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2008-12-01 14:28:22.05 伺服器         Support for distributed transactions was not enabled for this instance of the Database Engine because it was started using the minimal configuration option. This is an informational message only. No user action is required.
2008-12-01 14:28:22.05 spid7s      Warning ******************
2008-12-01 14:28:22.05 spid7s      SQL Server started in single-user mode. This an informational message only. No user action is required.
2008-12-01 14:28:22.05 spid7s      Starting up database 'master'.
...


最後,感謝各位同好提供的建議,也期許能協助各位解決問題,謝謝大家的幫忙...^_^



參考文件:
BACKUP (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms186865.aspx

如何使用 SQL Server 中的卸離和附加功能將 SQL Server 資料庫移到新位置
http://support.microsoft.com/kb/224071

使用 SQL Server 服務啟動選項
http://technet.microsoft.com/zh-tw/library/ms190737.aspx

使用 WITH NORECOVERY 選項還原 model 資料庫之後,無法成功啟動 SQL Server 的執行個體
http://support.microsoft.com/kb/822852

FIX: SQL Enterprise Manager RESTORE msdb 離開資料庫載入狀態而不適差異或記錄檔備份
http://support.microsoft.com/kb/319701

移動系統資料庫
http://msdn.microsoft.com/zh-tw/library/ms345408.aspx

2008-11-29

新手學SQL Server 2008「稽核(SQL Server Audit)」 (2) :技術文章



以資訊安全為前提,稽核存取資料庫的相關活動,是十分重要的事情,藉由分析稽核資料的內容,將可以協助企業找出安全漏洞與駭客侵入等等事件。

在之前「新手學稽核SQL Server Audit (1)」一文中,各位讀者已經具備「稽核」(SQL Server Audit)的基礎知識與了解其設計方式,接下來,我們將帶領各位按部就班地實作稽核。
...

完整的文章,請參考:
第82期之一《新手學稽核SQL Server Audit (2)》





更多相關的技術文章,請參考:
DB World 資料庫專家電子雜誌

http://www.dbworld.com.tw/




參考資料:
新手學稽核SQL Server Audit (1) :技術文章
http://sharedderrick.blogspot.com/2008/11/sql-server-audit-1.html

2008-11-26

讓 SQL Server Management Studio 的「查詢編輯器」視窗,顯示「行號」



依據預設值,在SQL Server Management Studio的「查詢編輯器」視窗內,是不會顯示行號的,這對於編輯大量的程式碼時,可能會造成小困擾,請參考下圖所示:


參考以下的步驟,將可以在「查詢編輯器」視窗內,顯示各行程式碼的所處的行號。
1. 在「SQL Server Management Studio」的上方選單,選取:「工具」\「選項」。
2. 在「選項」視窗,左邊窗格,展開「文字編輯器」\「所有語言」。
3. 在右邊的窗格,在「顯示」區域下,勾選「行號」。
請參考下圖所示:



4. 點選「確定」。

這是在「查詢編輯器」視窗內,已經有顯示行號,讓你更方便的編輯大量的程式碼。

請參考下圖所示:


述的作法,適用於 SQL Server 2005 與 SQL Server 2008 的 SSMS 管理工具。

2008-11-25

SQL Server 2008 價格



最近有許多朋友在詢問 SQL Server 2008 的價格,雖然 SQL Server 2008 的定價層級與 SQL Server 2005 大致相同,而且這兩個版本的定價也非常接近,但還是有些許差異。
請參考以下的整理:
SQL Server 2008 有三種授權模式:

(1)伺服器暨「裝置」授權Server plus device client access license (CAL).
在執行Microsoft Server 產品的電腦上需要一個Server授權,以及每一個需要連結使用的前端裝置都需要一個連結使用授權 (CAL)。
需要連結進入使用Microsoft SQL Server服務或功能的前端裝置 (例如,電腦、工作站、終端機、PDA、行動電話,等等) 都需要購買裝置授權 (Device CAL)。
如果是多人使用同一裝置 (例如,Call Center),這種Server plus device CAL的授權方式可能是成本效益較好的一種授權方式。

(2)伺服器暨「使用者」授權Server plus user client access license (CAL).
在執行Microsoft Server 產品的電腦上需要一個Server授權,以及每一個需要連結使用的使用者都需要一個連結使用授權 (CAL)。
需要連結進入使用Microsoft SQL Server服務或功能的使用者(例如,員工、客戶、合作夥伴,等等) 都需要購買使用者授權 (User CAL)。
如果是使用者有多種使用裝置,這種Server plus user CAL 的授權方式可能是成本效益較好的一種授權方式。


(3)處理器授權Processor license.
在執行SQL Server的操作系統中,每一顆CPU需要一個單一授權 (Processor license)。在這種授權模式包含了無數量限制的前端裝置授權。
它包含了防火牆內外無數量限制的使用者或裝置使用權利。
當客戶使用這種處理器授權時,是不需要額外購買伺服器授權或是前端使用授權 (CALs)。

何謂 CAL
一個CAL並不是一個軟體:它是一個法律上的文件,授予裝置或使用者進入使用伺服器軟體的權利。一個單一的裝置CAL授予一個裝置進入多個伺服器的權利 (CAL必須是與Server相同版本)。一個單一的使用者CAL授予一個使用者進入多個伺服器的權利。

下表提供美國與加拿大地區銷售之 SQL Server 2008 版本預計零售價指南:
http://www.microsoft.com/taiwan/sql2008/howtobuy/pricing.aspx



還有一種軟體授權方案:「軟體保證 (SA)」
軟體保證 (SA) 提供協助與估價以協助您保持伺服器順利運作,同時讓您更容易掌控預算。

在軟體保證 (SA) 之下,您首先必須購買一份授權,並於每年支付部分費用,就可以在合約期間內享有各種優惠,包括:可免費地升級到最新版本的產品。軟體保證的有效期間將視您的大量授權合約條款而有所不同。軟體保證非強制性購買。

以下是 2008 年08月 1 日,以「FPP (彩盒包裝) 」版本,SQL Server 2008 建議售價是:
請參考下圖所示:




多核心 CPU
多核心處理器,由多個處理執行單元或晶片上的「核心」組成,被視為促進運算能力的方法。
Microsoft 藉由收取與處理器數量相同的費用,而不管處理器內有多少核心的方式,已成為此領域的領導者。請參考以下的文章:
多核心 CPU 與 使用 SQL Server 版本(Multicore CPUs ; Standard Edition)
http://sharedderrick.blogspot.com/2007/12/cpu-sql-server-multicore-cpus-standard.html
多核心 MultiCore CPU 與 Oracle 之授權
http://sharedderrick.blogspot.com/search/label/%E7%94%B2%E9%AA%A8%E6%96%87%20Oracle

目前在產品價格,可以分成:OPEN Value、FPP (彩盒包裝)、FPP AE (彩盒包裝教育版)、MOLP (授權合約產品)、MOLP AE (授權合約產品教育版)等等方式。
建議各位要連回到官方網頁,查詢最新的特價訊息、全新的估計零售價格表 (ERP; Estimated Retails Price) :

台灣微軟全系列產品價格表
http://www.microsoft.com/taiwan/partner/download/default.mspx

https://partner.microsoft.com/taiwan/productssolutions/launchresources/prodresourcespricelist

建議各位可以與台灣微軟授權代理商聯繫,相信可以獲得更多的優惠:
http://www.microsoft.com/taiwan/partner/franchisee.aspx

參考文件:
SQL Server 2005 產品價格之列表 listprice ,retailprice
http://sharedderrick.blogspot.com/2007/12/sql-server-2005-listprice-retailprice.html

SQL Server 2008 授權
http://www.microsoft.com/taiwan/sql2008/howtobuy/licensing.aspx

SQL Server 2008 授權常見問題
http://www.microsoft.com/taiwan/sql2008/howtobuy/licensing-faq.aspx

SQL Server 2008 售價
http://www.microsoft.com/taiwan/sql2008/howtobuy/pricing.aspx

下表提供美國與加拿大地區銷售之 SQL Server 2008 版本預計零售價指南:
http://www.microsoft.com/taiwan/sql2008/howtobuy/pricing.aspx

多核心 CPU 與 使用 SQL Server 版本(Multicore CPUs ; Standard Edition)
http://sharedderrick.blogspot.com/2007/12/cpu-sql-server-multicore-cpus-standard.html

多核心 MultiCore CPU 與 Oracle 之授權
http://sharedderrick.blogspot.com/search/label/%E7%94%B2%E9%AA%A8%E6%96%87%20Oracle

台灣微軟全系列產品價格表
http://www.microsoft.com/taiwan/partner/download/default.mspx

https://partner.microsoft.com/taiwan/productssolutions/launchresources/prodresourcespricelist

2008-11-22

新手學SQL Server 2008「稽核(SQL Server Audit)」 (1) :技術文章


日益險惡的資訊安全環境,讓企業不得不正視「安全稽核」。若是發生安全漏洞、資訊外洩事件時,稽核記錄將會是十分有用的資料。
SQL Server 2008 導入一套全新的稽核系統:SQL Server Audit,讓管理人員可以精確的紀錄所需要之稽核資訊...

完整的文章,請參考:
第81期之四《新手學稽核SQL Server Audit (1)》






更多相關的技術文章,請參考:
DB World 資料庫專家電子雜誌
http://www.dbworld.com.tw/

2008-11-19

加速啟動 SQL Server Management Studio(SSMS)


當我們在執行 SSMS 時,不知你是否覺得啟動 SSMS 很慢呢?
而且若是透過:「遠端桌面連線」、「VNC」等等軟體來登入系統,應該是可以更明顯的感受到啟動 SSMS 的速度真的很慢。亦或是如同筆者一般是 SQL Server 的重度使用者時,那更會懷念前一版本的 Enterprise Manager 工具快速啟動執行的速度。

建議妳可以參考以下的方式來加速啟動 SSMS 管理工具,方法如下:
在工具列上,按一下 「開始」,依序指向 「所有程式」\「Microsoft SQL Server 2008」,在「SQL Server Management Studio」上滑鼠右鍵,選擇「內容」,修改其「目標」的執行捷徑之內容,在最後面,先按一個空白鍵再加入「-nosplash」引數就可以,請參考下圖所示:



以下此參數的說明:
-nosplash
是加速啟動 SSMS 的關鍵引數。當您使用了「-nosplash」引數後,在啟動 SSMS 時,將不呈現開頭顯示畫面。這適用於:不需要開頭顯示畫面的重度使用者;在頻寬有限的網路環境、利用[遠端桌面連線]、[VNC]等軟體來連接執行的SQL Server 伺服器的環境。這個引數不區分大小寫,可出現在其他引數的前後。


這個參數,適用於 SQL Server 2005 與 SQL Server 2008 的 SSMS 管理工具。

以下是被取消的開頭顯示畫面,請參考下圖所示:

2008-11-15

清空「伺服器名稱對話方塊的伺服器清單」 -- SQL Server 2008 SSMS Clean MRU Server List


在使用過 SQL Server Management Studio 2008 管理工具(本文縮寫為:SSMS 2008)一陣子之後,您的 SSMS 2008 的[伺服器名稱]對話方塊的伺服器清單,可能會如同筆者一般,存放一堆最進這幾次所使用的伺服器清單,請參考下圖所示:



但這有可能是已經失效的、無用的,或是您不想讓別人知道這清單列表時,我們可以使用改名或是刪除的方式來進行清空[伺服器名稱]對話方塊的伺服器清單。

-- 伺服器清單是存放在以下檔案內:
%APPDATA%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin
-- 在 Windows Server 2008 或是 Vista 作業系統,路徑是:
C:\Users\{%您的登入帳號%}\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin
-- 以使用者 Administrator為例:
C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin


當您完成改名或是刪除 SqlStudio.bin 檔案後,請關閉 SSMS 2008,再重新啟動 SSMS 2008,就可以看到空白被清空的[伺服器名稱]對話方塊之伺服器清單,請參考下圖所示:



什麼是 SqlStudio.bin 檔案
在 SSMS 2008 「伺服器名稱」對話方塊上的清單,係由 MRU(Most Recently Used)檔案所記錄,會自動記錄最近數次成功登入的伺服器清單。這是一個很方便的功能,但為了提供更佳的安全性,或者這是無效的伺服器清單,您就可以將 SqlStudio.bin 檔案改名或是刪除。

但是在「SQL Server Management Studio 2005 管理工具」與「SQL Server Management Studio 2008 管理工具」卻是存放在不同的檔案內,請參考以下的整理:
「SQL Server Management Studio 2008 管理工具」,存放於 SqlStudio.bin 檔案內。
「SQL Server Management Studio 2005 管理工具」,存放於 mru.dat 檔案內。


參考資料:
清空[伺服器名稱]對話方塊的伺服器清單 -- SQL Server Management Studio 2005 管理工具
http://sharedderrick.blogspot.com/2007/12/sql-server-2005-ssms.html

當您在 SQL Server 2005 中啟動 SQL Server Management Studio 時,出現錯誤訊息: Unable to 型別 'Microsoft.SqlServer.Management.UI.ConnectionDlg.Personalization ' 為型別 ' Microsoft.SqlServer.Management.UI.ConnectionDlg.Personalization' 的型別轉換物件)
http://support.microsoft.com/kb/922214/zh-tw



Clear SQL Server 2008 Management Studio - MRU Server Names
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=4085623&SiteID=17

2008-11-12

趣聞:程式設計師(programmers)、工程師(engineer)經常講的話



這是在網路上看到的趣聞:程式設計師(programmers)或是工程師(engineer)經常講的話,挺有趣的。

程式設計師(programmers)經常講的話:


第 20 名:這很奇怪喔。
第 19 名:以前從來不會這樣啊!
第 18 名:昨天明明會動的啊!
第 17 名:怎麼可能~
第 16 名:這一定是機器的問題。
第 15 名:你到底是打了什麼才讓程式當掉的?
第 14 名:一定是你的資料有問題。
第 13 名:我已經好幾個禮拜沒碰那一段程式了。
第 12 名:你一定是用到舊版了。
第 11 名:一定是巧合!為什麼這種壞運氣只讓你碰上。
第 10 名:我不可能什麼功能都測試到吧,有 bug 是正常的!
第 9 名:這個不可能是那個的原始碼!
第 8 名:這程式應該是會動的,只是我寫好後還沒做測試。
第 7 名:可惡!一定有人改了我的程式。
第 6 名:你有檢查過你的電腦有沒有病毒嗎?
第 5 名:儘管這功能還不能動啦,你覺得他如何?
第 4 名:在你的系統不能用那一個版本的程式啦!
第 3 名:你幹嘛要那樣操作,都是你的問題。
第 2 名:程式發生問題時你在哪裡?
第 1 名:在我的機器明明就可以動啊!


通用說法
你是不是又裝什麼了軟體?環境太髒,要重灌作業系統。
你電腦重新開機,應該就會好了。



工程師(engineer)經常講的話:



第 26 名:都這樣了,還不work,搞什麼?
第 25 名:你可能中毒了喔。
第 24 名:一定是有人改了我的程式。
第 23 名:已經可以了,不過還沒測試過喔。
第 22 名:都好了啊,還沒測試過就是了。
第 21 名:我不是已經修好了嗎?
第 20 名:這個不能那個。(THIS can't do THAT.)
第 19 名:我一個人又測不完!
第 18 名:怎麼這麼衰!
第 17 名:沒問題,馬上好!
第 16 名:當然,當然,我再修一修就可以了。
第 15 名:快好了,快好了。
第 14 名:好啦,只不過一個小功能嘛!
第 13 名:你拿錯執行檔了。
第 12 名:可以,可以,來得及。
第 11 名:我可沒動過這個模組喔!
第 10 名:你的測試資料一定有錯!(我那邊不會啊!)
第 9 名:不可以這樣操作的啦!
第 8 名:你的作業系統(驅動程式)升級了沒有啊?
第 7 名:機器好像壞了。
第 6 名:怎麼可能?!
第 5 名:哦,這程式還要改一下。
第 4 名:昨天還好好的呀!
第 3 名:我從來不知道有這種事。
第 2 名:奇怪...
第 1 名:更,MD --> 這應該是心理的話,Haha...


未婚工程師在心理常說的話:
為什麼我都沒有女朋友阿!!

參考網址:
The Top 20 replies by programmers when their programs do not work:
http://www.thenetworkadministrator.com/top20.htm


Funny replies developers give to testers..
http://quality-assurance-software-testing.blogspot.com/2005/12/funny-replies-developers-give-to.html

趣聞:三寶:lag、當機、修不好


這是在網路上(出處已經不可考)看到的趣聞:描述客戶對於資訊系統的不滿,常見於像是:早期的線上遊戲,網路分享資源等等。

但有趣的是:將這三寶「lag、當機、修不好」,這段關鍵語,置換為客戶對於現行任何資訊系統的不滿…似乎都可行...Haha。

這應該是原版
東北有三寶:人蔘.貂皮.烏拉草

相關參考用法:
中秋有三寶:
烤肉、烙郎、放鞭炮 --> 烤肉好像有點違背節能省碳的想法。

charming吸引人的研討會有三寶:
點心、正妹、送贈品

2008-11-06

初探 pwdencrypt 與 pwdcompare 函數



SQL Server 7 與 2000 版本,有提供 2 個特殊的 undocumented functions:

1. pwdencrypt : 用於單向加密,但不提解密的功能。
2. pwdcompare : 用於比較已加密的資料與未加密的資料之值是否相同。


雖然經過測試,可以應用在 SQL Server 2005 與 SQL Server 2008 上。
但是您要留意這類 undocumented functions 未來可能隨時被取消刪除、也無法確認是否能相容於新版本的 SQL Server。


使用 pwdencrypt 與 pwdcompare 函數的範例碼如下:

-- 建立範例資料表
USE tempdb
GO
CREATE TABLE tbpwd
(eid varchar(50), epwd varbinary(8000))
GO

-- 使用 pwdencrypt 進行資料加密。
/*
語法如下:
pwdencrypt(加密的資料)
*/
-- 使用 pwdencrypt() 函數,回傳已經編碼過的資料
SELECT pwdencrypt('123')

-- 新增資料列,使用 pwdencrypt 進行資料加密。
INSERT tbpwd
VALUES ('A001',pwdencrypt('myPass789'))
GO

-- 直接查詢資料表的內容,資料已經被加密,模糊化。
SELECT eid N'工號', epwd N'密碼'
FROM tbpwd


請參考下圖所示,被加密過的資料:


接下使用 pwdcompare 函數,與被加密的資料進行比對

/*
使用 pwdcompare 函數,與被加密的資料進行比對,若是相同者,將回傳 1,否則回傳 0 。

語法如下:
pwdcompare(密碼,資料行)
*/
-- 輸入正確的密碼,回傳:1
SELECT pwdcompare('myPass789',epwd)
FROM tbpwd

-- 輸入正確的密碼,但是大小寫不正確,一樣可以正確比對,回傳:1
SELECT pwdcompare('mypass123',epwd)
FROM tbpwd

-- 密碼打錯,回傳:0
SELECT pwdcompare('myPass123',epwd)
FROM tbpwd




其實,登入帳戶的密碼也是可以利用 pwdcompare 函數來進行處理,利用 pwdcompare 可以用來比對您的密碼是否太薄弱,輕輕鬆鬆被解,例如:

1. 帳戶與密碼名稱是否相同。
2. 帳戶的密碼是空白的。
3. 帳戶的密碼是 1 個字元。

以下是修改微軟教材 2787A Designing Security for Microsoft® SQL Server™ 2005 內所提供的範例程式:

-- 建立預存程序
USE master
GO
IF OBJECT_ID('dbo.my_AuditPasswords') IS NOT NULL
DROP PROCEDURE dbo.my_AuditPasswords
GO
CREATE PROCEDURE dbo.my_AuditPasswords
AS
SET NOCOUNT ON
DECLARE @lngCounter int
DECLARE @lngCounter1 int
DECLARE @lngLogCount int
DECLARE @strName VARCHAR(256)

--Create table to hold SQL logins
CREATE TABLE #tLogins
(numID INTEGER IDENTITY(1,1) ,strLogin VARCHAR(255) NULL ,
lngPass INTEGER NULL, strNullPass CHAR(1) NULL)

--Insert non ntuser into temp table
INSERT INTO #tLogins (strLogin)

SELECT name FROM master.sys.sql_logins

SET @lngLogCount = @@ROWCOUNT

-- 判斷密碼是 NULL
SET @lngCounter = @lngLogCount

WHILE @lngCounter <> 0
BEGIN
SET @strName = (SELECT strLogin FROM #tLogins WHERE numID = @lngCounter)

UPDATE #tLogins
SET lngPass = (SELECT PWDCOMPARE ('',(SELECT password_hash FROM master.sys.sql_logins WHERE name = @strName))),strNullPass = 'N'
WHERE numID = @lngCounter

SET @lngCounter = @lngCounter - 1
END

SELECT strLogin AS N'Login Name(密碼空白)'
FROM #tLogins WHERE strNullPass = 'N' AND lngPass = 1

-- 判斷密碼與登入帳戶是否一樣
SET @lngCounter = @lngLogCount

WHILE @lngCounter <> 0
BEGIN
SET @strName = (SELECT strLogin FROM #tLogins WHERE numID = @lngCounter)

UPDATE #tLogins
SET lngPass = (SELECT PWDCOMPARE (@strName,(SELECT password_hash FROM master.sys.sql_logins WHERE name = @strName))),strNullPass = 'S'
WHERE numID = @lngCounter
AND lngPass <> 1

SET @lngCounter = @lngCounter - 1
END

SELECT strLogin AS N'Login Name(密碼與登入帳戶一模一樣)'
FROM #tLogins WHERE strNullPass = 'S' AND lngPass = 1

--Reset column for next password text
update #tLogins set lngPass =0

-- 判斷密碼僅有一個字元
SET @lngCounter = @lngLogCount

WHILE @lngCounter <> 0
BEGIN
SET @lngCounter1 = 1
SET @strName = (SELECT strLogin FROM #tLogins WHERE numID = @lngCounter)

WHILE @lngCounter1 < lngpass =" (SELECT" name =" @strName)))" numid =" @lngCounter"> 1

SET @lngCounter1 = @lngCounter1 + 1
END

SET @lngCounter = @lngCounter - 1
END

SELECT strLogin AS N'Login Name(密碼僅有一個字元)'
FROM #tLogins WHERE lngPass = 1
GO



以下是建立數個登入帳戶,來進行測試

-- 以下是建立數個登入帳戶,來進行測試
USE [master]
GO
-- 建立帳戶 S1,密碼空白
CREATE LOGIN [S1] WITH PASSWORD=N'',
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

-- 建立帳戶 S2,密碼與帳戶名稱一樣,也是 S2。
CREATE LOGIN [S2] WITH PASSWORD=N'S2',
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

-- 建立帳戶 S3,密碼才一個字元
CREATE LOGIN [S3] WITH PASSWORD=N'z',
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO


執行此預存程序,進行測試,將可以抓有密碼過於薄弱的登入帳戶


-- 執行此預存程序,進行測試,將可以抓有密碼過於薄弱的登入帳戶
EXEC my_AuditPasswords
GO


請參考下圖所示:


雖然經過測試,可以應用在 SQL Server 2005 與 SQL Server 2008 上。 但是您要留意這類 undocumented functions 未來可能隨時被取消刪除、也無法確認是否能相容於新版本的 SQL Server。


參考資料:
Course 2787: Designing Security for Microsoft SQL Server 2005
http://www.microsoft.com/learning/en/us/syllabi/2787afinal.mspx

pwdencrypt and pwdcompare
http://msmvps.com/blogs/gladchenko/archive/2005/04/06/41083.aspx

SQL Server undocumented password hashing builtins: pwdcompare and pwdencrypt
Laurentiu Cristofor's blog @microsoft.com
http://blogs.msdn.com/lcris/archive/2007/10/31/sql-server-undocumented-password-hashing-builtins-pwdcompare-and-pwdencrypt.aspx

All About Passwords
http://www.enterpriseitplanet.com/security/features/article.php/1582981

2008-11-05

研討會:使用資料表值參數(Table Valued Parameters)



此課程採取 Virtual Labs 方式來進行,介紹主題:資料表值參數(Table-Valued Parameters)
日期與時間: 11/05 台北 ~ 14:00~15:00


請參考下圖所示:






資料表值參數是 SQL Server 2008 中的新參數類型。資料表值參數是使用使用者定義的資料表類型所宣告。您可以使用資料表值參數,將多個資料列傳送到 Transact-SQL 陳述式或常式 (如預存程序或函數),而不需要建立暫存資料表或許多參數。

資料表值參數就像是 OLE DB 和 ODBC 中的參數陣列,但是提供了更多的彈性,而且與 Transact-SQL 更緊密整合在一起。資料表值參數也會因為能夠參與以集合為基礎的作業而獲益。

Transact-SQL 會以傳址方式將資料表值參數傳遞給常式,以免產生輸入資料的複本。

您可以使用資料表值參數來建立及執行 Transact-SQL 常式,然後從 Transact-SQL 程式碼 (任何 Managed 語言中的 Managed 和原生用戶端) 呼叫這些常式。

相關的參考資料如下:

「課程網址」:
https://www506.livemeeting.com/cc/wwe_uk/present?id=1032392922&pw=85445A02&recording_agreement=accepted&formSubmitted=true


MSDN Virtual Lab: Using Table Valued Parameters in SQL Server 2008
https://msevents.microsoft.com/cui/webcasteventdetails.aspx?eventid=1032370900&eventcategory=3&culture=en-us&countrycode=us