無廢話SQL語法--4.第一大將SELECT(2)

SELECT基礎語法

  請直接進入SSMSE管理工具的Northwind的SQLQuery查詢。然後將實例中的語法使用「複製/貼上」的方法,然後在工具中按「F5」執行,看其結果。以下為簡省畫面,除特別結果,不再截圖,請自行測試。

  複習:

  SELECT 欄位名稱
  FROM 資料表名稱
  WHERE 條件

  實例一:取得Products資料表中所有產品的明細資料

  SELECT *
  FROM Products

  在欄位方面我們使用星號「*」時,代表我要取出FROM資料表中所有的欄位,不過在實際進行程式設計時很少用到這個方式,因為這個方法會對程式效率產生影響,所以建議盡量能指定明確且你所需要的欄位名稱。這個SELECT語法中沒有使用到WHERE條件,沒有條件就是代表「我要取出全部資料」。

  實例二:從Products資料表取出ProductName(產品名稱)及UnitPrice(單價)

  SELECT ProductName,UnitPrice
  FROM Products

  指定明確欄位名稱。

  實例三:從Products資料表取出ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice(欄位順序要一樣)

  SELECT ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice
  FROM Products

  取出欄位的顯示安排是可以依照你的規劃來設計,而寫出明確欄位名稱及順序的好處是可以增加語法的可讀性,你可以知道取出了什麼資料,另外可以排除一些不必要錯誤,例如,如果你在欄位名稱使用「*」,但如果有人變更了資料表的欄位結構,你將很難查出錯誤。原則就是:你需要什麼那就取出什麼。

  實例四:從Products資料表取出商品單價(UnitPrice)大於50元的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE UnitPrice > 50

  WHERE是一種「過濾」的動作,絕大部份的情況下,我們很少要取出資料表中全部的資料,而是要資料表中「特定」的資料,而WHERE就是在幫我們過濾不必要的資料,找出我們需要的資料。WHERE後的條件可以使用數值的比較運算子,常用的運算子有:> 大於、< 小於、>= 大於等於、<= 小於等於、= 等於、<>、!= 不等於(SQL Server支援這兩種不等於的語法),還可以使用邏輯運算子來結合多個條件(AND、OR),例如將上述的WHERE修改為:「WHERE (UnitPrice > 50) AND (UnitPrice <> 50) OR (UnitsInStock > 50)

  實例六:從Employees資料表取出City(城市)是在London(倫敦)同事的FirstName

  SELECT FirstName
  FROM Employees
  WHERE City = 'London'

  這個實例要說明的是當比較的資料型態為「字串」時,字串必須使用「'」到「'」單引號符號之間,而不是我們常在撰寫程式時使用的「"」雙引號符號,請小心注意,你可以移除「'」或是換上「"」測試看看。而這個「'」也就是SQL語法常被SQL Injection攻擊的起點,所以如果在撰寫動態網頁程式時,一定要非常小心處理這個「'」,有關「SQL Injection攻擊」我們有機會再聊聊。

  實例七:從Products資料表取出產品名稱中有含有「Anton」的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE ProductName LIKE '%Anton%'

  LIKE是一種「模糊搜尋」,它必須使用如百分號(%)或底線(_)合作使用。%代表0個或以上的任意字元。_則是只能有1個字元。另外注意,LIKE在搜尋是不會分字母大小寫,當然中文不會有大小寫的問題。所以'%Anton%'表示Anton之前與之後有任意幾個字元都符合條件。例如:

  LIKE 'ANTON%' :以ANTON開頭的字串將符合條件。
  LIKE '%anton%'  :含有anton字串將符合條件。
  LIKE '%Anton'  :以Anton結束的字串將符合條件。
  LIKE 'C___'  :(C後面是三個底線)表示以C開頭且只含三個字元將符合條件。

  如果你只知道要找一個'kkbruce'字串,但不知道在那一個欄位,尤其是在程式設計時常會進行多個欄位的模糊搜尋,只要使用OR來連接LIKE條件即可,例如:Field1 LIKE '%kkbruce%' OR Field2 LILE '%kkbruce%' OR Field3 LIKE '%kkbruce%' …,將資料表中所有的資料欄位全部用OR起來,那就可以查詢全部欄位。

  LIKE在資料查詢的條件設定時是很重要的使用方式,我們在深入一點點。想想,如果我們要查詢百分比'%'符號時,那要如何下這個LIKE語法?LIKE '%%%'嗎?如果我們要查詢底線'_'時,是下LIKE '%_%'嗎?

  如果單從「字面上」來看,這樣寫法是沒有錯,但SQL Server會將「%」解釋為「0個或以上的任意字元」,「_」底線解釋為「只能有1個字元」,這不是我們要的結果。這時我們就要借助ESCAPE關鍵字的幫助,ESCAPE原意是「逃脫」,也可是我們可以指定一個「跳脫」的符號,當我們在LIKE使用中使用跳脫符號時,跳脫符號後的符號將以原意來解釋。我們用實例來說明:

  LIKE '%\%%' ESCAPE '\'
  LIKE '%\_%' ESCAPE '\'

  先指定'\'為跳脫符號,然後在LIKE中使用\%來代示\後面的%要使用原意(百分比)來解釋,第二個一樣,將\後面的_使用底線來解釋,這樣了解嗎。

  SQL Server中LIKE會使用到的萬用符號:

  %:任何含有零或多個字元的字串。
  _:任何單一字元。
  []:在指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單一字元。
  [^]:不在指定範圍 ([^a-f]) 或集合 ([^abcdef]) 中的任何單一字元。

  最後在介紹一個SQL Server的CHARINDEX()的函數,它的語法是:

  CHARINDEX('要尋找之字元', [欄位名稱] )

  如果CHARINDEX找到你要的字元,會傳回一個大於零的值,沒有就傳回值零,所以上面的例子也可以改寫成:「WHERE CHARINDEX('%', ProductName) > 0」,一樣,可以使用OR來連接多個欄位的查詢,而且CHARINDEX()效率比LIKE還好,LIKE很重要,請好好了解。還有不了解,請查詢SQL Server線上叢書。
  
註:CHARINDEX()會傳回字串在資料欄位中的位置,所以當欄位內容有資料時,傳回的值就會大於零。
註:CHARINDEX()不屬於SQL語法,是SQL Server的函數。

  實例八:從Orders資料表取出1996年8月份(OrderDate )的訂單資料

  SELECT *
  FROM Orders
  WHERE OrderDate >= '1996/8/1' AND OrderDate <= '1996/8/31'

  日期的比較運算和數值一樣,另外還有一種用法是使用「BETWEEN~AND~」,本例中的WHERE可以寫成:   WHERE OrderDate BETWEEN '1996/8/1' AND '1996/8/31'   不過資料庫軟體在執行時還是會自動轉換為>=、<=的運算方式。
(NOT)IN的使用方法

  實例九:從Products資料表取出CategoryID(類別編號)為1,2,3的ProductName

  SELECT ProductName
  FROM Products
  WHERE CategoryID IN (1,2,3)

  IN括弧內的值為「其中任一個值符合」即可,而IN也可以轉換成OR的運算式,例如:

  WHERE CategoryID =1 OR CategoryID =2 OR CategoryID =3

  那我們使用OR就好了,為什要使用IN呢?那是因為OR這種運算式你只能使用在「清楚、明確」知道「個數」的地方,如我知道要取出1,2,3時使用,但如果我根本不知道會取出多少個值,那就要使用IN了,這我們後面會交代。

  我們也可以令IN的條件相反,也就是除了1,2,3其他的資料我都要,那就可以使用「NOT IN」,那WHERE敘述如下:

  WHERE CategoryID NOT IN (1,2,3)

  而OR敘述:

  WHERE NOT (CategoryID =1 OR CategoryID =2 OR CategoryID =3)

  NOT就是將整個結果相反的意思,原本成立變不成立,不成立變成立,這樣了解嗎!

NULL的概念(IS使用)

  實例十:從Suppliers資料表取出沒有HomePage(網頁)的CompanyName(公司名稱),也就是HomePage內容為NULL的公司。

  SELECT CompanyName
  FROM Suppliers
  WHERE HomePage = NULL

  如果你已經執行了,嗯,怎麼會是錯誤的?在SQL當中NULL代表一種「未定」或「不明」的狀態,而你不能拿「未定、不明」的值來比較(=、<、>、…)運算,當然也不使用NULL = NULL的比較,因為「未定不會等於未定」,這時我們必須使用IS這個比較運算子:

  WHERE HomePage IS NULL

  也就是明確的跟WHERE說,我要的是(IS)NULL這個值。IS也可以使用NOT,來使整個結果相反:

  WHERE HomePage IS NOT NULL

  IS NOT(不是),就是請找出其他不是NULL的資料。

結合資料表(INNER JOIN)及別名(Alias)

SQL Server 2008 Express規格...小小失望

  2008/8/6(三),MS發布SQL Server 2008正式版。中文版預計要9月才會正式發行。從SQL Server 2005到SQL Server 2008,MS花了三年多了時間來改版,SQL Server 2008這個版本主要是以SQL Server 2005來進行功能加強及提升。

  不過我比較關心還是在「免費」這部份的SQL Server 2008 Express版本,SQL Server 2008 Express除了功能上同步提升外,其實我比較關心的「規格」方面,2008 Express與2005 Express還是一樣沒有改變,這點讓我有點小小的…失望。

  SQL Server 2008相關資訊:http://www.microsoft.com/taiwan/sql2008/default.aspx
  規格:http://www.microsoft.com/sqlserver/2008/en/us/compare-specialized.aspx
  詳細規格:http://download.microsoft.com/download/e/8/8/e8859616-e95d-41fe-9f81-ff88388d772b/SQLServer%202008CompareComapctExpress.pdf
  • Max 1 CPU/Server
  • 1 GB RAM usage
  • 4 GB DB size
  如果這個規格能夠Double,我相信絕對是使用者與MS雙贏的情況。我理想的規格:
  • Max 1~2 CPU/Server
  • 2 GB RAM usage
  • 4~8 GB DB size
  以目前多核心的CPU來說,CPU到不是問題,所以就算只使用1顆多核心CPU來運作,應該也可以跑的相當順暢。但RAM如果可以再開放大一點,對整體在使用Express效能會是影響很大一部份。當然免費我們不能要求太多,我想像中2GB RAM usage在Express版本算是理想狀況。而DB size是直接影響能存放的資料量。但這點跟2005 Express版本一樣,是「單一資料庫檔案」的限制,還是有辨法突破。不過如果能多多益善,那是最好。

  當然,免費的使用者(我)都是貪得無厭,除了規格上的小小失望(尤其是RAM),其他功能上的提升還是值得我們贊許及嘉獎。

ASP.NET And SQL Server 2005 Express遠端連線的方法

前言

  SQL Server 2005 Express版本(以上簡稱SSE),雖然是SQL Server 2005精簡版本,不過如果你的資料庫的使用需求簡單,且資料產生的量也不大,它是一個不錯的資料庫軟體,可以列入考慮。可能你會說,我可以直接使用MySQL之類資料庫軟體,嗯嗯,這也是一種不錯的方向,其實這都不是重點,重點是:「黑貓,白貓,會爬老鼠的就是好貓。」能解決你的問題就是好資料庫軟體,管它是使用Excel、Access、MySQL、Oracle、SQL Server…。當然,這隻黑貓、白貓其中還有需多要考慮的重點:效能、維護、資源、工具、文件、支援、服務…等多個面向考慮,最後選擇一個最符合你需求的資料庫軟體即可。

  我先說說我為何選擇SSE來做為我的資料庫,
  1. 因為它是免費。(與MySQL…相同)
  2. 我使用是Windows平台。
  3. 我使用的程式語言為Visual Basic。
  4. 我寫的是ASP.NET(*.aspx)網頁。
  5. 容易與開發工具整合與管理。

  除了第一點是比較沒有說服力之外,還有一點,因為是精簡版的關係,所以當然會有一些進階版本的功能是你無法使用的,但基本上MySQL是沒有這些限制的。但我在開發*.aspx時,使用SQL Server是非常方便的,Microsoft提供的工具(Visual Studio…)可以很方便與SQL Server做整合、管理…等等的工作。

SSE的限制
  • CPU數目:1
  • 記憶體上限:1 GB
  • 64位元支援:Windows on Windows (WOW)
  • 資料庫大小:4 GB

  SQL Server 2005各版本的差異,可以參考這裡
  其中比較要注意的是「資料庫大小」這一個項目,Express版本的4 GB限制是指「單一個DataBase檔案」,如我們常當成範例的Northwind(北風資料庫),在Express版本中的資料庫大小會有4 GB的限制,所以你可以多開幾個資料庫檔案來運用而避開這項限制。

  限制歸限制,但MS還是提供了一些額外的Express工具讓使用者來擴充SSE的功能,包括:
  1. Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2
  2. Microsoft SQL Server 2005 Express Edition Toolkit Service Pack 2
  3. Microsoft SQL Server Management Studio Express Service Pack 2 (SSMSE)
  • Advanced Services
    包含SSMSE、支援全文檢索目錄(FullTextSearch)、支援經由報表服務(Report Service)來檢視報表。
  • Toolkit Service
    提供了額外的工具與資源來管理SQL Server 2005 Express版本,它也支援經由報表服務建立報表,包含工具:
    • Connectivity Components
    • Business Intelligence Development Studio
    • Software Development Kit
    • Management Studio Express
  • SQL Server Management Studio
    這個工具是用來管理SQL Server 2005 Express版本的資料庫。
  目前SQL Server 2008已經快要發行了,有興趣的可到微軟網站查看資訊。

註:如果你的網站只是存放「文字型資料」,基本上4 GB應該可以讓你使用一段很久的時間,我前陣子看一篇「數位之牆的十一年浩劫」的文章,當然,這篇文章讓我們從事資訊工作的人有所警惕,其中提到,一個經營11年的網站備份出來的資料檔大小不過40MB左右,而我所服務的公司,經營一個討論區約有1萬1千篇文章,資料檔大小也才13.5MB左右。如果再利用我上述提到的「多開幾個資料庫檔案」的技巧,這個SSE版本的資料庫,應該是相當實用。
實作環境

  我只有一台主機,所以我使用VMWare來架設第二台主機,當成DataBase Server。

  Host1
  • OS:Windows XP Professional SP3
  • Name:Bruce
  • IP:192.168.254.100/24
  • 這台XP主機主要是模擬成Server,主要是架設成.NET Framework 3.5的環境加上SSMSE,模擬連線到遠端SQL主機。

  Host2
  • OS:VMWare Server ConSole 1.0.6 for Windows XP Professional XP3
  • Name:VMBruce
  • IP:192.168.254.103/24
  • 主要安裝SSE,當成DataBase Server,我還會教大家做簡單的防火牆設定,以防SQL 1433 port的攻擊。
事前準備
  1. .NET Framework 3.5環境
    Microsoft .NET Framework 3.5Microsoft .NET Framework 3.5 語言套件,下載後安裝在主機Bruce。

    • 2008年08月已更新到3.5 Service Pack 1,可以直接下載後安就,Microsoft .NET Framework 3.5 Service pack 1
    • 如果電腦是第一次安裝.NET Framework,直接下載3.5 sp1套件安裝,它會幫你把2.0、3.0、3.5全部安裝起來。

  2. SQL Server 2005 Express資料庫軟體
    Microsoft SQL Server 2005 Express Edition Service Pack 2
    ,下載後安裝在主機VMBruce。

    註:如果你如我一樣有在開發*.aspx或其他.NET程式,那你也可以到 Visual Studio 2008 Express Editions,在畫面中選擇你需要的語言工具(例如最下方:Offline Install-->Chinese (Traditional)-->Download),即可下載ISO檔,然後使用DVD燒出來後安裝Visual Studio 2008 Express工具,會自動安裝以上1、2所有軟體。


  3. SSE管理工具(SSMSE,資料庫管理工具)
    Microsoft SQL Server Management Studio Express Service Pack 2
    ,下載後安裝在主機Bruce、VMBruce。注意,VMBruce安裝SSMSE前,最少要先行安裝.NET Framework 2.0相關套件。

  4. SQL Server 2005 線上叢書
    SQL Server 2005 線上叢書 (2007 年 9 月)
    ,這是完整的一本技術手冊,你在坊間買書,可能查不到的資料這裡面都有,如果你有心想了解及發揮SQL Server的實力,這一定要下載安裝來看。關於SQL Server,有問題,有不了解,或是在看書,做實例不清楚…反正先查它就對了。
關係圖

Bruce (Web Server, SSMSE)  <------>  VMBruce (SSE, SSMSE)

  VMBruce這台主機就是單純的一台DataBase Server,我們在VMBruce必須先使用SSMSE工具先做本機連接測試,然後做一些設定的修改,讓VMBruce這台主機開放遠端連線的權限。在來透過Bruce主機的SSMSE工具來實作遠端連線到VMBruce的資料庫來進行管理的工作。再進一步透過Bruce主機寫一個*.aspx的ADO.NET程式透過網頁來進行遠端的資料庫連接及存取的動作。

  如果你看買過很多動態網頁程式教學的書籍(我就是!@.@),你會發現所有的書籍都只會教你在本機架設一個網站,不管是IIS+ASP、IIS+ASP.NET、IIS+PHP、Apache+PHP+MySQL…,最後你只會在本機寫程式,做管理,然後再上傳到一台Web與DataBase在同一台Server上,但實務上會建議把Web的主機與Database的主機是分開在不同主機及網路上,這樣的架構可以很彈性的架設出一個較大型的網路應用服務(當然這還是跟需求有關:效能、錢錢、使用情況…)。

服務名稱及驗證模式

  在開始前最後一件事,要提醒大家「服務名稱」及「驗證模式」這件事。你可以在同一部電腦中安裝多次的SQL Server引擎,而每次安裝稱為一個執行個體(instance),每個執行個體都有一個名稱來辨別,如果你是使用Visual Studio Express相關工具安裝SSE,那預設資料庫執行個體的名稱為「SQLEXPRESS」(你在執行工具或撰寫程式時,大小寫都可以)而且驗證模式預設為「Windows驗證模式」,且只充許本機的連線,如果要充許遠端連線還需要額外的設定。如果你是獨立安裝SSE,則系統在安裝時會讓你選擇驗證模式,你可以選擇「Mixed Mode, 混合模式」會比較有彈性,如此便能讓別的主機來連線或管理。

  在連線到資料庫時,在SSMSE的「伺服器名稱」或ADO.NET的「Data Source」你會發現格式為:「主機名稱\資料庫服務名稱」,例如:「VMBruce\SQLExpress」,如果是在同一台電腦主機,則主機名稱可用「.」來代替,例:「.\SQLExpress」,如果是使用遠端連線則主機名稱則使用IP Address來代替,例:「192.168.254.103\SQLExpress」。

  • Windows驗證模式
    Windows驗證接受使用者在登入Windows時獲得驗證,然後再傳送安全性憑證給SSE。而使用者的帳號和密碼只保留在Windows中。當ASP.NET使用Windows驗證時,連接字串不會提供帳號及密碼,只提供使用Windows驗證的指示。適合本機連接使用。

  • SQL驗證模式
    SQL驗證使用儲存在SQL Server中的資料來做使用者驗證。在連接時需提供「使用者名稱」及「密碼」來進行驗證。適合遠端連線使用。

  • 混合模式
    可以自行選擇使用Windows驗證或SQL驗證。
  記得,驗證連接的工作不是使用者,最常使用驗證工作的是ASP.NET等應用程式,User <-- *.aspx --> ADO.NET --> Database,這樣的流程看的懂嗎?驗證的工作作用在ADO.NET那一段,它會與DataBbase驗證溝通以取得存取的權限,如果是本機連線可選擇Windows驗證模式,如果是遠端連線就選擇SQL驗證模式。

獨立安裝SSE

  如果你是獨立安裝SQL Server 2005 Express資料庫,在安裝時有幾點要注意的地方。
  • SSE_執行個體.png「具名執行個體」的地方可以修改成任何你想要的名稱,其實這個執行個體名稱我是建議可以修改,如果有莫名的人要求連接時除了IP Address外,他也要完全猜對這個執行個體名稱,才有辨法連接,可以提升一些安全層級,我們測試上就使用預設SQLExpress即可,如果是正式對外的伺服器,還是修改一下的好。
  • SSE_帳戶服務_啟動SQLBrowser.png在下方有兩項安裝完成時要啟動的服務,預設只有SQL Server,如果你要開放遠端連接那請再勾選「SQL Browser」選項。(也可事後需要時再啟動)
  • SSE_驗證模式.png驗證模式,如上所述,只有本機連線就使用Windows驗證,如果開放遠端連線,那就選擇混合模式;在設定為混合模式時強制要設定sa的密碼,而且必須是「強密碼」。(也可事後需要時再修改驗證模式)
  如果是使用Visual Studio 2008 Express來安裝,就是一切採用預設值,如果有需求事後在使用SSMSE等工具來修改即可。

遠端連線一:使用SSMSE連接

  這裡我們預設你使用VS2008安裝起來的環境,我們先從測試本機連線,然後修改設定讓SSE開放遠端連線的權限。(這裡為了測試方便,先關閉VMWare中XP的防火牆)

  先到VMBruce這台主機:
  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> SQL Server Management Studio Express --> 出現「連接到伺服器」,「伺服器名稱」因為我們是本機連接,所以預設值是「.\SQLEXPRESS」,「驗證」因為我們還沒修改設定,所以只能以「Windows驗證」來連接,按下「連接」來連接到本機執行個體名稱為SQLEXPRESS的資料庫。
  • SSMSE_Connection_連接到伺服器如果畫面上沒有出現錯誤訊息,而且可以看到以下畫面,那就代表本機連接成功。
  • SSMSE_連接成功再來我們要修改設定讓SSE可以支援遠端連線,點選最上層有綠色三角形的地方 --> 右鍵 --> 屬性 --> 安全性 --> 選擇「SQL Server 及 Windows 驗證模式」。
  • SSMSE_SQL Server及windows設定驗證模式確認sa的相關設定:由最上層 .\SQLEXPRESS --> 安全性 --> 登入 --> sa --> 右鍵 --> 屬性 --> 一般:請一定一定要設定一個「強壯的密碼」
      --> 狀態 --> 登入:請選擇「已停用」,表示這個sa使用者不能由遠端登入。sa使用者的圖形會多一個紅色向下的箭頭。

  • 建立一個可遠端連線的使用者:在sa上層的「登入」點選 --> 右鍵 --> 點擊「新增登入」。
    1、我們建立一個「kkbruce」的使用者,選擇「SQL Server驗證」,密碼是「12345」,注意,我們是為了測試方便去除下方的「強制執行密碼原則」,正常情況下最少請保留這個勾選。
    2、「伺服器角色」請在加勾選「sysadmin」。
    3、「使用者對應」是選擇這個使用者登入後可使用的資料庫。
    4、「狀態」請確認「連接到Database Engine的權限:授於」與「登入:已啟用」。最後按下「確定」新增完成。可先離開本機SSMSE管理工具。
SSMSE_建立遠端連線使用者
  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> 組態工具 --> SQL Server介面區組態
  • SS2005_SQL Server介面區組態點擊下方「服務和連接的介區組態」
    1、SQLEXPRESS --> Data Engine --> 服務 --> 服務狀態:正在執行。(基本上如果你有做任何修改設定的動作,請來這裡按下方的「停止」再按「啟動」,讓SSE可以重新讀取新的設定。也可在「組態管理員」中設定,下一節介紹。)
    2、SQLEXPRESS --> Data Engine --> 遠端連接 --> 請選擇「本機和遠端連接:只使用TCP/IP」。
    3、SQL Server Browser --> 服務 --> 預設是「停止」,請點擊「啟動」。
    設定完成,可離開SQL Server介面區組態。

  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> 組態工具 --> SQL Server 組態管理員,你可以在組態管理員中直接對相關服務進行「重新啟動」等相關動作。
  • SS2005_組態管理員接下來我們要設定最重要的TCP/IP
  • SS2005_網路組態_TCP/IP請先確認「SQL Server 網路組態 --> SQLEXPRESS通訊協定 --> 右方的「TCP/IP:已啟用」然後在TCP/IP上按右鍵 --> 內容 --> 選擇「IP位址」,重點在那個「IPALL」的選項中,請先刪除「TCP動態通訊埠」中的值,然後在「TCP通訊埠」中鍵入:「1433」。
  • 完成後,回到「SQL Server 2005 服務」中「重新啟動」兩項服務。
  設定完VMBruce後,我們回到Bruce這台主機,打開SSMSE,然後鍵入相關資訊:

Local_SSMSE_輸入遠端連線資訊  按下「連接」:

Local_SSMSE_連接成功  是否有看到原本主機名稱的地方現在出現的是「遠端主機IP Address」,代表遠端連接成功。

遠端連線二:使用ASP.NET For ADO.NET連接
  
  在Bruce這台主機執行以下步驟:
  • 開啟Visual Web Developer 2008 Express開發工具
  • 檔案 --> 新網站 --> ASP.NET網站 --> 檔案系統 --> D:\WebSite1\ (路徑可自訂)--> 確定
  • 在點選右方的「資料庫總管」--> 資料連接 --> 右鍵 --> 加入資料連接
  • VWD_Select_DataSource_Microsoft SQL Server選擇「Microsoft SQL Server」,按「繼續」後,鍵入相關資訊;
  • VWD_加入連接_輸入遠端連接資訊鍵入後,1、記得勾選「儲存我的密碼」。2、可先按下方的「測試連接」,如沒問題,再選擇「選取或輸入資料庫名稱」,點選一下,系統會自己幫你代出可連接得資料庫名稱。最後按下確定,完成連接。
  接下來的*.aspx實作就換你接手了,基本的connectionString會像這樣:
connectionString="Data Source=192.168.254.103\SQLEXPRESS;Initial Catalog=Northwind;User ID=kkbruce;Password=12345"
  基本上這個connectionString是不安全的,因為這個字串內的資料是完全明碼的存在於Web.conf或*.aspx之中,應該在本機測試完成後,上傳到實際運作的伺服器後實行"加密"的步驟。不過"加密"離遠端連線主題太遠了,有空再聊。

防止1433 port攻擊

  我們使用MS內建Windows 防火牆(Windows Firewall/Internet Connection Sharing (ICS))來防止SQL Server 1433 port的攻擊。為什麼會有1433 Port的攻擊呢?在早期的SQL Server中有一個不需密碼的使用者"sa",而這個使用者又偏偏在SQL Server有極大的權利,可以呼風喚雨,而我們這些SQL Server安裝後設定的預設服務Port就是1433,而駭客們就是使用"人性=懶=惰性"的漏洞,許多的資料庫系統安裝人員很習慣性的「下一步」「下一步」,而建立了許多的「預設型」SQL Server,駭客們就先Scan你的網路是否有開啟1433 port,有的話,接著他會試著使用sa這個使用者來連接,因為不用密碼,然後就BingGo!或是你有設定密碼,駭客們也是可以慢慢猜,讓你防不勝防。所以灌好SQL Server的第一步就是幫sa這個使用者設定一個「非常強壯密碼」來進行保護的第一步。

  不管你是使用硬體或軟體的防火牆,基本的方向是一樣的,因為SQL Server不是讓使用者來存取的,而是讓ASP.NET等應用程式來存取,ASP.NET等應用程式的主機是少數,所以我們這台SQL Server應該限制只讓特定主機來存取1433 port,其他一律設定為拒絕(Deny)動作。

  步驟一:切換到VMBruce主機

  開始 --> 控制台 --> Windows 防火牆 --> 確定「開啟」 --> 選擇「例外」

Windows-Firewall-例外設定

  --> 點選「新增程式」 --> 尋找程式「C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe」

Windows-Firewall-例外設定-加入sqlservr.exe
  --> 變更領域 --> 自訂清單

Windows-Firewall-例外設定-變更領域  在自訂清單內加入開放連接的主機IP Address(簡言之就是這個IP Address是你所信任的),例如輸入:192.168.254.100,限制只有這一個來源IP Address可以與sqlservr.exe連線。

  步驟二:

  重覆以上步驟,加入程式「C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe」到防火牆的例外清單中。
註:程式路徑可能需要依你安裝的路徑做修改。
  兩個簡單的步驟就可以將SQL 1433 port攻擊的傷害減到最低,當然針對SQL的攻擊還有很多,例如針對SQL語言的攻擊,是"SQL語言"不是"SQL Server",防1433 port攻擊只是確保資料庫系統的安全之一,但不保障透過其他而來的各種攻擊。例如:SQL injection,SQL隱碼攻擊 Or 跨網站指令碼, Cross-site scripting,通常簡稱為XSS…等等的攻擊。好的系統維護人員,必須時時注意,處處小心,讓系統保持在安全、穩定的狀況下。

總結

  雖然標題是談「遠端連線」的方法,但也談了很多基礎的東西,知道的就當成複習,不知道的就當成基礎篇看一看,當你是使用本機連接時,設定簡單,保護也簡單,但當你開放遠端連接時,設定的步驟就麻煩很多,而且還要考慮到網路安全方面,但遠端連接也立刻讓你的ASP.NET等應用程式的應用彈性大大提升。有一利必有一弊,掌握基本原則,不需要的服務絕不開,開了就要做好萬全的保護。

  最後再提醒大家,如果你想好好提升SQL Server方面的實力,那「SQL Server 2005 線上叢書」一定好好利用,如果本文中有任何看不清楚、不了解、不明白,先打開這本線上叢書,好好查詢了解,一定會有你要的答案。

最後感謝你看完"LoLo長"(閩南語)的本文,送給各位一份本文完整的PDF:



#2008/8/17:更新「.NET Framework 3.5環境」到Service Pack 1環境。

這算是資訊安全的漏洞嗎?

  我有一位同事小洋,小洋與老婆相識十年,結婚十年,在進入十週年結婚紀念日前,他想把過去的點點滴滴收集的起來,他慢慢整理,寫在他自己的部落格,準備當成禮物送給老婆,而他的Blog是使用MSN帳號所申請的。

  而在一場聚會中,他因有事晚到,而同事聊著聊著就聊到"爸爸"這個話題,因為今年公司很旺,今年公司總共會出生1位男丁,3位千金,其中一位就是我。而突然有一位同事小元說,他認為小洋真的是一位好爸爸,好老公。我們有一半的人就用半疑惑眼神看著這位同事,原因是這位是新同事來公司沒幾個月,他怎麼會對小洋如此了解。

  我們好奇的問:你怎麼知道?小元說:我有看他的Blog。什麼Blog?我們和小洋在一起工作3年多,怎麼不知道有他有Blog,而你怎麼知道?這時有其他幾位同事也說,他們都會去看小洋寫給老婆內容的Blog,哇!!!

  這是怎麼回事,有精彩、噁心、肉麻的內容,幾位同事分享著Blog的內容…主角出現了,我們當然全部投以閃亮亮的眼神,當我們問他Blog的事情時,小洋突然一臉茫然說:你們怎麼知道???你們怎麼看得到???看著他一臉不知所措,我們大家"笑"的更大聲了。

  原因揭曉,原因就是如果你是使用MSN帳號在MSN開的Blog,如果你有更新Blog的內容,MSN會很好心的幫你提醒你MSN Messenger上的好友們說你的Blog有更新內容,雖然我使用MSN有一段不算短的時間,但我怎麼不知道有這種功能?

  原來他提醒的方式是我們原本的小綠人旁會多一個象小星星或小花的記號,如果有那個記號就是這個人的Blog有更新。原來如此。我的這位同事,用光速的速度回公司,快點查明設定,重新設定。

  第二天,MSN的抬頭:羞死人了!

msn_blog_update.PNG
  這個事件提醒了我們,電腦不會當駭客,網路不會當駭客,資訊安全的一切都是出在"人"身上,這個事件是MSN的錯嗎?絕對不是。如果各位未來有在MSN的Blog上看到一些怪怪的內容,記得基於"道義"也好,"友情"也好,問一下這位你MSN上的仁兄,是不是沒把設定搞清楚。

不讀書的快樂童年-暑假及憶童玩

  小時候,第一次上學是上幼稚園,還記得那時的我每天都非常的快樂,因為幼稚園的的生活就是玩、吃點心、玩、吃點心,而且在幼稚園裡有好多好多的小朋友可以一起玩。不過這段快樂的時間只有過了一學期我就沒在去了,我還記得原因,家裡說沒錢讓我去上課,等國小再去就好,就這樣等到我進入國小。

  其實,國小前的回憶能記得的真的不多,只有零星一些片段。但國小的印象就多了許多,像國小時記得老師注音教的好快,好像小朋友都已經在"幼稚園"學過似的,造成我後來國語成績一片紅海,在六年當中最快樂的日子當然就是學校的寒暑假。

  可能是鄉下的關係,小時候的暑假可是不會無聊,也是為什麼會想寫這篇"暑假"的原因是:

  1、在我新竹宿舍旁鄰居有一位小朋友,他今年要升國小六年級了,從搬來認識他到現在也已經有三年的時間,每一次暑假時他出現在我們房間的時間就大大增加,也不是不歡迎他,而是我們下班回到家後實在也沒什麼力氣在跟他聊東聊西,而且如果每天你下班回到家就有一個人馬上衝到你房間,那種「有朋自遠方來」的感覺都沒了。當然就會問問他為什麼不去找同學、朋友呀之類的話,回答是第一:不想找,第二:在家裡好無聊…聽了都快@.@!

  2、也是暑假,我哥有兩個國中的小朋友,暑假也是一直在喊無聊,在家如果不是上網打Online Game,不然就是上IM(MSN或Yahoo)跟朋友聊天,再不然就是看電視。沒啦!一個暑假就這樣的過了。

  如果過了十年、二十年都不知道他們是否可以像我一樣,在最珍貴的童年可以有一段不錯又快樂的童年回憶,而不是只是補習班、才藝班、Online Game、IM、電視,這些有什麼是「值得回憶」或「值得成為你的回憶」?

  河--游泳、魚、蝦、烏龜…

  如果你問我喜歡小時候那個沒建設的農村還是現有重建過的農村,我一定回答:「小時候的農村。」沒建設代表沒破壞,回想小時候環境,可以說原始但我認為是現代人所追求的天堂。

  小時候,家裡附近有許多條河,有大河、小河,而這些河流就是我們這群小鬼頭在暑假很重要的娛樂來源。就像童歌裡唱的:「我家門前有小河,後面有山坡…」,大河是我們消暑最重要的來源,我們整群小鬼常常跑到上游的大河游泳,這河的水量很大,下游灌溉都是由它來分支流出,撲通跳下去,是看不到人的,從河的上面段跳下去,從下面段爬上來,在水中隨意飄浮,跳水的姿勢千奇百怪,以我們的年紀來說,可是不會輸奧運的跳水。

  最好笑的,因為暑假其實也是農忙時,常常有小朋友的爸媽跑來這裡"抓人",我們常常就光溜溜躲在河邊的草叢,或是直接就跳進水裡躲起來,不過非常幸運的是,我們在這條河玩了那怎久從來沒發生過任何意外。

  小時候的河是充滿生命力的,而這生命力也為我們帶來許多美好的回憶。我們整群小鬼也是會常常跑到附近的河裡"冒險",冒險就是到河裡去抓東西,為什麼說是東西呢?因為能抓的東西實在太多,大肚魚、吳郭魚、土蝨、螃蟹、蝦、烏龜、鱉、蝌蚪…不管是用抓的、用釣的,那種河裡生態是現在那種死氣沉沉的河川所無法比擬。

  蟲、蟲

  當我們在小河中冒險時翻著石頭,常常可以看到蜻蜓的幼蟲。黃昏時,一大堆蜻蜓在空中飛翔。榕樹下的日子,蟬、獨角仙、剪刀蟲(正確名稱是「鍬形蟲」,小時候我不知道),還有竹筍蟲。這竹筍蟲一定要跟各位好好介紹一下,他可是一道人間美味,竹筍蟲顧名思義就是吃竹筍的蟲,小時候農村家家戶戶多少都會被竹林包圍起來,而鄉間小道上也是一片一片的竹林,有竹林當然就會長竹筍,有竹筍就會有竹筍蟲,而當我們抓到竹筍蟲會用打火機或番仔火把竹筍蟲烤熟,一口咬下,嗯~回味呀!

  還有,小時候記得在暑假時,每天晚上到處都是螢火蟲,尤其是在田裡或小河邊,一大片,真的是隨便抓抓都是算堆的,然後放到玻璃罐子裡,看著這神奇尾部會發光的生物。

  不能想像,當我們建設環境、破壞環境後,現在的小朋友居然要拿著千元大鈔去買一隻獨角仙回來養,螢火蟲要到特定的旅遊地點才能看到。如果我小孩長大,我跟他們說我小時候的生活環境他們會不會說:「爸爸你少唬人了!爸爸你說謊!爸爸你騙人!」

  榕樹下

  小時候家裡的附近環境是圍著一間廟建設起來的,廟前有一顆大榕樹,這顆大榕樹可是夏日小朋友們不可缺少的,它的大枝大節所生長出來的樹葉,為我們撐起一支大陽傘,在它樹蔭底下吹著風,不只涼快,更是我們遊戲進行的地方。

  大榕樹的枝節粗大,所以我們常樹上樹下爬來爬去,在剛爬上去有一根橫的枝節,在這枝節的地方有一個自然產生的凸出形狀,這凸出的形狀很自然形成一張臉的模樣,兩個眼睛、鼻子、嘴巴,我一直都認為這是顆神樹,有神明住在裡面,所以在樹枝上才會有那樣的形狀。

  在大榕樹下可是我們村裡這些小鬼頭的聚集地,不管是下課後、暑假、寒假,假日…基本上這裡就是我們的遊戲天堂,沒有干擾,盡情遊戲,所有的遊戲內容只有少數是需要花費「新台幣」,笑聲免費、快樂免費,當然帶給我的回憶也是免費。回憶這些童玩,許多已經只剩印象、名稱,玩法已經記不得了,不過還是值得一提,其中有些遊戲我歸納在「小偷」:

  • 捉迷藏
  • 鴻國大地
      這是一種比大小的遊戲,小朋友會分成兩組人馬,兩組人馬會用數字設定每個人大小,1最大,大的可以抓小的,最小可以抓最大的,有點像象棋規則,然後你要想辦法去猜出每個人大小,其中犧牲是少不了的,你知道了對方的號碼後,會用最快最大的聲音跟隊友通知,可能你抓到人,也可能被抓。然後你就要想辦法去抓數字比你小的人,當然,對方也是一樣。除了抓人之外,你也可以營救隊友,你只要有辦法在不被抓到的情況下,到達敵人的地盤上去Touch到隊友即可,是一個好玩又有趣的遊戲。
  • 跳格子、跳房子
  • 陀螺
  • 毽子
      這裡的毽子不可以花錢買的毽子,小時候沒有什麼飲料這種東西,家裡最好飲料是一種農會玻璃瓶米漿和豆漿,尤其是夏天,家裡一次叫都會叫好幾箱,而這種玻璃瓶米漿豆漿的蓋子跟玻璃啤酒或玻璃可樂一樣,就是我們拿來做毽子的材料。我們將蓋子打平,然後在中鐵釘打個洞,然後用塑膠繩穿過後打結,就可以拿來當毽子玩。
  • 竹蜻蜓
  • 飛盤
  • 尪阿標紙牌
      這個紙牌的玩法可是不輸撲克牌,可以使用上面的「車、馬、炮…」文字來玩,這種是類似象棋,還有一種是兩個人各拿出一半的紙牌,將紙牌疊在一起,然後會使用比較「粗」的紙牌來打那疊紙牌,其中第一個把最下面那一張打出來的人就可以贏得所有紙版。…還有一些不記得的玩法了,我想,這應該可以算是現在遊戲王紙牌遊的祖先了吧。
  • 橡皮筋
      這個玩法第一種跟紙牌很象,也是雙方各出一半的橡皮筋,然後疊起來,然後雙方每個人輪流射一次,將橡皮筋射出多少,就可以得到多少,如果你射的那條王陷在那疊橡皮筋中,那你那條王也算那一疊的其中一員,你就必須再拿一條出來射,誰射的多,誰就可以得到較多的橡皮筋。
      還有一種是跳高遊戲。小時候我們會把贏來的橡皮筋拿來做一條長長的像跳繩的橡皮筋,這條橡皮筋會拿來玩跳高。由兩個人個拿一邊,由雙腳踩到地上開始,讓人跳過去,然後慢慢升高,膝蓋、腰、腋下、肩膀、耳、頭頂,最後也是最難的是兩個人都將雙手高高舉直,記得規定上是到肩膀以上才可以碰到繩子。
  • 玻璃彈珠
  • 丟米包
  • 跳人馬
  • 123木頭人

  小偷

  之所以說這個遊戲的會歸類在「小偷」,實在是因為以現在社會的眼光,如果這些事件爆發(就是被抓到),一定可以上新聞、上頭條,然後就有一大堆人在罵:「我們的教育出了什麼問題?」不過我自己做過這種行為,我了解這種小朋友「小小偷心態」。小時候的我們,沒有任何壞意,只是一個不懂事的小朋友在做一件不應該做的事。只是單純的好玩,單純的童心。

  農村有一個好處,就是玩樂的地點非常的多樣,田野間、小河中、河堤旁、大樹上、大樹下、同學甲、乙、丙…的家裡,而且鄉間的農作物是非常多樣,記得,小時候會去偷挖地瓜、偷摘桃子、番石榴(芭樂),還有一次去蘭陽溪上遊,去偷抱西瓜。

  但我要說明一下,小朋友的我們通常是在現場偷摘一些吃吃,不會像現在是真的大偷,什麼是大偷?舉個例子,我家住宜蘭三星,而你一定聽過「宜蘭三星蔥」,三星蔥出了名後,如果在蔥價高漲時,就常有有小偷半夜開著卡車到蔥園,花可能不到幾個小時的時間,將蔥園一掃而空,將這些農民幸苦的成果,偷光光。真的是罪應萬死的人,雖然我家沒被偷過,但是這種人我也是非常恨他。

  紅白機

  任天堂的紅白機,它的地位應該不會少於現在Online Game,或是 Wii,但我很高興也很後悔,高興的是它讓我有超級瑪麗、沙羅曼蛇、魂鬥羅、勇者鬥惡龍、1943、三國誌…無數個回憶,只要你努力,「破關」決不是問題;但現在的我也很後悔,後悔一個「迷」字,為了它我不知道花了多少的時間,多少的精力,找出了三國誌裡可無限升級的「落鳳坡」,魂鬥羅裡升級30條生命的「上上、下下、左左、右右、BABA」,當你發現了一個全世界都不知道的特殊按鍵組合,那種成就感,沒錯,是很高,但玩這種遊戲機到一種「迷」時,回想過去真的是…荒廢人生。

  看到我身邊家族裡小學、國中、高中的小朋友,看到他們一個一個沉迷於線上遊戲,家族的長輩有時會請我用「大哥哥」的角色,請我們念念這些小朋友,但我真的不知道要如何開導他們,我小時候一個Game了不起玩幾個月,破關,除非有新遊戲,不然大概不會沉的那怎嚴重,但現在的Online Game是沒有破關這種東西,為了練功、為了等級,練到都沉到深海去,怎麼撈?現在的我或許要感謝小時候的那段經驗,老實說,現在的我對那種「不能破關」的遊戲跟本就一點興趣都沒有,只是花越來越久的時間在打同一隻怪,升那一等級,好無聊。或是換個心理學角度來說,可能是我小時候玩任天堂的"量",讓我的需求非常的滿足,所以長大成人後,不會產生這種沉迷遊戲的偏差。

  麥芽糖

  這個麥芽糖可是得來不易,小時候會有一個伯伯(台語發音),每週固定一個時間會來收破銅爛鐵,而我們小朋友可以拿破銅爛鐵去跟他換全世界最棒的零嘴:麥芽糖。我們會利用時間去到處去撿、收集、去跟人家要,然後收集起來,等到那一天的到來。他會騎著古早式腳踏車,這種腳踏車前面有個燈,前輪會有個發電設備(多先進的發明呀),後座會放著一個白色的鐵箱子,而當我們看到他打開箱子,拿出竹筷往裡面一插,轉一圈,吃著麥芽糖的心情我到現在都還能感受到。

  說到這腳踏車,也是有回憶,小時候很想學騎腳踏車,但因為這種古早式的腳踏車中間有一根鐵條,而我們都太小隻了,跨不過去,只好把一支腳由這鐵條中間的洞的穿過去,然後你就會看到一個小朋友「斜」著身體踩著腳踏車,而且還可以飛快的前進。還有,小時候好玩,不知道騎太快是無法轉彎的,有一次在過彎時,就整個人飛到河裡,頭破血流的回家。到現在我媽都還記得這件事。(其實我媽每次提起這件事時,我都裝忘記,其實我是記得的,只是不想承認。)

  註:古早式腳踏車可參考圖片:http://ifo.tainan.gov.tw/File/Publish/20077101641731.JPG

  爆米花

  如果你如我的年紀相當,你一定聽過這首歌:

爆米花

嗶嗶啵啵嗶啵啵 嗶嗶啵啵嗶啵啵
爆米花 爆米花 一顆玉米一朵花
兩顆玉米兩朵花 很多玉米很多花
有一顆玉米不開花 問一問它 
為什麼你呀不開花
嗶嗶啵啵嗶啵啵 嗶嗶啵啵嗶啵啵
爆米花 爆米花 一顆玉米一朵花
兩顆玉米兩朵花 很多玉米很多花
我們心裡也開花 美麗的花 
快樂的開心花
  如果你想聽原音的話,拜搜尋引擎及科技所賜,找一下關鍵字「爆米花 歌」就可以來段回憶。

  場景在大榕樹下,記得一樣是每週有個固定時間,一位伯伯(台語發音)會騎著改裝的機車,載著一根好像「火箭炮」的東西來爆米花,那時候的爆米花的材料很簡單,就是我們每戶人家準備一杓米(小時候都是使用像吃完的鳳梨罐頭之類容器來量米),伯伯會準備一塊板子,然後你就會看到大家會依來的先後順序將米排好,然後伯伯開始要爆米花。

  伯伯拿起米往那火箭炮裡倒進去,然後會問你要不要加花生,當然加花生是要加錢的。倒進去後他會把火箭炮口蓋起來,然後放到火上面燒,而火箭炮會在上面一直轉,等一會兒,也是小朋友們又愛又怕事,伯伯準備要開炮了,他拿著工具在那炮口,炮口前會有一個鐵網,伯伯喊著:來哦,來哦,來哦…「蹦」的一聲,一陣白煙後,鐵網裡一顆一顆飽滿白花花米粒就出現在鐵網裡,然後再經過麥芽糖加工,就成了繼麥芽糖之後,人間第二美味的零嘴。

  在我們的時候,麥芽糖有無比重要的地位,麥芽糖(麥芽糖餅乾也是一絕)就已經是我們最棒的零嘴了,或許是愛吃糖又不愛刷牙,才沒幾歲,牙齒就已經壞光光,為了保護剩下的牙齒,現在三餐飯後一定馬上刷牙,和任天堂時代一樣,當初的快樂,也是現在的後悔。

  最後我們來唱一首歌《抓泥鰍》,一樣如果你和我的年紀相當,一定會唱:
侯德健 詞/曲

池塘的水滿了,雨也停了!
田邊的溪泥地到處是泥鰍,天天我等著你
等著你抓泥鰍,大哥哥好不好咱們去抓泥鰍!
小牛的哥哥帶他去抓泥鰍,大哥哥好不好咱們去抓泥鰍!
小牛的哥哥帶他去抓泥鰍,大哥哥好不好咱們去抓泥鰍!
大哥哥好不好咱們去抓泥鰍?
  以上很多都是下課後學校不教的事,或許我談的這些已經是「回憶」,現在的世界已經失去太多東西,古人說:「前人種樹,後人乘涼。」但我們在進步的同時也許要好好想想:「我們失去了什麼?我們留下了什麼?」願我們都能給孩子有一個快樂的童年回憶。

  或許我的抬頭應該改成:不讀書、愛吃糖、沒牙齒的快樂童年,笑~^.^