.NET Thai Developers | MCTS: SQL Server 2005 | MCSD: Microsoft.NET | MCAD: Microsoft.NET | MCPS: Microsoft Certified Professional
Monday, June 25, 2007
เขียนโปรแกรมสั่งให้ Shutdown วินโดว์
โดยปกติในระบบปฏิบัติการวินโดว์มี command-line สำหรับการสั่งให้เครื่อง shutdown คือ
>>shutdown
ผมจึงปิ้งไอเดียขึ้นมาทันทีครับ ก็สั่ง command-line ว่า shutdown ในโค้ดของโปรแกรม เมื่อทำงานเสร็จแล้วก็ได้นิครับ
Sub FunctionX()
...
Shell "shutdown -s -f"
End Sub
แค่นี้โปรแกรมนี้ก็จะสั่งให้วินโดว์ Shutdown ตัวเองแล้วล่ะครับ สำหรับ -s คือ Shutdown, -f คือการบังคับให้ shutdown แม้ว่ามีโปรแกรมใดเปิดค้างไว้ก็ตาม
ทั้งนี้ใน VB.NET ก็สามารถใช้คำสั่ง Shell นี้ได้ด้วยนะครับ
Friday, June 22, 2007
Refactor!™ for Visual Basic® .NET 2005
ลองเข้าไปดูที่นี่ครับ
http://www.devexpress.com/Products/NET/IDETools/VBRefactor/
เป็น tools สำหรับการทำ refactor บน VB.NET ครับ พัฒนาโดย Devexpress ครับ
มีความสามารถในการทำ refactor ที่ดี เช่น
- Create Overload
- Extract Interface
- Extract Method
- Extract Property
- Encapsulate Field
- Remove Parameter
- Reorder Parameters
- Rename
- ฯลฯ
Tuesday, June 19, 2007
E-learning Windows Vista and the .NET 3.0
- Clinic 5135 AE: Introduction to Developing with Windows Presentation Foundation and Visual Studio 2005
- Clinic 5136 AE: Introduction to Developing with Windows Workflow Foundation and Visual Studio 2005
- Clinic 5137 AE: Introduction to Developing with Windows Communication Foundation and Visual Studio 2005
สามารถดูรายละเีอียดได้ที่ http://www.microsoft.com/learning/windowsvista/dev/default.mspx
Client Callbacks without Postbacks in ASP.NET ตอนที่ 2
การสร้างเพจ Callbacks without Postbacks
ผมแสดงตัวอย่างเป็นขั้นตอน ดังนี้
1. ก่อนอื่นให้สร้างเพจ aspx ตามรูป
- TextBox1 เป็นตัวรับข้อความ
- TextBox2 เป็นตัวแสดงข้อความ
- Button เป็น HTML control (ไม่มี runat="server") เป็นตัวเรียกฟังก์ชัน Callback
Partial Class _Default
Inherits System.Web.UI.Page
Implements ICallbackEventHandler
...
End Class
3. เขียนไคลเอ็นต์สริปต์เพื่อเรียกใช้เมธอด callback ในเพจ aspx ระหว่าง head tag
<head>
<script type="text/javascript">
01 function ShowText()
02 {
03 nametxt = document.getElementById("TextBox1").value;
04 CallServer(nametxt);
05 }
06 function ReceiveServerData(retVal)
07 {
08 document.getElementById("TextBox2").value = retVal;
09 }
</script>
<head>
และกำหนดอีเว็นต์ OnClick ของ Button เพื่อเรียกฟังก์ชัน ShowText()
<input id="Button1" type="button" value="button"
onclick="return ShowText();" />
อธิบายได้ดังนี้
- โค้ดบันทัดที่ 03 เป็นการดึง value ของ TextBox1 มา้เก็บไว้ที่ตัวแปร nametxt
- โค้ดบันทัดที่ 04 เป็นการเรียกฟังก์ชันชื่อ CallServer ซึ่งเป็นสคริปต์ฟังก์ชัน ที่เราจะเขียนขึ้นใน Code-behind อีกที เพื่อเรียกใช้ฟังก์ชันในเซิร์ฟเวอร์ต่อ
- ฟังก์ชัน ReceiveServerData เป็นฟังก์ชัน CallBack ที่รับผลลัพท์จากเซิร์ฟเวอร์กลับมา โดยฟังก์ชั่นนี้ จะถูกเรียกหลังจากที่การประมวลผลบนเซิร์เวอร์ เสร็จเรียบร้อยแล้ว ส่วนมากใช้เพื่อแสดงผลลัพท์ที่ได้รับกลับมา โดยมีโค้ดบันทัดที่ 08 เป็นการ assign ค่าที่ได้รับกลับมาแสดงใน TextBox2
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
01 Dim callbackRef As String
02 callbackRef = ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
03 Dim callbackScript As String
04 callbackScript = "function CallServer(arg, context) {" & callbackRef & "; }"
05 ClientScript.RegisterClientScriptBlock(Me.GetType, "CallServerScript", callbackScript, True)
End Sub
อธิบายโค้ด
- ในอีเว็นต์ page_load นี้จะทำการเพิ่มไคลเอ็นต์สคริปต์โค้ด ที่จะ PostBack กลับไปยังเซิร์เวอร์ ให้สังเกตว่า "ReceiveServerData" นั้นเป็นชื่อฟังก์ชันสคริปต์ ที่เราได้สร้างไว้ตั้งแต่ข้อ 3 ซึ่งได้อธิบายไปแล้วว่าเป็นฟังก์ชันที่ใช้เพื่อแสดงผลลัพท์ที่ได้รับกลับมา
- ในบันทัด 04 เป็นการสร้างฟังก์ชันชื่อ CallServer ที่จะถูกเรียกใช้จากฟังก์ชัน ShowText ที่เขียนไว้แล้วในข้อที่ 3
- บันทัดที่ 05 เป็นการบอกให้เพิ่มสคริปต์นี้เข้าไปในเพจ aspx ตอน run-time
private retval as String
Public Sub RaiseCallbackEvent(ByVal eventArgument As
String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
retval = "Hello world : " & eventArgument & ", " & Now.Date.ToShortDateString
End Sub
Public Function GetCallbackResult() As String Implements
System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return retval
End Function
- เมธอด RaiseCallbackEvent เป็นเมธอดที่ทำงานเมื่อมีการเรียกใช้ เมธอด CallServer ที่ได้สร้างไว้ในข้อ 4 โดยทำการ concat ข้อมูลที่ได้ส่งมาใน eventArgument พารามิเตอร์ ซึ่งก็คือข้อมูลใน TextBox1.Text นั่นเอง เพราะถ้าดูจากโค้ดในข้อ 3 แล้ว ในบันทัดที่ 04 มีการเรียกใช้เมธอด CallServer โดยส่งข้อมูล TextBox1.Text เป็นพารามิเตอร์
- เมธอด GetCallbackResult เป็นเมธอดคืนผลลัพท์ไปยังเมธอด Callback ที่ได้ระบุไว้ขณะสร้างฟังก์ชัน CallServer ในข้อที่ 4 บันทัดที่ 02 ซึ่งเมธอด Callback นั้นก็คือ ReceiveServerData โดยใน ReceiveServerData ก็จะรับข้อมูลที่ได้ส่งมาจาก GetCallbackResult
- ส่วนตัวแปร retval เป็นตัวแปรแบบโกลบอลเพื่อเก็บค่าของข้อมูลระหว่างเมธอด RaiseCallbackEvent และ GetCallbackResult
ลองทดสอบโดย run โปรแกรมและลองใส่ชื่อใน TextBox1 แล้วกดปุ่ม Button ข้อความและแสดงบน TextBox2 โดยที่เพจไม่มีการ refresh
โค้ดในส่วนของ code-behind ทั้งหมด
Partial Class _Default
Inherits System.Web.UI.Page
Implements ICallbackEventHandler
Private retval As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sb As New StringBuilder
Dim callbackRef As String
callbackRef = ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
Dim callbackScript As String
callbackScript = "function CallServer(arg, context) {" & callbackRef & "; }"
ClientScript.RegisterClientScriptBlock(Me.GetType, "CallServer", callbackScript, True)
End Sub
Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return retval
End Function
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
retval = "Hello world : " & eventArgument & ", " & Now.Date.ToShortDateString
End Sub
End Class
และโค้ดเพจ Default.aspx ทั้งหมด
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function ShowText()
{
nametxt = document.getElementById("TextBox1").value;
CallServer(nametxt);
}
function ReceiveServerData(retVal)
{
document.getElementById("TextBox2").value = retVal;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Italic="False" Font-Size="Large"
Font-Underline="True" Text="Client Callbacks Without Postbacks in ASP.NET"></asp:Label>
<br />
<br />
<asp:TextBox ID="TextBox1" runat="server">TextBox1</asp:TextBox>
<br />
<input id="Button1" type="button" value="button" onclick="return ShowText();" /><br />
<asp:TextBox ID="TextBox2" runat="server" Width="304px">TextBox2</asp:TextBox> <br />
</div>
</form>
</body>
</html>
ด้วยความสามารถในการ Callback without Postback นี้เอง ทำให้เราสามารถเขียนโปรแกรม ASP.NET ได้โดยปราศจากการ submit ทั้งเพจ เพื่อเพิ่มความรวดเร็วในการทำงานของเว็บเพจ ให้ทำงานได้อย่างรวดเร็วและราบรื่น
Wednesday, June 13, 2007
Client Callbacks without Postbacks in ASP.NET
ด้วยเหตุนี้ใน ASP.NET 2.0 จึงมีวิธีในการจัดการการเรียกใช้เมธอดบนเซิร์ฟเวอร์ เพื่อนำมาแสดงผลบนเพจได้โดยที่ไม่ต้องทำการ Postback ทั้งเพจ ซึ่งเรียกว่า Callbacks without Postbacks
ด้วยวิธีการ Callbacks without Postbacks จะทำให้อีเว็นต์ที่เกิดขึ้นบนบราว์เซอร์ สามารถส่งการร้องขอไปยังเมธอดที่อยู่ใน Code-behind หรือ script runat="server" ได้ และเมื่อเมธอดบนเซิร์ฟเวอร์ได้ประมวลผลเพื่อให้ได้ผลลัพท์ที่ต้องการแล้ว ก็จะส่งหน้าที่กลับไปยังเมธอด Callback บนบราว์เซอร์เพื่อนำผลลัพท์ที่ได้มาแสดงบนเพจในบราว์เซอร์ โดยที่ไม่ต้อง PostBack เพจกลับไปยังเซิร์ฟเวอร์
Callbacks without Postbacks เกี่ยวข้องกับ Interface ชื่อ ICallbackEventHandler ซึ่งประกอบด้วยเมธอด
- RaiseCallbackEvent เป็นเมธอดที่ถูกเรียก เมื่อมีการเรียกใช้เมธอดสำหรับการ Callback
- GetCallbackResult เป็นเมธอดที่คืนผลลัพท์ของการทำงาน ไปยังเมธอด Callback
ตอนต่อไปผมจะแสดงวิธีการเขียนโค้ดครับ
Monday, June 11, 2007
การป้องกันการโจมตีแบบ Cross Site Scripting (XSS)
เช่น
<%@ Language="C#" ValidateRequest="false" %>เมื่อ run เพจนี้จะปรากฏข้อความ "Hello" เป็น message box ขึ้นมา เนื่องจากสคริปต์ใน txtString ได้ส่งเข้่ามาและถูก render เป็นไคลเอ็นต์ไซต์สริปต์ในเว็บบราว์เซอร์
<html>
<script runat="server">
void btnSubmit_Click(Object sender, EventArgs e)
{
// If ValidateRequest is false, then 'hello' is displayed
// If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="server"
Text="<script>alert('hello');</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
Text="Submit" />
</form>
</body>
</html>
การป้องกัน XSS
1. กำหนดแอตทริบิวต์ validateRequest="true" ใน configuration ไฟล์ หมายความว่า จะมีการตรวจจับทุก HTML และ character ต่างๆที่จะส่งไปยังเซิร์ฟเวอร์ ถ้ามีการส่งสคริปต์ก็จะถูกตรวจพบและแสดงข้อความผิดพลาดประเภท HttpRequestValidataionException ขึ้นมา
ตัวอย่างการกำหนด
...ซึ่งการกำหนด validateRequest โดย default จะกำหนดให้เป็น true อยู่แล้ว
<pages validateRequest="true"/>
...
2. กำหนดข้อบังคับในการ input เช่น มีการตรวจสอบ input ฝั่งเซิร์ิฟเวอร์เสมอ, กำหนด length, range, format และ type ที่แน่นอนให้กับแต่ละ input เป็นต้น โดยการใช้ RegularExpressionValidator, Regex Class, RangeValidator, CustomValidator
3. ทำการ Encode ข้อมูล output ที่ไม่น่าไว้ใจ โดยการใช้ HttpUtility.HtmlEncode หรือ HttpUtility.UrlEncode และ Encode URL ที่ไม่น่าไว้วางใจโดยใช้ HttpUtility.UrlEncode
เช่น
<%@ Page Language="C#" ValidateRequest="false" %>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html >
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="server"
TextMode="MultiLine" Width="382px" Height="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="Submit"
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
HttpUtility.UrlEncode(urlString);
เนื้อหาอ้างอิงจาก http://msdn2.microsoft.com/en-us/library/bb355989.aspx
38th at the All Season
วิวสวยมากครับ จึงถ่ายรูปมาให้ชมกันครับ

รูปแรกถ่ายเห็นสวนลุมฯครับ ส่วนอาคารสีขาวรูปตัว L ด้านหน้าคือสถานฑูตสหรัฐฯครับ
ถ้าสังเกตดีๆ จะเห็นรางรถไฟฟ้า BTS ด้วยนะครับ

รูปนี้ดูเพลินๆครับ
ถ่ายมาได้ 2 รูปเองครับ เกรงใจครับ รปภ. ยืนจ้องตาเขม็งเลยครับ
Sunday, June 10, 2007
เรียน OOP C# ASP.NET ด้วยตนเอง
เรียน OOP C# ASP.NET ด้วยตนเอง
ผู้เขียนบล็อกเป็นผู้ที่มีประสบการณ์อย่างมากในวงการคอมพิวเตอร์นานกว่า 20 ปี
และอีกไม่นานเกินรอก็จะมี หนังสือ "เรียนรู้ด้วยตัวเอง OOP C# ASP.NET" ก็จะพิมพ์ออกจำหน่ายแล้วครับ
ผมเป็นอีกคนหนึ่งที่กำลังรอหนังสือภาษาไทยดีๆ แบบนี้อยู่ครับ
Tuesday, June 5, 2007
การสอบ Certificate
แต่เดิมตอนที่ผมกำลังเริ่มสอบทาง Microsoft ยังไม่ได้ออก Visual Studio 2005 ผมเริ่มสอบวิชาแรกคือ 70-229 Microsoft SQL Server 2000 Database Design and Implementation ตอนนั้นผมลงทุนซื้อหนังสือเล่มข้างล่างนี้เลยครับ ราคาก็ประมาณ 1300 บาท ถือว่าราคาแพงมากครับ (เป็นหนังสือเล่มที่แพงที่สุดที่ผมเคยซื้อเลยครับ ตอนเรียน ป.ตรี ซื้อ text book ราคาแพงสุดยังแค่ 800 บาทเอง)
ภายในประกอบไปด้วยเนื้อหาและแบบฝึกหัดหลายร้อยข้อ และแถม CD โปรแกรม SQL Server 2000 Enterprise Edition (180 วัน) เพื่อเตรียมสอบโดยเฉพาะเลยครับ
และก็อ่านอีกเล่มเป็นภาษาไทยครับ MS SQL Server 2000 เล่มสีเขียว
(รายละเอียด)
เกือบลืมบอกไปครับว่า อ่านข้อสอบเก่าด้วยของ TestKing ด้วยครับ ซึ่งส่วนใหญ่จะตรงครับแต่ต้องใช้วิทยายุทธนิดนึงครับในการค้นหาข้อสอบเก่า
เมื่อเตรียมตัวพร้อมแล้วก็ลงทะเบียนสอบครับโดยลงทะเบียนที่ www.vue.com หรือ www.prometric.com แต่ผมเลือก vue ครับ เมื่อลงทะเบียนเสร็จก็เลือกวิชาที่ต้องการสอบ และเลือกศูนย์สอบ พร้อมกับชำระเงิน $40 แต่ถ้าซื้อ voucher ที่ศูนย์สอบในเมืองไทยโดยตรงจะคิดราคา 2,200 บาท(ไม่รวม VAT)
โดยผมชำระเงินด้วย credit card ผ่านระบบ SSL ของ vue ตอนแรกก็กลัวเหมือนกันครับ แต่หลังๆ ก็ชินครับ
เมื่อใกล้วันที่สอบประมาณ 1-2 วันทางศูนย์สอบจะโทรฯ ติดต่อเข้ามายืนยันการสอบของเรา ถ้าเราร้อนใจก็สามารถโทรไปยืนยันเองก่อนได้ครับ
วันที่สอบก็ให้เตรียมตัวไปถึงก่อนแต่เนิ่นๆ สัก 15 นาทีครับเพราะบางทีอาจจะพบกับปัญหาจุกจิกบ้าง เช่น รอ Upload ข้อสอบ ไฟดับ เครื่องแฮงค์ เป็นต้น
ในการสอบใช้เวลาประมาณ 2 ชั่วโมง 30 นาที ถึง 3 ชั่วโมง ข้อสอบประมาณ 40 ถึง 45 ข้อ แล้วแต่วิชาครับ ส่วนข้อสอบจะเป็น multiple choice ไม่มี simulate เลยครับ (แต่ตัวใหม่ MCPD, MCTS มี simulate เพียบ) เมื่อสอบเสร็จก็จะทราบผลคะแนนทันทีแบบไม่ต้องรอลุ้นเลย ตัวแรกสอบผ่านก็จะได้ MCP เลยครับ
ผมรอ e-mail ยืนยันประมาณ 2-3 วัน หลังจากนั้นก็สมัครสมาชิกที่ MCP Member site ครับ โดยใช้เลข MCP ID เพื่อ Activate ครับ และทำการยืนยันที่อยู่ของเราเพื่อให้ Microsoft ส่ง Welcome Kit มาให้ครับ
รอประมาณ 2 สัปดาห์ Welcome Kit ก็ส่งมาให้ถึงบ้าน ซึ่งประกอบด้วย ใบ Certificate, เข็มกลัด MCP, บัตรสมาชิก MCP
จากนั้น 6 เดือน ผมก็สอบ 70-306 Developing and Implementing Windows-based Applications with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET
ต่อมา 2 เดือน สอบ 70-310 Developing XML Web Services and Server Compoments with Microsoft Visual Basic .NET and the Microsoft .NET Framework
เมื่อสอบครบ 3 วิชา ได้ MCAD มาก่อนครับ และตั้งใจจะสอบต่อไปให้ได้ MCSD ซึ่งต้องสอบอีก 2 วิชาครับ
และอีก 3 เดือนต่อมา สอบ 70-305 Developing and Implementing Web Applications with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET
และสุดท้าย อีก 4 เดือนต่อมา สอบ 70-300 Analyzing Requirements and Defining Microsoft .NET Solution Architectures ซึ่งเป็นวิชาที่ผมคิดว่ายากที่สุดเลยครับ พูดง่ายๆ คือ เป็นวิชาที่คะแนนผมน้อยที่สุด และได้คะแนนแบบเกือบตกครับ
ทั้ง 4 วิชานี้ ผมอ่านหนังสือหลายอย่างครับ ทั้งภาษาไทย ภาษาอังกฤษ และแบบฝึกหัดจาก MOC ของหัวหน้าที่ได้ไปอบรมมาครับ ทั้งนี้ส่วนใหญ่แล้วที่ผมสอบได้ทั้งหมดนี้ก็เป็นเพราะหัวหน้าผมล่ะครับที่คอยสนับสนุนอยู่ตลอดเวลาครับ ค่าสอบทั้งหมดประมาณ 10,000 บาท เบิกบริษัทได้เกือบทั้งหมดครับ
ผมสอบครบ 5 วิชา ผมก็จะได้ MCSD แล้วครับ แต่คราวนี้ผมต้องรอ Welcome Kit เป็นเดือนเลยครับ เนื่องจากช่วงเวลาที่ผมสอบได้เป็นช่วงที่ Microsoft กำลังเปลี่ยน Certificate ครับ จึงล่าช้ากว่าปกติไปหน่อย แต่ก็ไม่ว่ากันครับ
ด้านล่างเป็นรายชื่อวิชาที่ผมได้สอบไปแล้วทั้งหมดครับ ส่วน 70-431 TS: Microsoft SQL Server 2005 - Implementation and Maintenance ผมได้ voucher สอบมาฟรีครับ ซึ่งจะหมดอายุวันที่ 31 ธันวาคม 2549 ผมก็เลยสอบวันที่ 28 ธันวาคม 2549 ซะเลย (ที่ไม่สอบวันที่ 29 หรือ 30 หรือ 30 ธันวาคม นั้น เพราะว่า ศูนย์สอบหยุดครับ ถ้าไม่หยุดก็กะสอบวันที่ 31 นะเนี่ย)
ส่วนวิชา 70-306 ที่มี Canceled ไป 1 รายการนั้น เป็นเพราะผมต้องการย้ายวันครับ จึงต้อง Canceled รายการเก่าก่อน ซึ่งผมจำได้ว่าผมต้องเสียค่า Cancel ไปประมาณ 40 กว่าบาท เนื่องจากอัตราการซื้อ/ขายค่าเงินบาทมันต่างกันครับ T_T
จากนี้ไปก็จะสอบ MCPD ต่อครับ ตอนนี้กำลังเตรียมตัวอยู่ ก็คงจะสอบเสร็จภายในสิ้นปีนี้แน่นอน
การย้าย Database SQL Server 2000
เนื่องจากทางออฟฟิตผมต้องทำการย้ายเครื่อง Database Server ที่เป็น SQL Server 2000 ผมจึงต้องคิดแผนในการย้ายครั้งนี้ โดยผมได้สรุปแผนได้ดังนี้
1. ทำการย้ายโดยการ copy ไฟล์ *.mdf และ *.ldf
เป็นวิธีที่ง่ายที่สุด แต่ต้อง stop บริการของ SQL Server ในเครื่องเก่าก่อนจึงสามารถ copy ไฟล์ได้ โดยทำการ copy ไปยังเครื่องใหม่ โดยต้องกำหนดไดเรกทอรี่ทุกอย่างของไฟล์ให้เหมือนเดิม ซึ่งในการ copy ไฟล์จะต้อง copy ทุกไฟล์แม้กระทั่ง master, model, msdb ไฟล์ (system database) เพื่อให้ข้อกำหนดทุกอย่างของ Server เหมือนเดิม เช่น Login, DTS, Job เป็นต้น
2. ทำการย้ายโดยการ restore ฐานข้อมูล master
วิธีนี้ทำให้ไม่ต้อง stop บริการของ SQL Server ในเครื่องเก่าก่อน แต่มีวิธีการที่ยุ่งยากมากเนื่องจากต้อง restore ฐานข้อมูล master, msdb และ user database ทั้งหมดเอง
การ restore master database
เนื่องจาก master database เป็น system database จึงไม่สามารถ restore ได้ทันที ต้อง start ระบบแบบ single-user ก่อนจึงสามารถ restore ได้ โดยการ start ระบบ SQL Server ให้เป็น single-user ให้ทำดังนี้
1. ยังไม่ต้อง start SQL Server ให้เปิด command-line และไปที่ C:Program FilesMicrosoft SQL ServerMSSQLBinn
2. พิมพ์ Sqlservr -m -s <instance_name> เช่น Sqlservr -m -s SQL_instance_2 ถ้าไม่มี instance ก็ไม่ต้องกำหนด -s ครับ เช่น Sqlservr -m
3. บริการ SQL Server จะ start แบบ single-user โดยมีข้อความใน command prompt ดังนี้
ยังไม่ต้องปิด command prompt นี้
4. จากนั้นก็สามารถ restore master database ได้แล้วครับ จะ restore โดยใช้ Enterprise Manager หรือ เปิด Command prompt อีกอันก็ได้ครับ
5. เมื่อ restore master เรียบร้อยแล้ว ก็สามารถปิด command prompt ที่ start ไว้ได้แล้ว
6. ทำการ restore msdb
7. ทำการ restore user database ทั้งหมด
ส่วนใน DTS และ Job ที่มีการอ้างถึง SQL Server ตัวเดิม ให้ทำการเปลี่ยนเป็น SQL Server ตัวใหม่
ตรวจสอบรายละเอียดอื่นๆ ว่าสามารถทำงานได้ปกติหรือไม่ เช่น การกำหนด operation เพื่อส่ง e-mail การกำหนด Link-server