 TechNet Magazine April 2008

TechNet Magazine April 2008

SQL Server 2008: 新功能

新版的 SQL Server 提供一籮筐的全新功能和增強功能，誓言提升效能、提高安全性，以及減輕資料庫管理員的工作負擔。本文將概略介紹 SQL Server 2008 幾項重大的變更，以及您可以從 SQL Server 2008 看到的未來。

Randy Dyess SQL Server 2008: 安全性

安全性一直是改進 SQL Server 的重心。本文將探索 SQL Server 2008 最重要的一些安全性變更，從加密和驗證方面的增強到原則式管理，以及協助達成法規需求的全新稽核系統。

Rick Byham SQL Server 2008: 全新的資料類型

SQL Server 2008 提供七種全新的內建資料類型，可讓您處理更複雜的資料，簡化結構化、半結構化，甚至是非結構化資料的管理工作。本文將深入探討這些新的資料類型，並了解如何運用它們來改善基礎結構中的資料管理工作。

Kelly Wilson SQL Server 2008: 資料倉儲查詢效能

SQL Server 2008 提供了更加強大的關聯式資料倉儲功能，邀您深入探索重要的效能相關資料倉儲功能，並了解您如何能夠利用這項全新的技術將查詢效能最佳化。

S. Agarwal, T. Grabs, and J. Hammer SQL Server: 盡可能減緩 SQL Server 中的封鎖情形

要支援同時讀寫資料庫，肯定少不了鎖定，雖說如此，封鎖也可能會拖累系統效能。讓我們一同來了解如何將 SQL Server 資料庫最佳化，以便將封鎖的情形減至最低，還有看看如何監視系統，以便更加了解鎖定對效能的影響。

Cherié Warren Microsoft Office: 整合 Access 資料庫與 SharePoint

許多企業仍舊仰賴 Microsoft Access，所幸，Microsoft Office SharePoint Server 2007 可讓您整合舊版的 Access 資料。一同來探索您要如何利用這些工具為貴公司建置全新的解決方案。

Peter Serzo 編輯的話: 向老朋友和新朋友致意

Joshua Hoffman 讀者來信: 讀者有話直說

工具箱: 適合 IT 專家的新產品

Greg Steen SQL 問答集: 擴大資料庫，使用 IFilters，以及從遠端連線

快來了解如何透過程式設計來擴大資料庫，學習如何使用 IFilters，以及探索支援遠端 SQL Server 連線的防火牆設定。

Edited by Matthew Graven 公用程式焦點: Web Capacity Analysis Tool

網頁記錄和流量分析可幫助您了解在經過一段時間之後可預期什麼樣的流量。但是您要如何確定基礎結構的處理能力？免費的 Web Capacity Analysis Tool 可協助您觀察系統在壓力下的執行狀況。

Greg Steen The Cable Guy: 疑難排解 NAP 強制的問題

為網路存取保護平台的強制行為排解疑難並不是件易事。Cable Guy 將為您解說 NAP 健康原則評估的運作，以及常見問題的疑難排解。

Joseph Davies Windows PowerShell: 請在此簽名

AllSigned 執行原則提供了最安全的 Windows PowerShell 環境。那麼您是如何簽署 Windows PowerShell 指令碼？Don Jones 將為您示範。

Don Jones 嗨，Scripting Guy！: 重返資料庫指令碼

資料庫很有可能存放著組織內最重要的資訊。本月的 The Scripting Guys 將向我們介紹如何使用 VBScript 迅速從資料庫讀取資訊，新增和移除記錄，甚至是以少少幾行程式碼來完成更新作業。

The Microsoft Scripting Guys 安全性監控: 我的 PII 在哪裡？

在有效保護個人識別資訊之前，您必須先了解這些資訊儲存在 PC 上的哪些地方。下面就來看看如何撰寫指令碼來尋找存放在電腦上的個人資料。這些指令碼所發掘的資料可能會讓您出乎意料。

Frank Simorjay 桌面檔案: 使用 WAIK 部署 Windows XP

Windows 自動化安裝套件是專為 Windows Vista 與 Windows Server 2008 而設計。但您知道嗎？它還能協助您部署 Windows XP 與 Windows Server 2003。 下文將教導您如何著手進行。

Wes Miller 現場筆記: 了不起的創舉

本文將探討新推出的 Microsoft Authorized Refurbisher (MAR) 計劃如何協助公司在將舊電腦翻新時，處理令人頭疼的軟體授權問題。

Neil Fawcett Windows 機密文件: 不管好壞，機會平等

為什麼在您移除程式時，解除安裝程式總要問：「您真的要移除這個共用檔嗎？」，下面就是 Raymond Chen 的解釋。

Raymond Chen


 SQL Server 2008: 新功能
SQL Server 2008 Randy Dyess

新功能
摘要:
  • 更有效的管理
  • 改進的效能和延展性
  • 更高的安全性和可用性
  • 適用於開發人員的變更

Microsoft 又再次發行全新版本的 SQL Server，誓言改善資料庫管理員的負擔。目前最新的版本是 SQL Server 2008，它所提供的各種新功能，
足以讓系統管理輕鬆好幾倍。
只要是用過 SQL Server® 2005 的資料庫管理員，都不難發現 SQL Server 2008 沿用了許多您在日常工作常用的功能，不過也很快會發現到這些工具都已經過改進。過去要在複雜的資料庫環境中使用各種功能，必須配合自訂或因應措施，但是以現有功能為基礎所建置的新功能，則不太需要這麼做。
SQL Server 2008 新功能所涵蓋的資料庫工作角色範圍之大，要一一分類實在不容易。我也是在體驗分類之後，才瞭解為什麼有些讀者會質疑我把明顯屬於類別 Z 的功能 X，歸到類別 Y 下。其實這只是反映觀點以及貴公司經營業務方式的不同。
我很了解使用資料庫的人常常覺得自己身兼數職，但我還是盡量將新功能分成下列一般類別：管理、延展性、效能、高可用性、安全性、開發，以及商務智慧。

有關管理的新功能
對於資料庫管理員 (像我也是) 來說，光是那些附加的管理功能，就足以把 SQL Server 2008 變成令人驚豔的新產品。全新的原則管理、多重伺服器查詢功能、組態伺服器，以及資料收集器/管理倉儲等，為那些經常負責管理大型複雜資料庫環境的資料庫管理員，提供了強大的新功能，這些環境可能有數十甚至數百部伺服器，上面並且有成百上千個資料庫。
SQL Server 2008 原則管理功能，之前在 Community Technology Previews (CTP) 中其實是稱為「陳述式管理架構」，它可以讓您針對一或多部資料庫伺服器建立和執行組態原則。透過這些原則，您可以確保每個目標伺服器和資料庫皆套用和維護標準的組態設定。[圖 1] 就是這項功能的範例。
Figure 1 資料和記錄檔位置最佳作法原則
Figure 1 資料和記錄檔位置最佳作法原則
原則是根據一組預先定義的 Facet 建立而成。每個 Facet 都包含 SQL Server 2008 組態設定和其他您可以控制的事件的子群組。要建立原則，必須將這些 Facet 與條件配對成組。條件是 Facet 屬性所允許的值、組態設定或是其他內含在 Facet 中的事件。
條件也是適合原則篩選器使用的值。假設您希望原則只針對特定的資料庫執行的話，可以建立一個含有該資料庫名稱的條件，然後將這項條件加入原則中。這麼一來，原則就只會套用到那個資料庫。相信我 — SQL Server 2008 原則聽起來可能很複雜，但試過之後就知道它其實很好用。
新的多伺服器互動和組態伺服器功能特別適合同時對多部伺服器執行查詢。您可以在 Management Studio 中註冊伺服器，然後將那些伺服器放在同一個群組下。當需要向群組中的所有伺服器執行原則或查詢時，只要在群組上按一下右鍵進行就行了。
另外還有一個優點，就是您可以設定這個功能，讓每部伺服器傳回一個結果集，或是將所有的結果集合併成一個大型結果集。您也可以指定是否要將伺服器和資料庫名稱作為結果的一部分，好讓您區分各部伺服器的結果。能夠將註冊的伺服器存放在組態伺服器上，而不是存放在個別 Management Studio 中，可說是一大優點。
另外一項不錯的全新管理功能是「資料收集器」。資料庫管理員通常需要從大量的伺服器收集管理資料，而許多 DBA 都已建立自己自訂的解決方案來進行這項工作。「資料收集器」是內建機制，可以減輕收集管理相關資料的工作負擔。有了它，您不但可以使用 SQL Server Agent 和 SQL Server Integration Services (SSIS) 建立一套架構來收集和存放資料，還可以用於錯誤處理、稽核和收集記錄。
它與協力廠商工具和自訂工作不同的是，大多數的資料庫管理員很容易就可以了解「資料收集器」，因為它是利用 SQL Server Agent 和 SSIS 建立一組工作和封裝，來處理資料的連線、收集和存放事宜 (如 [圖 2] 所示)。只要將這項資料存放到中央位置 (也就是所謂的 Management Warehouse)，您就可以透過一組 T-SQL 陳述式和 SQL Server 2008 Reporting Services 報告加以檢視和整理。有了這個中央資料存放區，分析和檢視資料庫環境的整體管理資料可說是簡單許多。
Figure 2 資料收集器磁碟使用量記錄檔
Figure 2 資料收集器磁碟使用量記錄檔

有關延展性的新功能
這幾年來，SQL Server 資料庫管理員發現他們的資料庫環境有不斷擴大的趨勢。隨著資料庫環境規模的擴增，您必須用新方法和新工具來達成滿足多數企業需求的延展性。SQL Server 2008 所推出的幾項新功能，正可助上一臂之力。
SQL Server 2008 具有內建壓縮可讓您壓縮資料庫檔案，以及與相對應的資料庫相關聯的交易記錄檔。SQL Server 2005 引進了在唯讀檔案或檔案群組壓縮資料的功能，但是這種形式的壓縮，只是利用 Windows® NTFS 的壓縮能力。而現在透過 SQL Server 2008，就可以同時進行資料列層級和頁面層級壓縮，提供您在資料檔案層級壓縮所沒有的優勢。
在資料列和頁面層級壓縮不但可縮小所需的資料空間量，另外還能減少所需的記憶體量，因為資料在記憶體中會持續保持壓縮狀態。記憶體中的壓縮資料可以增加記憶體的使用率，因而改進許多系統的延展性。
SQL Server 2008 也引進在備份層級進行壓縮的功能。雖然資料庫備份只能備份資料庫使用中的部分，但是這個部分也有好幾百 GB，甚至是好幾十 TB 之多。資料庫環境中的多 TB 備份檔案複本只要超過一個，就會佔用寶貴的儲存空間，這些空間其實可以更有效地運用。而 SQL Server 2008 可讓資料庫管理員壓縮他們的備份檔案，釋出部分空間，將它們運用到即時資料身上。
另外還有一項新功能 ─「資源管理員」。這項功能可讓您定義在執行期間，允許個別工作負載或一組工作負載使用的資源量。您可以透過「資源管理員」建立一個環境，讓許多不同的工作負載同時存在一部伺服器上，而不需要擔憂其中一項或多項工作負載會充斥伺服器，以及折損其他工作負載的效能。
這項功能的優點是讓您更有效地運用資料庫伺服器上可用的總資源量。[圖 3] 就是使用「資源管理員」來限制伺服器活動的範例。
Figure 3 Limit activity with the Resource Governor (Close Figure 3)
USE master
go

--Drop function
IF OBJECT_ID('rgclassifier_demo','Function') IS NOT NULL
DROP FUNCTION rgclassifier_demo
go

--Create a classifier function for report group
CREATE FUNCTION rgclassifier_demo() RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @group_name AS SYSNAME
  IF (USER_NAME() LIKE '%Launch_Demo%')
         SET @group_name = 'demogroup'
    RETURN @group_name
END
GO

--Drop workload group for anything coming from Management Studio
IF EXISTS (SELECT name FROM sys.resource_governor_workload_groups
  WHERE name = 'demogroup')
BEGIN
  DROP WORKLOAD GROUP demogroup
END
GO

--Create workload group
CREATE WORKLOAD GROUP demogroup
GO

--Register the classifier function with
--Resource Governor
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= dbo.rgclassifier_demo)
GO

--Alter the dbogroup workload group to only
--allow 10% of CPU for each workload request
ALTER WORKLOAD GROUP demogroup
WITH (REQUEST_MAX_CPU_TIME_SEC = 10)
GO

--Create a new resource pool and set a maximum CPU limit for all workloads.
IF EXISTS (SELECT name FROM sys.resource_governor_resource_pools
  WHERE name = 'pooldemo')
DROP RESOURCE POOL pooldemo
GO

CREATE RESOURCE POOL pooldemo
WITH (MAX_CPU_PERCENT = 40)
GO

--Configure the workload group so it uses the
--new resource pool.
ALTER WORKLOAD GROUP demogroup
USING pooldemo
GO

--Apply the changes to the Resource Governor
--in-memory configuration.
ALTER RESOURCE GOVERNOR RECONFIGURE
GO

有關效能的新功能
SQL Server 2008 提升了資料庫的整體效能。拜 SQL Server 2008 中的幾項新功能所賜，您可以控制和監視靠它們執行的資料庫和應用程式效能。
當每秒有大量交易要執行時，平常在這些交易期間發生的鎖定，可能會對資料庫應用程式的效能產生負面的影響。SQL Server 為了減少一個處理序所保有的鎖定總數，於是將鎖定從較小的資料列層級和頁面層級鎖定，擴大到大型資料表層級鎖定。但是有一點要注意的是，擴大鎖定的動作可能會導致一些問題。例如，單一交易可能會鎖定整個資料表，而阻止其他交易使用該資料表。
但是 SQL Server 2008 採用 SQL Server 2005 就有的資料表分割機制，在 SQL Server 引擎將鎖定擴大到資料表層級前，先擴大到磁碟分割層級。這個中間層級鎖定，可大幅減低鎖定擴大對每秒必須處理上百和上千交易的系統所造成的影響。
SQL Server 2008 提供了幾項全新的查詢處理器改進功能，以利查詢與分割的資料表進行互動。現在查詢最佳化工具可以在資料表層級只使用磁碟分割識別碼而不是磁碟分割機制，對磁碟分割執行查詢搜尋，就像對個別索引一樣。

有關高可用性的新功能
隨著資料庫環境漸形複雜，加上資料庫規模與日俱增，確保這些資料庫的可用性也變得越來越棘手。SQL Server 2008 仍然提供您過去為了達成高可用性所採用的熟悉機制，只是當中有些功能在 SQL Server 2008 中已經增強，同時也加了一些新功能。
很多系統管理員都是從 SQL Server 2005 開始實作資料庫鏡像以提高可用性。而 SQL Server 2008 則在資料庫鏡像的作法方面提供許多改進。舉例來說，過去資料庫鏡像在將交易記錄資料從主體資料庫移到鏡像資料庫時，有時候會產生相關的效能問題。為了因應這一點，SQL Server 2008 在資訊傳送到鏡像交易記錄加以強化之前就先進行壓縮，以減少從主體交易記錄移到鏡像交易記錄的網路資訊量。
您現在有能力可以修復主體上損毀的資料頁面。如果主體資料庫因為錯誤 823 和 824 而導致資料頁面損毀，該主體可以向鏡像伺服器要求取得這些資料頁面的全新複本。取得完好資料頁面的要求會自動進行，不會對目前正在存取主體資料庫的任何使用者產生任何影響。
另外一項新功能 ─ Hot Add CPU，則可讓您在資料庫伺服器增加新的 CPU，而不影響伺服器資料庫的可用性。不過，Hot Add CPU 還是有一些限制，因為它只能用在執行 64 位元的 Itanium 型 Windows Server® 2008 Enterprise Edition 或 Datacenter Edition，而且還必須安裝 Enterprise Edition 的 SQL Server 2008 才能使用它。

有關安全性的新功能
SQL Server 2005 是以資料加密的形式提供資料安全性。SQL Server 2008 推出兩種功能，大幅增進了加密功能：「可延伸金鑰管理」和「透明資料加密」。
「可延伸金鑰管理」可讓增強的結構，安全地儲存加密基礎結構所用的金鑰 — 不僅是在資料庫本身的內部，也包括協力廠商軟體模組中或含硬體安全性模組的資料庫外部。
「透明資料加密」是把加密當作資料庫的屬性，而不只是一行程式碼內的函數結果，藉此提高加密的彈性。如此一來，系統管理員在資料層級進行加密時，就不需要進行像資料庫結構和應用程式程式碼那麼多的變更。[圖 4] 中的程式碼說明了透過透明資料加密來加密資料庫的方法。
Figure 4 Using Transparent Data Encryption (Close Figure 4)
USE master;
GO

--Create a master key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YouWillNeedToCreateAStrongPassword';
GO

--Create a certificate to use with TDE
CREATE CERTIFICATE TDECERT WITH SUBJECT = 'TDECert'
GO

--Change to the database to encrypt
USE AdventureWorks
GO

--Create your database master key
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128 --Use a strong algorithm
ENCRYPTION BY SERVER CERTIFICATE TDECERT
GO

--Alter the database to encrypt it with the
--master database key
ALTER DATABASE AdventureWorks
SET ENCRYPTION ON
GO

開發人員所獲得的好處
直接蒙受 SQL Server 2008 利益的，不只是資料庫管理員而已。當中還有許多新功能是為了協助資料庫開發人員而設計。舉凡從幾項全新的 T-SQL 增強功能，到協助開發人員建立和利用資料庫查詢的新元件都是。
許多資料庫開發人員的工作都是負責建立查詢，以傳回應用程式所需的資料。您對 LINQ (Language Integrated Query) 工具可能不陌生，它可以讓資料庫開發人員使用以 Microsoft® .NET 為主的程式設計語言 (而不是標準的 T-SQL 陳述式)，對資料庫發出查詢。而 SQL Server 2008 則是提供全新的 LINQ to SQL 提供者，讓開發人員直接對 SQL Server 資料表和資料行發出 LINQ 命令，進一步強化 LINQ 的效能。這一點將可縮短建立新資料查詢所花的時間。
開發人員在針對資料庫進行開發工作時，會使用較高層級的物件來對應個別的資料庫資料表和資料行。這些物件又稱為實體，它們代表資料庫應用程式所需的資料，因此開發人員並不需要了解資料的實際儲存結構和資料庫的結構描述。現在全新的 ADO.NET Entity Framework 就容許開發人員使用這些實體來建立資料庫查詢。將基本資料庫結構抽象化，可以提高開發人員的效率。
SQL Server 2008 針對 T-SQL 提供了許多增強功能，讓資料庫開發人員更有效率。其中一例就是新的 MERGE 陳述式，它容許開發人員在插入資料之前，先檢查該資料是否存在。在執行 INSERT 陳述式之前進行這項檢查，可以更新資料。因此現在無需建立複雜的聯結，只要在單一陳述式就可以更新已經存在的資料，以及插入還不存在的資料。
此外，要將時間和日期資料與合併的 date/time 資料類型相區隔，也不那麼難了。SQL Server 2008 以兩種不同的資料類型，分別處理日期資料和時間資料。採用不同的資料類型可以提升許多查詢的效能，因為您不用再對資料執行任何作業，就可以將它用於查詢中。
資料庫開發人員在建立較新版的資料庫結構時，常常發現自己必須延伸資料庫的結構，才能實作對應的應用程式。而 SQL Server 2008 透過全新的空間資料類型，幫助您解決了這個問題。開發人員可以使用 GEOGRAPHY 和 GEOMETRY 這兩種空間資料類型，將位置特有的資料直接儲存到資料庫中，而不必配合其他標準資料類型來分解資料元素的格式。[圖 5] 的程式碼，就是一個簡單的空間資料表範例。
Figure 5 A simple spatial table (Close Figure 5)
IF OBJECT_ID ( 'Demo_SpatialTable', 'Table' ) IS NOT NULL
    DROP TABLE Demo_SpatialTable
GO

--Create table to hold spatial data
CREATE TABLE Demo_SpatialTable
    ( SpatialID int IDENTITY (1,1),
    SpatialInputCol geography,
    SpatialOutputCol AS SpatialInputCol.STAsText() )
GO

--Insert data into table
INSERT INTO Demo_SpatialTable (SpatialInputCol)
VALUES (geography::STGeomFromText('LINESTRING(47.656 -122.360, 47.656 -122.343)', 4326));

INSERT INTO Demo_SpatialTable (SpatialInputCol)
VALUES (geography::STGeomFromText('POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))', 4326));
GO

--View data to see that data has been converted and stored in col2
SELECT * FROM Demo_SpatialTable
儲存和利用大型二進位物件 (例如文件和媒體檔案)，是資料庫開發人員過去常碰到的問題。一般採用的方法是將檔案儲存到資料庫外面，只在資料庫裡面儲存一個連到外部檔案的指標。但是使用這種方法，必須記得在移動檔案時更新指標。
SQL Server 2008 則採用全新的 FILESTREAM 資料類型來處理這個問題。這種資料類型仍將檔案儲存在資料庫外面，但卻將資料視為資料庫的一部分，以保持交易的一致性。這麼一來，就可以使用共用檔案作業，同時繼續維持資料庫的效能和安全性優勢。

那麼商務智慧呢？
過去幾年來 SQL Server 的使用率不斷增加，有一大部分要歸功於商務智慧策的積極採納。其實 SQL Server 早就具備商務智慧功能，只是 SQL Server 2008 又另外發展出新的功能。
舉個例說，當資料存放在資料倉儲時，往往會因為 NULL 值而浪費空間。而存放 NULL 值的資料行，會佔用資料行所定義的資料大小上限的空間。也就是說，含上千 NULL 值的資料行其實沒有存放任何資料，就可能耗用許多 MB 的空間。
但是 SQL Server 2008 採用的疏鬆資料行，能夠在不佔用磁碟任何實體空間的情況下，儲存 NULL 值。由於疏鬆資料行並不會耗用實際的空間，因此包含疏鬆資料行的資料表，實際上可以超越 1,024 個資料行的限制。
SQL Server 2008 另外還推出一套新機制 ─「變更資料擷取」，用來管理需要載入資料倉儲裡面的增量變更。這項機制會擷取變更的資料，並將它置於一組變更資料表中。擷取更新、刪除和插入的資料，將它放在能夠輕鬆取用的儲存結構描述，可以增加從這些資料表載入的資料倉儲數量 — 這與必須建置自訂插入陳述式，試圖在更新資料倉儲之前，找出現有資料列變更的做法完全相反。

總結
本文只是簡單介紹 SQL Server 2008 所提供的各種好處。SQL Server 2008 不但提供了廣泛的全新功能，同時也更新現有的功能，減輕資料庫管理員和資料庫開發人員的負擔。最後要提的是，它也提供了遠優於過去的效能和延展性，以因應要求愈趨嚴苛的資料庫。

Randy Dyess 是 Solid Quality Mentors 的顧問，他擅長於 SQL Server OLTP 系統。Randy 是《TransactSQL Language Reference Guide》的作者，同時也是《MCTS Self-Paced Training Kit:Microsoft SQL Server 2005 Implementation and Maintenance (Exam 70-431)》和許多新聞雜誌文章的合作作者之一。Randy 另外還擔任北德州 SQL Server 使用者小組的專案主任暨 SQL Server MVP。他的部落格位於 blogs.solidq.com/EN/rdyess/default.aspx。
© 2007 Microsoft Corporation and CMP Media, LLC. 保留所有權利；未經允許，嚴禁部分或全部複製.


 SQL Server 2008: 安全性
SQL Server 2008 Rick Byham

安全性
摘要:
  • 加密方面的增強功能
  • 驗證方面的增強功能
  • 安全性稽核
  • 原則式管理

SQL Server 2008 所提供的許多新功能和增強功能，都是為了改進您資料庫環境的整體安全性而設計的。它添加了重要的加密和驗證功能，並引進一套全新的稽核系統，
幫助您呈報使用者行為，以及達成您的法規需求。
在本文中，我將概略介紹 SQL Server® 2008 安全性方面最重要的變更。其中一項您可能會先注意到的變更是，SQL Server 2005 介面區組態工具已被淘汰。介面區組態工具所提供的通訊協定選項，現在改由組態管理員工具提供。不過，要啟用和停用功能，現在必須使用全新的 SQL Server 2008 原則式管理架構來進行。

加密方面的增強功能
加密這一方面有兩大改進。首先，SQL Server 現在可以使用存放在外部協力廠商硬碟安全性模組上的加密金鑰。其次，儲存在 SQL Server 內的資料，現在可以在不影響連接到資料庫的應用程式的情況下進行加密。也就是說，資料庫系統管理員不需要修改現有的應用程式程式碼，便可以輕鬆地加密儲存在整個資料庫當中的全部資料。
第一項改進是透過全新的可延伸金鑰管理 (EKM) 功能達成，這項功能在 SQL Server 2008 的 Enterprise、Developer 和 Evaluation 版都有提供。EKM 可讓企業金鑰管理與硬體安全性模組 (HSM) 解決方案的協力廠商，在 SQL Server 註冊他們的裝置。這些裝置一經註冊，使用者即可使用儲存在這些模組上面的加密金鑰。
這些廠商甚至還可以開放這些模組內的進階加密功能 (例如金鑰老化和金鑰輪換)。在某些設定下，這麼做可以保護資料不受非系統管理員 (sysadmin) 群組成員的資料庫系統管理員存取。而且 T-SQL 密碼編譯陳述式也可以使用儲存在外部 EKM 裝置上的金鑰，來加密和解密資料。
另外一項新功能，亦即透明資料加密，讓您不必修改任何應用程式，就可以加密資料庫檔案。它會對資料和記錄檔案執行即時的 I/O 加密和解密作業。加密作業會用到資料庫加密金鑰 (DEK)，它是儲存在資料庫開機記錄中，以供修復期間使用。DEK 會透過儲存在伺服器的 Master 資料庫中的憑證獲得保護。[圖 1] 中的圖說明了達成透明資料加密的架構。
Figure 1 透明資料加密的架構
Figure 1 透明資料加密的架構
這非常適合保護靜止的資料。雖然幫助保護資料庫安全可以採取的預防措施不少，例如將機密資產加密起來，以及在資料庫伺服器周圍設立防火牆等，但是存放資料庫的實際媒體 (甚至是備份磁帶) 還是有其他的弱點。譬如惡意的使用者可以竊取該媒體，並且存取儲存的資料。
然而，透明資料加密可讓您加密資料庫中的機密資料，並且透過憑證，保護用來加密資料的金鑰。此舉有助貴公司遵守許多適當保護資料安全相關的法律、法規和業界指標。
透明資料加密可讓軟體開發人員使用進階加密標準 (AES) 和三重資料加密標準 (3DES) 加密演算法來加密資料。資料庫檔案的加密作業是在頁面層級進行，頁面在加密之前會先寫入磁碟，並且在稍後讀入記憶體時加以解密。啟用透明資料加密功能的資料庫備份檔案，也會使用資料庫加密金鑰進行加密。
若要還原已加密的資料庫，必須有權存取用來加密資料庫的憑證或非對稱金鑰。沒有憑證或非對稱金鑰，便不能還原資料庫。因此，請務必保有任何金鑰，因為您可能需要存取相關的備份。

驗證方面的增強功能
您可能已經知道，Kerberos 是一種網路驗證通訊協定，它提供一種高度安全的方式，相互驗證網路上的用戶端和伺服器實體 (或安全性主體)。Kerberos 可幫助使用者舒緩安全性漏洞，例如誘餌攻擊和攔截式攻擊。跟 Windows® NTLM 驗證比起來，Kerberos 除了更安全、更穩固之外，效能也更高。
若要使用 Kerberos 互相驗證連線，必須在 Active Directory® 中註冊 SQL Server 執行個體的服務主體名稱 (SPN)，而且在連線時，用戶端驅動程式也必須提供註冊的 SPN。在 SQL Server 2008 中，Kerberos 驗證已擴充到所有網路通訊協定，包括 TCP、具名管道、共用記憶體和虛擬介面卡 (Virtual Interface Adapter，VIA)。在預設的情況下，用戶端驅動程式會自動為它所連接的 SQL Server 執行個體推測正確的 SPN。為了提高安全性、控制能力，以及方便疑難排解，您也可以在連接字串參數中明確地指定 SPN。
網際網路資訊服務 (IIS) 已經不再提供對 ASP.NET、報表管理員或報表伺服器 Web 服務的存取。在 SQL Server 2008 中，Reporting Services 會透過一套支援 Windows 式和自訂驗證的全新驗證子系統，來處理所有的驗證要求。
Reporting Services 現在主控內建至 SQL Server Common Language Runtime (CLR) 的 Microsoft® .NET Framework 和 ASP.NET 技術，而且 Reporting Services 也使用作業系統 (OS) 的 HTTP.SYS 功能。報表伺服器包括了一個 HTTP 接聽程式，可接受導向您在伺服器設定期間所定義的 URL 和連接埠的要求。URL 的保留和註冊作業，現在皆直接由報表伺服器透過 HTTP.SYS 加以管理。

安全性稽核
SQL Server Audit 是一項全新的功能，它可讓您建立自訂的資料庫引擎稽核事件。這項功能使用擴充的事件來記錄資訊以進行稽核，而且它還提供您在各種伺服器和資料庫物件上啟用、儲存和檢視稽核所需的工具和程序。
SQL Server Audit 的速度也比 SQL Server Trace 快，而且 SQL Server Management Studio 讓建立和監視稽核記錄檔的工作更加簡單。您現在可以稽核到更細微的層級，針對個別的使用者擷取 SELECT、INSERT、UPDATE、DELETE、REFERENCES 和 EXECUTE 陳述式。此外，SQL Server Audit 也完全可以使用 T-SQL 陳述式 CREATE SERVER AUDIT 和 CREATE SERVER AUDIT SPECIFICATION 及其相關 ALTER 和 DROP 陳述式來編寫。
設定稽核的方法是建立稽核，然後指定要記錄稽核事件的位置。您可將稽核儲存到 Windows 安全性記錄檔、Windows 應用程式記錄檔，或是儲存到您指定位置的檔案中。接下來是為稽核命名，並設定它的特性，例如稽核檔案的路徑，以及它的大小上限。您也可以選擇在稽核失敗時，讓 SQL Server 關機。如果需要將稽核事件記錄到一個以上的位置，只要建立多個稽核就行了。
下一步是建立一或多個稽核規格。伺服器稽核規格會收集關於 SQL Server 執行個體的資訊，並且加入伺服器領域物件，例如登入和伺服器角色成員資格等。它也包括 Master 資料庫中所管理的資料庫資訊，像是存取資料庫的權利。在定義稽核規格時，必須指明由哪一個稽核接收監視的事件。您可以定義多個伺服器稽核和多個伺服器稽核規格，但是每一個伺服器稽核一次只能包含一個啟用的伺服器稽核規格。
您也可以建立資料庫稽核規格，來監視單一資料庫中的事件。您可以在稽核中加入多個資料庫稽核規格，但是一個伺服器稽核每次只能在每一個資料庫啟用一個資料庫稽核規格。
用於伺服器稽核規格的 SQL Server 稽核動作事件，會分成幾個相關稽核動作事件的集合。這些集合都會公開成稽核動作群組。在稽核規格中加入群組時，等於是監視該群組所包含的所有事件。比方說，現在有一個名叫 DBCC_GROUP 的稽核動作群組，它會公開 DBCC 命令。但是 DBCC 命令不能個別執行稽核。
伺服器可用的稽核動作群組共有 35 種，當中有一部分是彼此息息相關的。例如，SUCCESSFUL_LOGIN_GROUP、FAILED_LOGIN_GROUP 和 LOGOUT_GROUP。另外也有 AUDIT_ CHANGE_GROUP 稽核動作類型，可用來稽核稽核程序。
資料庫稽核規格也可以指定組成資料庫層級稽核動作群組的稽核動作事件群組。除了稽核動作群組之外，資料庫稽核規格還可以包含個別的稽核動作事件，來稽核資料操作語言陳述式。您可以設定這些事件來監視整個資料庫，或只監視特定的資料庫物件。例如，SELECT 稽核動作可用來稽核對單一資料表或整個結構描述的 SELECT 查詢。您也可以設定這些事件來監視特定的使用者或角色的動作 ─ 例如所有的 db_writers。
舉個例說，您可以使用 SELECT 稽核動作，來稽核使用者 Mary 或 FINANCE_DEPT 資料庫角色或公用資料庫角色對單一資料表的 SELECT 查詢。這個方法很明顯的提供了許多您建立稽核所需的彈性和控制能力。

相依性報告
相依性報告已透過全新的目錄檢視和全新的系統功能而獲得改良。如果您使用 sys.sql_expression_dependencies、sys.dm_sql_referencing_entities 和 sys.dm_sql_referenced_entities，便可以同時針對結構描述繫結和非結構描述繫結物件，報告跨伺服器、跨資料庫和資料庫 SQL 相依性。

全新的資料庫角色
msdb 資料庫所含的資料庫角色也有所變更。db_dtsadmin 角色重新命名為 db_ssisadmin，db_dtsltduser 角色重新命名為 db_ssisltduser，而 db_dtsoperator 角色則重新命名為 db_ssisoperator。在升級伺服器時，也會將舊版的角色作為新角色的成員加入，以支援回溯相容性。
除了這些變更之外，另外也加入了新的資料庫角色來支援新的 SQL Server 2008 功能。特別是 msdb 資料庫現在包含了伺服器群組的新角色 (ServerGroupAdministratorRole 和 ServerGroupReaderRole)、原則式管理 (PolicyAdministratorRole) 和資料收集器 (dc_admin、dc_operator 和 dc_proxy)。而且管理資料倉儲資料庫也包含了資料收集器的新角色 (mdw_admin、mdw_writer 和 mdw_reader)。

FILESTREAM 安全性
現在 SQL Server 包含對 FILESTREAM 儲存體的支援，因此 SQL Server 應用程式可以儲存檔案系統上的非結構化資料 (例如文件和影像)。換句話說，用戶端應用程式不但可以藉由串流 API 和檔案系統的效能而蒙受其利，同時在非結構化和相對應的結構化資料之間仍可保有交易一致性。
FILESTREAM 資料必須儲存在 FILESTREAM 檔案群組中 — 這是一個特別的檔案群組，內含的是檔案系統目錄，而不是實際的檔案。這些目錄叫做資料容器，它們為資料庫引擎儲存體和檔案系統儲存體之間提供了介面。
就安全性而言，FILESTREAM 資料也像任何其他資料一樣受到保護 — 權限是在資料表或資料行層級授與。唯一授有 FILESTREAM 容器的 NTFS 權限的帳戶，是 SQL Server 伺服器帳戶所執行的帳戶。當資料庫被開啟時，SQL Server 會限制對 FILESTREAM 資料容器的存取，若是使用 T-SQL 交易和 OpenSqlFilestream API 存取，則沒有此限。

原則式管理
SQL Server 2008 原則式管理為管理 SQL Server 提供了一套全新的系統。您可以建立原則來測試和報告許多 SQL Server 的層面，而且可在單一資料庫、SQL Server 的單一執行個體，或是您所管理的所有 SQL Server 上套用原則。
您可以透過原則式管理，測試 SQL Server 組態選項和許多安全性設定。而且還可以針對一些安全性設定來建立原則，以偵測不符合規定的資料庫伺服器，並採取行動強制它們遵守規定。
SQL Server 2008 也預設停用了一些不必要的功能，以盡可能降低遭到攻擊的可能性。您可以使用原則式管理，選擇性的啟用其他所需的功能。這樣就可以根據排程來評估組態，萬一發現組態設定與原則不符，就會收到警示。
原則式管理會將相關的屬性組合在一起，並將他們公開在稱為 Facet 的元件中。舉例來說，介面區組態 Facet 包含了特定遠端查詢、CLR 整合、Database Mail、OLE Automation、遠端 DAC、SQL Mail、Web 助理和 xp_cmdshell 的屬性。您可以建立一項原則，規定只啟用 CLR 整合，但停用所有其他的功能。您的原則可以包括複雜的條件陳述式，例如除非命名為 Customer_Repsonse，否則停用所有 SQL Server 執行個體上的 Database Mail。
原則建好之後，您就可以在所有伺服器上評估該原則，產生一份報告，告訴您哪些伺服器不符合規定。按下 [設定] 按鈕之後，就會以原則設定來設定所有不合格的執行個體。您也應該排定時間表，定期執行原則，來監視伺服器的狀態。Database Engine、Analysis Services 和 Reporting Services 都有提供介面區組態 Facet。
不過，有一點要特別注意，原則式管理並不適合作為強制安全性的機制。在大多數的情況下，具有充分權限的使用者可以發出有違原則或忽視原則的陳述式，並且進行可能違反安全性原則重新組態的動作。您應該將 SQL Server 2008 原則式管理當作是監視 SQL Server 安全性設定的助力。
Facet 在強制設定方面的能力，必須根據它們相關的 DLL 陳述式是否能在非自動認可模式下執行而定。Facet 有時候可以在 Database Engine 的執行個體上強制採用組態設定，但系統管理員仍然可以重新進行設定。有些 Facet 可以由伺服器觸發程序強制採用 — 這樣不但可以防止低權限的使用者變更設定，同時也可以降低系統管理員不慎變更設定的可能性。但是在這種情況下，系統管理員必須暫時停用原則才能變更設定。其他 Facet 只能報告屬性的狀態，但不能變更它。像是檢查對稱或非對稱金鑰的金鑰長度的原則就是一例 (如 [圖 2] 所示)。
Figure 2 對稱金鑰的 Facet
Figure 2 對稱金鑰的 Facet
絕大多數的資料庫物件類型都有可用的 Facet，當中許多都有安全性用途。比方說，登入 Facet 可判斷每個登入是否有強制採用密碼原則，而預存程序 Facet 則可偵測所有程序是否皆已加密。其他 Facet 還可以測試使用者、結構描述、密碼編譯提供者、符合通用準則和 C2 稽核的屬性。

Windows Server 2008
SQL Server 2008 已完全通過隨附啟用了防火牆的 Windows Server® 2008 的測試。現在正是評估如何設定防火牆設定的好時機。另外，Windows Server 2008 也提供使用者存取控制，這一點您在使用 Windows Vista® 時可能已經體驗過了。它會限制您身為系統管理使用者自動獲得的權限。這些功能都將影響到 SQL Server 的所有版本。

結論
安全性一直是改進 SQL Server 的重心。加密和驗證的增強提供了新的功能，而全新的稽核系統和 SQL Server 2008 原則式管理則提供新的工具，讓您監視符合安全性的狀態。

Rick Byham 於 1995 年加入 Microsoft，他在客戶支援服務部擔任 SQL Server 支援工程師一職，之後加入 Microsoft Learning 的 SQL Server 小組。他在 2003 年轉任 SQL Server 線上叢書小組的技術作家，目前負責安全性相關文件。您可以透過電子郵件與 Rick 聯絡：rick.byham@microsoft.com。


 SQL Server 2008: 全新的資料類型
SQL Server 2008 Kelly Wilson

全新的資料類型
摘要:
  • 全新的日期和時間資料類型
  • 以階層表示位置
  • 處理空間資料的兩種模型

當前的全球化經濟環境下，企業被迫不斷改用新類型的資料、應用程式和複雜的計算作業。SQL Server 2008 內建的七種全新資料類型
提供了各種途徑，幫助您處理和簡化較複雜資料的管理工作。

日期和時間
使用舊版 datetime 資料類型的 SQL Server® 使用者無法分別處理日期和時間資訊。不過，新推出的四種資料類型 — date、time、datetime2 和 datetimeoffset — 則一改這種情況，不但簡化了處理日期和時間資料的工作，還提供更多日期範圍、毫秒精確度、時區支援。新的資料庫應用程式應該以這些新的資料類型，取代舊版的 datetime。現在我們就來看看這些新版本。
Date 資料類型只會儲存日期而不會儲存時間元件。其範圍是 1000 年 1 月 1 日到 9999 年 12 月 31 日 (0001-01-01 到 9999-12-31)。每個 date 變數都必須具備 3 位元組的儲存空間，以及 10 位數的精確度。而資料類型的準確度限於一天。
[圖 1] 示範如何以 T-SQL 指令碼建立和初始化 Date 變數。@myDate1 變數是由格式化為 'MM/DD/YYYY' 的字串加以初始化。@myDate2 變數並未初始化，其值為 NULL。@myDate3 變數是初始化成當地電腦系統上的日期。變數的值隨時都可以使用 SELECT 或 SET 陳述式加以變更，如變更 @myDate2 值的範例所示。資料表中也可以建立 Date 資料行。[圖 2] 顯示如何建立含三個日期資料行的資料表。
Figure 2 Create a table with three date columns (Close Figure 2)
USE TempDB
GO

CREATE TABLE myTable
(
    myDate1 date,myDate2 date,myDate3 date
)
GO

INSERT INTO myTable
VALUES('01/22/2005',
       '2007-05-08 12:35:29.1234567 +12:15',
       GetDate())

SELECT * FROM myTable

--Results
--myDate1    myDate2    myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20
Figure 1 Create and initialize date variables in T-SQL scripts (Close Figure 1)
DECLARE @myDate1 date = '01/22/2005'
DECLARE @myDate2 date
DECLARE @myDate3 date = GetDate()

SELECT @myDate2 = '2007-05-08 12:35:29.1234567 +12:15'

SELECT @myDate1 AS '@myDate1',
       @myDate2 AS '@myDate2',
       @myDate3 AS '@myDate3'

--Results
--@myDate1   @myDate2   @myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20
Time 資料類型只會儲存時間，而不會儲存任何日期元件。它採用 24 小時制，因此支援的範圍是 00:00:00.0000000 到 23:59:59.9999999 (小時、分鐘、秒和毫秒)。您可以在建立資料類型時指定毫秒的精確度。預設的精確度是 7 位數，準確度是 100ns。精確度會影響所需的儲存空間大小，範圍不等，從最多 2 位數需要 3 個位元組，3 或 4 位數需要 4 個位元組，一直到 5 至 7 位數需要 5 個位元組。
[圖 3] 中的 T-SQL 指令碼說明的是，字串初始化值的隱含轉換對變數精確度所產生的影響。T-SQL 程式碼會先建立八個不同的時間變數，並將它們初始化成相同的值。每個變數的小數點精確度與其名稱一樣。比如說，@myTime3 的精確度是是小數點後三位。結果顯示，每一個 time 資料類型的精確度，都跟宣告它的小數點精確度一樣。不在範圍內的位數則會截斷。
Figure 3 Display time data type's variable precision (Close Figure 3)
DECLARE @myTime  time = '01:01:01.1234567 +01:01'
DECLARE @myTime1 time(1) = '01:01:01.1234567 +01:01'
DECLARE @myTime2 time(2) = '01:01:01.1234567 +01:01'
DECLARE @myTime3 time(3) = '01:01:01.1234567 +01:01'
DECLARE @myTime4 time(4) = '01:01:01.1234567 +01:01'
DECLARE @myTime5 time(5) = '01:01:01.1234567 +01:01'
DECLARE @myTime6 time(6) = '01:01:01.1234567 +01:01'
DECLARE @myTime7 time(7) = '01:01:01.1234567 +01:01'

SELECT @myTime  AS '@myTime',
       @myTime1 AS '@myTime1',
       @myTime2 AS '@myTime2',
       @myTime3 AS '@myTime3',
       @myTime4 AS '@myTime4',
       @myTime5 AS '@myTime5',
       @myTime6 AS '@myTime6',
       @myTime7 AS '@myTime7'

--Results
--@myTime          @myTime1   @myTime2    @myTime3     @myTime4
------------------ ---------- ----------- ------------ -------------
--01:01:01.1234567 01:01:01.1 01:01:01.12 01:01:01.123 01:01:01.1235
--
--@myTime5       @myTime6        @myTime7
---------------- --------------- ----------------
--01:01:01.12346 01:01:01.123457 01:01:01.1234567

DROP TABLE myTable
您可將 time 資料類型建成資料表中的一個資料行。[圖 4] 中的 DROP TABLE myTable T-SQL 指令碼建立了一個名叫 myTable1 的資料表，並在資料表中新增三個時間資料行。資料表中接著會插入一筆記錄，而資料表的內容會以 SELECT 陳述式顯示。
Figure 4 Create myTable1 (Close Figure 4)
USE TempDB
GO

CREATE TABLE myTable1
(
    myTime1 time(1),
    myTime2 time(2),
    myTime3 time(3)
)
GO

INSERT INTO myTable1
VALUES('01:30:01.1234567',
       '02:34:01.1234567',
       '03:01:59.1234567')

SELECT * from myTable1

--Results
--myTime1    myTime2     myTime3
------------ ----------- ------------
--01:30:01.1000000 02:34:15.1200000 03:01:59.1230000

DROP TABLE myTable1

Datetimeoffset 和 Datetime2
Datetimeoffset 資料類型提供時區的感知能力。Time 資料類型並不包含時區，因此只能用於當地時間。然而，礙於全球化的經濟體制，往往有必要知道世界某地區與其他地區的時間關聯性。時區的偏差值是以 + 或 - hh:mm 表示。
這段程式碼會建立 datetimeoffset 變數，並將它初始化成時間值 8:52 A.M.。太平洋標準時間：
DECLARE @date DATETIMEOFFSET = '2007-11-26T08:52:00.1234567-08:00'
PRINT @date
--Results
--2007-11-26 08:52:00.1234567 -08:00
初始化 datetimeoffset 變數 (指令碼中的 @date) 的字串是經過特別的格式化，從最大量的元素依序排到最小量。它以一個大寫字母 T 分隔日期和時間元素，以負號區隔時間元素與時區，負號與時間或時區元素之間沒有空格。此格式是 datetimeoffset 資料類型所支援的兩種 ISO 8601 格式之一 (ISO 8601 是表示日期和時間值的一種國際標準)。
指定時間元件精確度的方式就跟 time 資料類型一樣，若未指定的話，會預設為相同的七位數。支援的範圍是一樣的。
Datetime2 資料類型是原始 datetime 類型的延伸，它支援的資料範圍較廣，毫秒精確度也比較高，而且還您指定精確度。datetime2 類型的資料範圍是 0001 年 1 月 1 日至 9999 年 12 月 31 日，與原始 datetime 的範圍 (從 1753 年 1 月 1 日至 9999 年 12 月 31 日) 不同。跟 time 類型一樣，它也提供七位數的毫秒精確度。原始的 datetime 類型提供三位數的精確度，以及 00:00:00 至 23:59:59.999 的時間範圍。下面我們將說明如何建立 datetime2 變數，並將它初始化成當地伺服器日期和時間：
DECLARE @datetime2 DATETIME2 = GetDate();
PRINT @datetime2

--Results
--2007-11-26 09:39:04.1370000
接下來我要探討的是全新的 hierarchyid 資料類型。這個資料類型處理的是資料表中各資料元素之間的關聯性，而不是處理特定的日期或時間資料。

Hierarchyid 資料類型
Hierarchyid 資料類型可讓您在資料表的各個資料元素之間建構關聯性，特別是以階層來表示位置。讓我們先使用 [圖 5] 中的指令碼建立 MyCompany 資料庫，然後填入員工資料，來探索這個資料類型。
Figure 5 Create and populate the MyCompany database (Close Figure 5)
USE MASTER
GO

CREATE DATABASE MyCompany
GO
USE MyCompany
GO

--Create a table called employee that will store
--the data for the employees for MyCompany.

CREATE TABLE employee
(
    EmployeeID int NOT NULL,
    EmpName    varchar(20) NOT NULL,
    Title      varchar(20) NULL,
    Salary     decimal(18, 2) NOT NULL,
    hireDate   datetimeoffset(0) NOT NULL,
)
GO

--These statements will insert the data for the employees of MyCompany.

INSERT INTO employee
VALUES(6,   'David',  'CEO', 35900.00, '2000-05-23T08:30:00-08:00')

INSERT INTO employee
VALUES(46,  'Sariya', 'Specialist', 14000.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(271, 'John',   'Specialist', 14000.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(119, 'Jill',   'Specialist', 14000.00, '2007-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(269, 'Wanida', 'Assistant', 8000.00, '2003-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(272, 'Mary',   'Assistant', 8000.00, '2004-05-23T09:00:00-08:00')
GO
--Results
--EmployeeID  EmpName Title      Salary   hireDate
------------- ------- ---------- -------- --------------------------
--6           David   CEO        35900.00 2000-05-23 08:30:00 -08:00
--46          Sariya  Specialist 14000.00 2002-05-23 09:00:00 -08:00
--271         John    Specialist 14000.00 2002-05-23 09:00:00 -08:00
--119         Jill    Specialist 14000.00 2007-05-23 09:00:00 -08:00
--269         Wanida  Assistant  8000.00  2003-05-23 09:00:00 -08:00
--272         Mary    Assistant  8000.00  2004-05-23 09:00:00 -08:00
[圖 6] 顯示最後產生的是內含一個員工資料表的簡單資料庫。MyCompany 資料庫中的這個員工資料表並沒有任何既定的結構。這在關聯式資料庫中並不罕見，因為結構是由應用程式透過其查詢和處理程式碼，以動態方式實施。
Figure 6 MyCompany 員工資料表
Figure 6 MyCompany 員工資料表
不過，商務資料一般則具有某種繼承結構。例如，每種業務都有一個報告結構，像是 [圖 7] 中所示的 MyCompany。MyCompany 的所有員工皆上呈 David，即 CEO。有些員工是直接報告，如 Jill 便是。其他人 (如 Mary) 則是透過媒介來報告。以程式設計的術語來說，MyCompany 的報告結構是稱為樹狀結構，正如其外觀所示。David 在最上層，不向任何人報告，他是父系或是上階。下面是向 David 報告的員工，這類節點稱為子系或子代。David 可以擁有任意數量的子代來代表他的直屬部下。
Figure 7 MyCompany 的組織結構
Figure 7 MyCompany 的組織結構
[圖 8] 中的指令碼是使用 hierarchyid 資料類型重建 MyCompany 資料庫，建構與 MyCompany 的報告結構相符的關聯性。首先，它以 ALTER TABLE 陳述式新增 hierarchyid 類型的資料行。接著再以 hierarchyid 的 GetRoot 方法，插入 David 的節點。隨後再以 GetDescendant 方法，將 David 的直屬新增到樹狀結構中。
Figure 8 Rebuild the database using hierarchyid (Close Figure 8)
DELETE employee
GO
ALTER TABLE employee ADD OrgNode hierarchyid NOT NULL
GO

DECLARE @child hierarchyid,
@Manager hierarchyid = hierarchyid::GetRoot()

--The first step is to add the node at the top of the
--tree. Since David is the CEO his node will be the
--root node.

INSERT INTO employee
VALUES(6,   'David',  'CEO', 35900.00,
       '2000-05-23T08:30:00-08:00', @Manager)

--The next step is to insert the records for
--the employees that report directly to David.

SELECT @child = @Manager.GetDescendant(NULL, NULL)

INSERT INTO employee
VALUES(46,  'Sariya', 'Specialist', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(@child, NULL)
INSERT INTO employee
VALUES(271, ‚John',   ‚Specialist', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(@child, NULL)
INSERT INTO employee
VALUES(119, ‚Jill',   ‚Specialist', 14000.00,
       ‚2007-05-23T09:00:00-08:00', @child)

--We can now insert the employee that reports to
--Sariya.
SELECT @manager = OrgNode.GetDescendant(NULL, NULL)
FROM employee WHERE EmployeeID = 46

INSERT INTO employee
VALUES(269, ‚Wanida', ‚Assistant', 8000.00,
       ‚2003-05-23T09:00:00-08:00', @manager)

--Next insert the employee that report to John.
SELECT @manager = OrgNode.GetDescendant(NULL, NULL)
FROM employee WHERE EmployeeID = 271

INSERT INTO employee
VALUES(272, ‚Mary',   ‚Assistant', 8000.00,
       ‚2004-05-23T09:00:00-08:00', @manager)
GO
資料庫記錄一加入，還有階層一建構好，就可以使用像下面這樣的查詢來顯示員工資料表的內容：
SELECT EmpName, Title, Salary, OrgNode.ToString() AS OrgNode
FROM employee ORDER BY OrgNode
GO
--Results
--EmpName  Title      Salary    OrgNode
---------- ---------- --------- -------
--David    CEO        35900.00  /
--Sariya   Specialist 14000.00  /1/
--Wanida   Assistant  8000.00   /1/1/
--John     Specialist 14000.00  /2/
--Mary     Assistant  8000.00   /2/1/
--Jill     Specialist 14000.00  /3/
OrgNode 是 hierarchyid 資料行，結果當中的每個正斜線 / 字元，都代表階層樹狀結構當中的一個節點。David 位於根目錄，以一個正斜線表示。Sariya、John 和 Jill 都向 David 報告，而且有兩個正斜線標記，表示他們是階層中的第二個節點。數字 1、2 或 3 代表各個子節點的順序。這個系統彈性很大，必要時，可以移除、插入或新增子節點。比方說，假設我們在 John 和 Jill 之間加入一名員工，該名員工在結果當中的表示法就是：/2.1/.
比方說，如果要回答「誰向 Sariya 報告？」這個問題，可以使用下列 T-SQL 程式碼建立如下所示的查詢：
DECLARE @Sariya hierarchyid

SELECT @Sariya = OrgNode
FROM employee WHERE EmployeeID = 46

SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee
WHERE OrgNode.GetAncestor(1) = @Sariya
GO
--Results
--EmpName Title     Salary  OrgNode
--------- --------- ------- -------
--Wanida  Assistant 8000.00 /1/1/
該項查詢是使用 hierarchyid 的 GetAncestor 方法，這個方法會傳回目前 hierarchyid 節點的父系。在前一段程式碼中，@Sariya 變數是設為 Sariya 的階層節點。這是因為 Sariya 是所有向她報告的員工的直屬上階。因此，如果要編寫一個查詢，傳回直接向 Sariya 報告的員工，其步驟包括從樹狀結構擷取 Sariya 的節點，然後選取其上階節點是 Sariya 的節點的全部節點。
Hierarchyid 資料行通常極為精簡，因為在樹狀結構中表示節點所需的位元數，會視節點的平均子系數目而定 (一般稱為節點的 Fanout)。例如，在有 100,000 名員工的組織階層中具有平均六層 Fanout 的新節點，可能要耗用五個位元組來儲存。
Hierarchyid 資料類型提供的數種方法，可以更有效的處理階層化資料。[圖 9] 顯示了這些方法的摘要。有關所有方法的詳細資訊，可在《SQL Server 線上叢書》(msdn2.microsoft.com/ms130214) 取得。
Figure 9 Methods provided by the hierarchyid data type (Close Figure 9)

方法 | 描述
GetAncestor | 傳回代表此 hierarchyid 節點第 n 個上階的 hierarchyid。
GetDescendant | 傳回此 hierarchyid 節點的子節點。
GetLevel | 傳回在整體階層中代表此 hierarchyid 節點深度的整數。
GetRoot | 傳回此階層樹狀結構的根 hierarchyid 節點。靜態。
IsDescendant | 若傳入的子節點是此 hierarchyid 節點的子代，則傳回 true。
Parse | 將階層的字串表示轉換成 hierarchyid 值。靜態。
Reparent | 將階層的節點移到階層內的新位置。
ToString | 傳回內含此 hierarchyid 的邏輯表示的字串。

空間資料類型
空間資料是指識別地理位置和形狀 (主要是地球上) 的資料，包括景點、道路，甚至是營業地點。SQL Server 2008 提供了 geography 和 geometry 資料類型來處理這類的資料。
Geography 資料類型是處理圓面地球 (round-earth) 資訊。圓面地球模型會將地球的曲面列入它的計算考量當中。定位資訊是以經度和緯度表示。這個模型非常適合一些會參考地球表面的應用程式，諸如海外貨運、軍事規劃和短程應用程式等。如果您的資料是以經緯度儲存的話，這正是您該使用的模型。
Geometry 資料類型則是採用平面地球或平面模型。這種模型是將地球視為從已知點開始的平面投影。平面地球模型並不會將地球的曲面列入考慮，因此它主要是用於描述短程距離 — 例如在資料庫應用程式中對應建築的內部。
Geography 和 geometry 類型是從向量物件建構而成，以 Well-Known Text (WKT) 或 Well-Known Binary (WKB) 格式指定。這些是 Open Geospatial Consortium (OGC) Simple Features for SQL Specification 所描述的空間資料的傳輸格式。[圖 10] 所列的是 SQL Server 2008 支援的七種向量物件。
Figure 10 Vector objects supported by SQL Server 2008 (Close Figure 10)

物件 | 描述
Point | 地點。
MultiPoint | 一連串的點。
LineString | 由線條連接的一連串零或多個點。
MultiLineString | 一組 linestring。
Polygon | 由一組封閉的 linestring 所描述的相鄰區域。
MultiPolygon | 一組多邊形。
GeometryCollection | geometry 類型的集合。
若要使用一或多個向量物件建構 geography 類型，必須先在 T-SQL 指令碼中宣告 geography 類型，如 [圖 11] 所示。接著呼叫 [圖 12] 所列的其中一個方法，然後傳遞向量物件的字元字串和空間參考識別碼 (Spatial Reference ID，SRID)。SRID 是空間參考識別系統，由 European Petroleum Survey Group 定義而成。它是針對儲存製圖學、測量和測地學資料所開發的一組標準的其中一部分。每個 SRID 都會識別一個特定類型的橢面，用於地理位置計算當中。之所以這麼做，是因為地球並不是完美的球體。SQL Server 2008 只能對相同的 SRID 執行計算。
Figure 12 Construct objects for geography and geometry (Close Figure 12)

方法 | 描述
STGeomFromText | 從輸入文字建構任何類型的 geography 例項。
STPointFromText | 從輸入文字建構一個 geography Point 例項。
STMPointFromText | 從輸入文字建構一個 geography MultiPoint 例項。
STLineFromText | 從輸入文字建構一個 geography LineString 例項。
STMLineFromText | 從輸入文字建構一個 geography MultiLineString 例項。
STPolyFromText | 從輸入文字建構一個 geography Polygon 例項。
STMPolyFromText | 從輸入文字建構一個 geography MultiPolygon 例項。
STGeomCollFromText | 從輸入文字建構一個 geography GeometryCollection 例項。
Figure 11 Create points, lines, and polygon geometry (Close Figure 11)
DECLARE @geo1 geometry
SELECT @geo1 = geometry::STGeomFromText('POINT (3 4)', 0)
PRINT @geo1.ToString()

DECLARE @geo2 geometry
SELECT @geo2 = geometry::Parse('POINT(3 4 7 2.5)')
PRINT @geo2.STX;
PRINT @geo2.STY;
PRINT @geo2.Z;
PRINT @geo2.M;

DECLARE @geo3 geography;
SELECT @geo3 = geography::STGeomFromText(
    'LINESTRING(47.656 -122.360, 47.656 -122.343)', 4326);
SELECT @geo3.ToString();

--Results
--POINT (3 4)
--3
--4
--7
--2.5

DECLARE @gx geometry;
SET @gx = geometry::STPolyFromText(
    'POLYGON ((5 5, 10 5, 10 10, 5 5))', 0);
PRINT @gx.ToString();
--Results
--POLYGON ((5 5, 10 5, 10 10, 5 5))

Geography 和 Geometry 的差異
Geography 和 geometry 資料類型各自處理不同類型的資料，因此必須注意一些重大的差別。如果是使用 geometry 資料類型，則距離和面積的測量單位與例項的座標一樣。比如說，點 (0,0) 和 (6,8) 之間的距離永遠是 10 個單位。但 geography 類型就不同了，它使用的是以經緯度表示的橢面座標。
如果座標是以經緯度組表示，GEOMETRY 資料類型就會傳回前後不一致的結果。下面的 T-SQL 程式碼會計算點 (90 0) 和 (90 180) 之間的距離。這兩個點都是指北極，因此之間的距離應該是 0。如果是使用 GEOMETRY，計算出的距離是 180。
DECLARE @g1 GEOMETRY, @g2 GEOMETRY, @g3 GEOGRAPHY, @g4 GEOGRAPHY
SELECT @g1 = GEOMETRY::STGeomFromText('POINT (90 0)', 0)
SELECT @g2 = GEOMETRY::STGeomFromText('POINT (90 180)', 0)

SELECT @g3 = GEOGRAPHY::STGeomFromText('POINT (90 0)', 4326)
SELECT @g4 = GEOGRAPHY::STGeomFromText('POINT (90 180)', 4326)
SELECT @g2.STDistance(@g1) AS 'GEOMETRY',
       @g4.STDistance(@g3) AS 'GEOGRAPHY';

--Results
--GEOMETRY               GEOGRAPHY
------------------------ ----------------------
--180                    0
這兩種資料類型的空間資料方向也有所不同。在 geometry 資料類型所採用的平面系統中，多邊形的方向並不重要。舉例來說，座標為 ((0, 0), (10, 0), (0, 20), (0, 0)) 的多邊形，跟 ((0, 0), (0, 20), (10, 0), (0, 0)) 的多邊形並無不同。但是在 geography 資料類型所使用的資料模型中，如果沒有指定方向，多邊形就會模糊不清。以赤道圈為例，這個赤道圈所描述的多邊形，指的是北半球還是南半球呢？重點是，在使用地理位置資料時，必須精確的描述方向和地點。
SQL Server 2008 對 geography 資料類型還有其他一些限制。例如，每個地理位置例項必須容納在一個半球內。另外，它也不接受大型的空間物件，大型空間物件會產生 ArgumentException。如果這些方法得出的結果不能容納在一個半球內，則要求兩次輸入的 Geography 資料類型，便會傳回 NULL。
SQL Server 提供好幾種方法，允許在 geography 和 geometry 例項上執行一些作業。[圖 13] 是使用 SQL Server 2008 提供的方法來處理空間資料的幾個範例。礙於篇幅，我無法深入探討這個主題，但是您可以在《SQL Server 線上叢書》中找到完整的說明。
Figure 13 Working with spatial data (Close Figure 13)
DECLARE @gm geometry;
DECLARE @gg geography;
DECLARE @h geography;

SET @gm = geometry::STGeomFromText('POLYGON((0 0, 13 0, 3 3, 0 13, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @gm.STArea();

--Results
--38

SET @gg = geography::STGeomFromText('LINESTRING(0 0, 5 5)', 4326);
--Calculate the distance to a point slightly offset from the LINESTRING.
SET @h = geography::STGeomFromText('POINT(4 4)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 430.182777043046

--Calculate the distance to a point on the LINESTRING.
SET @h = geography::STGeomFromText('POINT(5 5)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 0

DECLARE @temp table ([name] varchar(10), [geom] geography);

INSERT INTO @temp values ('Point', geography::STGeomFromText('POINT(
5 10)', 4326));
INSERT INTO @temp values ('LineString', geography::STGeomFromText(
'LINESTRING(13 5, 50 25)', 4326));
--Calculate the distance to a point on the LINESTRING.
--Display the number of dimensions for a geography object stored in a --table variable.
INSERT INTO @temp values ('Polygon', geography::STGeomFromText(
'POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))', 4326));

SELECT [name], [geom].STDimension() as [dim]
FROM @temp;

--Results
--name       dim
------------ -----------
--Point      0
--LineString 1
--Polygon    2
希望這些關於 SQL Server 2008 七種新資料類型的資訊對您有所幫助。

Kelly Wilson 投入軟體工程已超過 20 年的時間，她的貢獻包括 SQL Server 的應用程式、3D 圖形、遊戲和色彩科學。Kelly 目前在 Microsoft 的 SQL Server 小組擔任程式設計作家。


 SQL Server 2008: 資料倉儲查詢效能
SQL Server 2008 Sunil Agarwal and Torsten Grabs and Dr. Joachim Hammer

資料倉儲查詢效能
摘要:
  • 星狀聯結查詢最佳化
  • 分割資料表平行處理
  • ROW 和 PAGE 壓縮
  • 對齊磁碟分割的索引檢視

SQL Server 2008 將提供比它先前的版本更加強大的關聯式資料倉儲功能，但您可能還是會納悶要如何運用這項新技術來建置執行順利的資料倉儲，對上億的資料行提供決策支援。或者您可能想要知道哪些功能將有助您達成支援決策查詢和報告的最佳查詢效能，或是這個新版的 SQL Server® 預計實際上會提供什麼樣的效能提升。
隨著實際發行日的腳步漸近，相關的疑問也跟著此起彼落。我們希望在此深入探討 SQL Server 2008 中一些最重要的效能相關資料倉儲功能，將幫助您做好萬全的準備。

邏輯資料庫設計：維度模型
交易企業營運系統應用程式通常都有正規化的資料庫結構描述。關聯式資料倉儲的邏輯資料庫結構描述設計則比較不注重正規化。如今的許多關聯式資料倉儲設計都採取維度模型的方法，這套方法是因 Ralph Kimball 和 Margy Ross 的著作《The Data Warehouse Toolkit:The Complete Guide to Dimensional Modeling》而聲名大噪。
如果您花了很多時間處理資料倉儲，想必對關聯式資料倉儲的常見結構描述模式 (例如星狀和雪花式結構描述) 應該不陌生。維度模型會將維度資料表與事實資料表相加區別。您的維度資料表是保存主資料 (例如產品、客戶、商店或國家 / 地區) 的資料表，而事實資料表則用來存放交易資料 (例如銷售、訂單、採購或退貨)。
維度資料表與事實資料表是以主索引鍵 (PK)/外部索引鍵 (FK) 的關聯性相互連結起來。您會注意到，很多資料倉儲並沒有強制 FK 限制，從而縮小儲存需求。不但可減小基礎索引的儲存負擔，也能降低事實資料表的維護成本。資料倉儲中的維度資料表通常很小，一般可容納數千或多達數百萬的資料列。相較來看，事實資料表可能很大，存有上億至數十億的資料列。因此，邏輯設計真的應該特別注意事實資料表的儲存需求。
此一大小因素也意味著您應該根據維度資料表，判斷應選擇什麼索引鍵，來維護事實資料表/維度資料表的關聯性。以維度的商務索引鍵為主的複合索引鍵 — 也就是維度所代表的實體的真實世界識別碼 — 通常涵蓋了數個資料行。您應該要曉得，這對事實資料表中相對應的外部索引鍵會造成問題，因為事實資料表的每個資料列都將重複多個資料行的複合索引鍵。
應付這個問題有個常見的作法，您可以使用小型的 Surrogate 索引鍵來實作事實資料表及其維度之間的關聯性。Surrogate 索引鍵是一種整數類型的識別資料行，可作為維度資料表假造的主索引鍵。也因為事實資料表參考了較小的 Surrogate 索引鍵，大型事實資料表的儲存需求因此大幅降低。[圖 1] 顯示使用維度和事實資料表搭配 Surrogate 索引鍵的維度模型資料倉儲結構描述。
Figure 1 含一個事實資料表和兩個維度資料表的星狀結構描述範例
Figure 1 含一個事實資料表和兩個維度資料表的星狀結構描述範例
雪花式結構描述設計會將一或數個維度分散到多個層級 (例如，某客戶維度的客戶、國家和地區)，因此可將資料當中有過度冗餘的較大型維度正規化。層級是由不同的資料表表示，使結構描述具備了雪花的形狀。另一方面，星狀結構描述設計則完全不會將它的維度分散到資料表上。星狀結構描述具備著星星的形狀，當中的維度資料表是以事實資料表為中心在周圍形成群組。
根據以維度作為模型的星狀結構描述或雪花式結構描述，其決策支援查詢遵循著一套典型的模式：查詢從事實資料表選取幾個感興趣的量值，將事實資料列與一或數個維度連同 Surrogate 索引鍵相聯結，在維度資料表的商務資料行上放置篩選器述詞，根據一或數個商務資料行分組，然後經過一段時間後彙總事實資料表擷取到的量值。下面示範了這種模式，這種模式也稱為星狀聯結查詢：
select ProductAlternateKey,
CalendarYear,sum(SalesAmount)
from FactInternetSales Fact
     join DimTime
on Fact.OrderDateKey = TimeKey
     join DimProduct
on DimProduct.ProductKey =
   Fact.ProductKey
where CalendarYear between 2003 and 2004
      and ProductAlternateKey like 'BK%'
group by ProductAlternateKey,CalendarYear

實體設計
在您的關聯式資料倉儲中，有許多 SQL 查詢都是遵循星狀聯結查詢的結構。儘管如此，決策支援查詢通常還是會隨時間因決策者持續不斷想要以新方法更加了解他們的基本商務資料而發生變化。正因為如此，資料倉儲的工作負載也傾向於擁有高比例的特定查詢。這使得決策支援查詢和維度模型資料倉儲結構描述的實體設計充滿挑戰。
在 SQL Server 中，資料倉儲設計人員通常是先從藍圖或實體設計著手，然後應工作負載的變化微調、修整。您應該針對自己的資料倉儲環境採納和更改這個藍圖。在這麼做的時候，千萬別忘了資料庫實體設計的最佳作法，例如針對更新進行索引維護所產生的效能衝擊以及索引的儲存需求。

事實資料表
藍圖設計的目的是要預估典型的星狀查詢的形狀，並根據事實資料表來建置索引。事實資料表的叢集索引採用了數個維度 Surrogate 索引鍵資料行 (外部索引鍵資料行) 作為索引鍵。最常用的資料行應該會出現在索引鍵清單中。您應該花點時間，確認這的確為您工作負載當中最常執行的查詢提供了良好的存取路徑。
此外，藍圖還會為事實資料表中的每個維度 Surrogate (外部索引鍵) 資料行建立單一資料行的非叢集索引。這可為其中一個維度選擇性高的查詢提供高效的存取路徑。
叢集索引的目標是要為您工作負載當中的絕大多數查詢提供良好的效能。非叢集索引則是以擷取特定客戶或產品的事實資料表量值的查詢為目標。比方說，這些非叢集索引讓您在擷取單一客戶的銷售資料時，不用掃描事實資料表。

維度資料表
將藍圖設計套用到維度資料表時，您必須為每個維度資料表建立索引。其中包括在維度的 Surrogate 索引鍵資料行上建立非叢集主索引鍵限制索引，以及在維度實體的商務索引鍵資料行上建立叢集索引。對於大型的維度資料表，您還應該考慮在最常用於高度選擇性述詞中的資料行上，新增非叢集索引。
叢集索引可在資料倉儲的維護期間加速有效的擷取、轉換和載入 (ETL)，這往往是時機關鍵的程序。譬如，對於變化緩慢的維度，現有的資料列會就地更新，而尚未出現在維度中的資料列則是附加到維度資料表。這種存取模式需要在 ETL 時期適當執行查詢和更新維度資料表，才能順利進行。
我們此處所簡述的藍圖設計，是實體設計 SQL Server 內建的關聯式資料倉儲中一個不錯的出發點。以這個典型的關聯式資料倉儲設定為基礎，我們可以進一步探索 SQL Server 2008 中的重要新功能。

星狀聯結查詢最佳化
處理事實資料表往往是在維度模型的關聯式資料倉儲中執行星狀聯結查詢最耗資源的工作。這種現象很明顯，因為即使是高度選擇性的查詢從事實資料表擷取的資料列數量，也比從任何維度擷取到的要來得多。因此，要達到良好的查詢效能，使用事實資料表的最佳存取路徑是不可或缺的。
對於 SQL Server，查詢最佳化工具會自動從一組替代選項中選擇評估成本最低的存取路徑。在資料倉儲的環境中，最主要的目標是要確保查詢最佳化工具會將各種必要的存取路徑選項列入考慮，作為星狀聯結查詢執行計畫的依據。SQL Server 的查詢最佳化工具中包括了各種功能，可自動提供有效執行的星狀連結查詢執行計畫。
您可以把星狀聯結查詢分成三大類，如 [圖 2] 所示。這些廣泛的類別也有利於 SQL Server 引擎針對該些查詢找出適當的計畫選擇。SQL Server 背後最主要的概念是該些查詢對事實資料表的選擇性。查詢從事實資料表取用的資料列越少，選擇性就越高。為了提供這些查詢類別的直覺知識，會使用從事實資料表擷取的資料列百分比。這些百分比會呈現典型客戶部署的值，但是並不會作為產生存取路徑定義的嚴格限制。
Figure 2 星狀聯結查詢的選擇性範圍
Figure 2 星狀聯結查詢的選擇性範圍
第一個類別涵蓋高度選擇性查詢，這可處理事實資料表中高達 10% 的資料列。第二個類別，也就是中度選擇性，所包含的查詢則可處理 10% 以上、最高達 75% 的事實資料表資料列。第三個類別中的查詢具有低度選擇性，需要處理事實資料表中超過 75% 的已儲存資料列。圖中的方塊也指出每種選擇性類別當中基本的查詢執行計畫選擇。

根據選擇性選擇計畫
既然高度選擇性的星狀查詢通常不會擷取超過 10% 的事實資料表資料列，這些查詢便可以對事實資料表進行隨機存取。然而，該類別的查詢計畫會非常仰賴巢狀迴圈聯結與 (非叢集) 索引的組合，在事實資料表中進行尋找和書籤查閱。因為這些查詢會對事實資料表執行隨機 I/O，所以在我們需要擷取較大部分的事實資料表時，它們的效能遜於循序 I/O。因此當事實資料表的資料列數量增加超過特定數目時，應採用不同的查詢計畫。
由於中度選擇性的星狀查詢會處理事實資料表中大量的資料列，因此含事實資料表掃描或事實資料表範圍掃描的雜湊聯結往往是較常用的事實資料表存取路徑選擇。SQL Server 使用點陣圖篩選器來提升這些雜湊聯結的效能。
[圖 3] 說明 SQL Server 如何利用這些點陣圖篩選器在星狀聯結查詢執行期間提升聯結的效能。此圖顯示針對兩個維度資料表 (產品和時間) 與事實資料表連同 Surrogate 索引鍵進行查詢的計畫。此查詢對兩個維度資料表使用篩選器述詞，例如 WHERE 子句，只讓一個資料列取得一個維度。這是由兩個聯結運算子旁邊的紅色小資料表表示。
Figure 3 星狀聯結查詢計畫與簡化聯結處理
Figure 3 星狀聯結查詢計畫與簡化聯結處理
每個聯結的聯結實作都是雜湊聯結，這可讓 SQL Server 將合格資料列的相關資訊，從維度資料表套用成我們所謂的兩個維度資料表的簡化聯結資訊。圖中的綠色方塊表示簡化聯結資訊資料結構。一旦從基礎維度資料表擴展之後，SQL Server 就會在查詢執行期間，自動將這些資料結構移到運算子來處理事實資料表，例如資料表掃描。這個運算子會利用維度資料表資料列的相關資訊，來去除對維度來說不符合聯結條件的事實資料表資料列。
SQL Server 會在極早期的查詢處理期間清除這些事實資料表資料列 — 在從事實資料表擷取資料列之後。這可同時省下 CPU 和可能的磁碟 I/O，因為查詢計畫的其他運算子中並不需要處理這些被清除的資料列。SQL Server 使用點陣圖表示以便在查詢執行時期，有效地實作聯結簡化資訊資料結構。

星狀聯結最佳化管線
最佳化程序是採用標準啟發式 (Heuristic) 來達成聯結查詢最佳化，以產生一組初始的查詢執行計畫替代方案。接著會運用特殊用途的延伸模組來產生其他的查詢計畫替代方案。
在資料倉儲的情況下，延伸模組會偵測星狀結構描述、雪花式結構描述，以及星狀查詢模式，而且它會評估查詢對事實資料表的選擇性。如果結構描述和查詢形狀符合模式，SQL Server 就會自動新增更多查詢計畫到計畫空間，此空間隨後會佈滿以成本為考量的最佳化，來選擇最有可能的查詢計畫來執行。
在查詢執行時期，SQL Server 還會監視簡化聯結在執行時期的實際選擇性。如果選擇性有所變更，SQL Server 會動態地重新排列簡化聯結資訊資料結構，讓選擇性最高的最先套用。

星狀聯結啟發式
許多資料倉儲的實體設計都是遵循星狀結構描述，但不會完全指定事實和維度資料表之間的關聯性，例如像前文所述的外部索引鍵限制。若未明確指定外部索引鍵限制，SQL Server 就必須仰賴啟發式來偵測星狀結構查詢模式。偵測星狀聯結查詢模式會套用下列的啟發式：
  1. 加入 N 元聯結的最大資料表將被視為事實資料表。事實資料表的大小下限還有其他限制。比方說，若是連最大的資料表都未超過特定大小，N 元聯結將不會被視作星狀聯結。
  2. 星狀聯結查詢中的二進位聯結的所有聯結條件，都必須是單一資料行相等述詞。聯結必須是內部聯結，這聽起來好像很嚴格，但它涵蓋了典型星狀結構描述中的 Surrogate 索引鍵上的事實資料表與維度資料表之間絕大多數的聯結。如果聯結具有比較複雜的聯結條件，而與前述的模式不符，便會將該聯結從星狀聯結中排除。譬如，如果五向聯結當中的兩個聯結擁有比較複雜的聯結述詞，則可能變成三向星狀聯結 (之後會納入其他兩個聯結)。
要注意的是，這些是啟發式規則。會導致啟發式挑選維度資料表作為事實資料表的實際情況不多。這雖會左右計畫的選擇，但對選定計畫的正確性卻完全沒有影響。星狀聯結中所牽涉的二進位聯結之後會依漸低的選擇性來排序。此處所提的聯結選擇性是定義成事實資料表的輸入基數與聯結的結果基數的比率 — 聯結選擇性會指明某特定維度會減少多少的事實資料表基數。一般來說，我們會先考慮含較高選擇性的聯結。
SQL Server 中的查詢處理器會在產生的查詢計畫擁有較佳的預估查詢成本時，將最佳化自動套用到遵守星狀聯結模式及前述條件的查詢。因此，您不需要對應用程式進行任何變更，它就可以從顯著的效能提升中獲益。不過要注意，有些星狀聯結最佳化，例如簡化聯結，只在 SQL Server Enterprise Edition 中提供。

星狀聯結效能結果
我們在 SQL Server 2008 中投入星狀聯結最佳化的開發工作時，根據基準測試和實際的客戶工作負載執行了好幾項效能研究。當中有三種工作負載的結果特別值得一提。
Microsoft 銷售組織資料倉儲 此工作負載會追蹤在 Microsoft 內部的銷售組織中用於內部決策支援的資料倉儲的效能。我們取樣的資料庫快照集大小約為 750GB (包括索引)。此工作負載中的查詢很難進行查詢處理，因為當中許多都超過 10 個聯結。
零售客戶 這一系列的實驗是以零售業 (包括傳統商店和線上商店) 的資料倉儲客戶為主。這些客戶的特色是具備維度模型的雪花式結構描述和標準星狀聯結查詢。我們使用大約 100GB 的原始資料來擴展倉儲的快照集以進行我們的實驗。
決策支援工作負載 這一系列的實驗是調查決策支援工作負載在 100GB 維度模型的資料庫上的效能。[圖 4] 顯示這三種工作負載的結果。此處圖解了工作負載中所有查詢的查詢回應時間的正規化幾何含意。在執行工作負載的任意查詢時，要預計會得到什麼樣的查詢效能，這種公制算是不錯的指標。圖中的直條會將不使用星狀聯結最佳化時的基準效能 (1.0) 與經過星狀聯結最佳化的效能相比較。所有這些執行作業都是透過 SQL Server 2008 執行。
Figure 4 透過星狀聯結最佳化的效能提升
Figure 4 透過星狀聯結最佳化的效能提升
如圖所示，全部的工作負載都明顯改善了 12%，最高達 30%。雖然個別的效益將有所差異，但我們預計 SQL Server 引擎的決策支援工作負載，將可改進大約 15-20%，視 SQL Server 2008 中全新的星狀聯結特定最佳化的延伸模組而定。

分割資料表平行處理
為了加速大型資料倉儲中的查詢處理，資料庫管理員通常會依日期來分割大型事實資料表。這會將資料放置到不同的檔案群組中，除了可在處理特定資料範圍內的資料列時減少必須搜尋的資料量外，還能在將檔案群組部署到大量實體磁碟時，善用基本磁碟系統的並行效能。
SQL Server 2005 引進了將大型關聯分割成較小邏輯區塊，以改善大型資料表管理工作的功能。它在改進查詢處理能力方面亦成就非凡，尤其是大型決策支援應用程式。
不幸的是，有些使用 SQL Server 2005 的客戶在這些分割資料表上觀察到與查詢相關的效能問題 — 特別是在執行平行共用記憶體多處理器的機器上。當在 SQL Server 2005 中的分割資料表上處理平行查詢時，可能會發生只指派了可用的執行緒子集來執行查詢的情況。
想想 64 核心的機器，當中的查詢可平行使用多達 64 個執行緒，而且每個查詢會到達兩個磁碟分割。在 SQL Server 2005 中，它只會收到 64 個執行緒中的兩個，因此可能只會使用機器 2/64 (3.1%) 的 CPU 功力。有些查詢在磁碟分割的情況下的效能，遠比在相同機器上相同事實資料表的非分割版本上執行相同的查詢要差上 10 倍，甚至更多。
我們應該要注意 SQL Server 2005 已特別經過最佳化讓查詢可以到達單一磁碟分割。在這種情況下，查詢處理器會指派所有可用的執行緒來執行掃描。這種特殊的最佳化可為在多核心機器上執行的單一磁碟分割查詢提供大幅的效能提升，而且客戶自然而然也可以預期查詢到達多磁碟分割的行為。
SQL Server 2008 中全新的分割資料表平行處理 (PTP) 功能更善於利用現有硬體的處理能力，無論查詢可到達多少磁碟分割，也不管個別磁碟分割的相對大小，藉此來提升磁碟分割情況的查詢效能。在典型含有分割事實資料表的資料倉儲案例下，使用者可能會看到在平行計畫上執行的查詢有明顯的改進，尤其是可用處理器核心的數量大於受查詢影響的磁碟分割數目的情況。而且這項新功能不需要任何微調或設定，立即可用。
假設我們有個在四個磁碟分割間依銷售日期排列顯示銷售資料的事實資料表。[圖 5] 中的圖表可幫助您具體化此範例。請注意，這並不像非磁碟分割案例一樣，有一個叢集索引用於整個資料範圍，通常是在事實資料表的每個磁碟分割的日期資料行上有個叢集索引。現在假設查詢 Q 會總結前七天的銷售。隨著新銷售資料不斷透過最後的磁碟分割 (標示為 P4) 輸入事實資料表，查詢很有可能會到達不同的磁碟分割，端視它的執行時機而定。這在圖表的第一個資料列中，說明了 Q1 查詢如何只到達單一磁碟分割，而 Q2 查詢卻到達兩個磁碟分割，因為執行當時的相關資料橫跨了 P3 和 P4 磁碟分割。
Figure 5 PTP 新功能實際運作
Figure 5 PTP 新功能實際運作
現在假設有八個執行緒可用，在 SQL Server 2005 上執行 Q1 和 Q2 可能會產生非預期的行為。SQL Server 2005 最佳化的依據是，如果最佳化工具在編譯時期知道查詢只會到達一個磁碟分割，便會將該磁碟分割當作單一非分割的資料表，並且會產生一個計畫使用所有可用執行緒來存取資料表。
所得的結果是牽連單一磁碟分割 (P3) 的 Q1 會產生一個由八個執行緒 (未顯示) 處理的計畫。在 Q2 的情況下，也就是到達兩個磁碟分割，執行子會指派一個執行緒給每個磁碟分割，即使基本硬體有其他的執行緒可用也一樣。因此，Q2 只會使用到極小部分的可用 CPU 效能，而且執行起來可能遠比 Q1 要緩慢得多。
在 SQL Server 2008 上執行 Q1 和 Q2 除了能促進可用硬體的使用率之外，效能也較佳，而且行為也比較可以預測。在 Q1 的情況下，執行子會再次指派全部八個可用的執行緒，以處理 P2 中的資料 (未顯示)。在此同時，Q2 則會產生平行計畫，執行子在此會指派所有可用的執行緒給 P3 和 P4 循環配置樣式，以達到在圖表底部的資料列中所顯示的效果，當中兩個磁碟分割各收到四個執行緒。CPU 仍然充分被運用，而且 Q1 和 Q2 的效能相當。
當處理器核心比查詢存取的磁碟分割數目更多時，這類的執行緒循環配置可讓查詢效能格外出色。但可惜的是，磁碟分割的執行緒配置在某些情況下並不如本例般直接了當。
從 SQL Server 2005 到 SQL Server 2008 針對分割資料表案例在多核心處理器機器上所獲得的效能提升，在 [圖 6] 有進一步說明。這個有趣的圖表指出了分割資料表的掃描效能。針對這項在配備 64 核心和 256GB RAM 的系統上進行的特定測試，我們將 121GB 的單一資料表分割成 11 個各自有 11GB 的磁碟分割。對於本圖所述的測試組，我們使用的是同時具備冷緩衝區啟動和熱緩衝區啟動的堆積檔案組織。所有的查詢都對資料執行簡單的掃描。
Figure 6 啟用 PTP 新功能的 SQL Server 的掃描效能
Figure 6 啟用 PTP 新功能的 SQL Server 的掃描效能
Y 軸顯示回應時間 (秒) 而 X 軸指出平行處理的程度 (DOP)，相當於指派給查詢的執行緒數目。如您所見，在冷啟動和熱啟動兩種情況下，回應時間會繼續縮短直到 DOP 到達 22 為止。此時 I/O 系統在冷啟動的案例下會呈現飽和狀態。這是因為此例所使用的查詢已繫結 I/O 之故。若有更多繫結 CPU 的工作負載，這項限制可能就不存在，或者可能只會發生在較高 DOP 的時候。
然而，曲線表示熱啟動案例隨著 DOP 層級的增加，在回應時間上會繼續顯示下滑的現象。在 SQL Server 2005 上，兩個曲線都會在 DOP 11 左右開始持平，因為在處理多磁碟分割時，每個磁碟分割的執行緒數目都只會限制為 1。
有一點要特別注意的是，在實際的情況下，因 DOP 數量的增加而獲益的回應時間從來不是線性的。預期的行為反而比較像是階梯作用 — 這反映出現實情況，也就是查詢基本上會等候最慢的子組件。因此，舉例來說，光在掃描中多加一個執行緒並不會改進查詢的完成時間，除非等到所有其餘的掃描都收到額外的執行緒，讓它們也更快完成才行。
我們還執行了其他實驗來測試各種不同硬體和檔案組態的 PTP 新行為。這麼做讓我們觀察到了隨著 DOP 增加超過一個執行緒/磁碟分割，在調整輸送量方面類似的行為。
最後也是很重要的一點是，SQL Server 2008 的 PTP 新功能也提高了查詢計畫的可讀性，以便更進一步了解特定工作負載的執行。譬如，顯示計畫 XML 中呈現平行和序列計畫的方式已經過改良，還有編譯時期和執行階段兩個執行計畫所提供的磁碟分割資訊也已經過加強，這些都屬於 PTP 功能的一部分。

資料壓縮
隨著商務智慧越來越普遍，各公司也將越來越多的資料倒入資料倉儲裡面進行分析。結果變成要管理的資料大小成指數成長。在 1995 年，第一份 Winter Corporation 關於資料庫大小的調查指出，全世界最大的系統包含的資料量是以 TB 為單位。十年之後，最大的資料庫更是加大 100 倍。更驚人事實是，資料倉儲的大小每兩年就增加三倍。要管理這麼大量的資料，以及為資料倉儲查詢提供可接受的效能等級，在在都是新挑戰。這些查詢往往複雜，牽涉到許多聯結和彙總，而且它們也會存取大量的資料。另外，工作負載當中很多查詢繫結 I/O 的情況也很常見。
原始資料壓縮正是要解決這個問題。SQL Server 2005 SP2 為小數點和數值資料引進了一個全新的變數長度儲存格式，也就是 Vardecimal 儲存格式。這個全新的儲存格式可大幅縮減資料庫的大小。節省下來的空間可在兩方面協助提升繫結 I/O 查詢的效能。首先，要讀取的頁面變少了，其次，因為資料是以壓縮的形式保存在緩衝區集區中，所以它可增進 Page Life Expectancy (換句話說，它能提高在緩衝區中找出要求頁面的機會)。不用說，因為要進行壓縮和解壓縮程序，透過資料壓縮省下的空間的確也產生了 CPU 方面的成本。
SQL Server 2008 是以 Vardecimal 儲存格式為基礎建構而成，提供兩種壓縮方式：ROW 壓縮和 PAGE 壓縮。ROW 壓縮會以變數長度儲存格式來儲存所有固定長度的資料類型，藉此延伸 Vardecimal 儲存格式。
Integer、char 和 float 資料類型都屬於固定長度資料類型。即使 SQL Server 是以變數長度格式來儲存這些資料類型，資料類型的語意還是不變 (從應用程式的角度來看，資料類型仍舊是固定長度的資料類型)。也就是說，您不需要對應用程式進行任何變更，就可以坐享資料壓縮的好處。
PAGE 壓縮可將特定頁面上的一或多個資料列中資料行內的資料重複降至最低。它使用 LZ78 (Lempel-Ziv) 演算法的專利實作，只在頁面上儲存重複資料一次，然後從多個資料行參考它。要注意的是，當您使用 PAGE 壓縮時，實際上也會包含 ROW 壓縮。
資料表或索引，或分割資料表和索引的一或多個磁碟分割，都可以啟用 ROW 和 PAGE 壓縮。這提供極大的彈性供您選擇要進行壓縮的資料表、索引和磁碟分割，讓您在節省空間和 CPU 衝擊之間找出平衡點。[圖 7] 透過不同索引對齊的方式分割的銷售資料表，來說明這種情況。
Figure 7 含有不同壓縮設定的分割資料表
Figure 7 含有不同壓縮設定的分割資料表
每個磁碟分割都代表一季，十月-十二月是最後一季。假設前兩個磁碟分割並不常存取，第三個磁碟分割的活動平平，而最後一個磁碟分割的活動最多。在這種情況下，可能的組態是在前兩個磁碟分割上啟用 PAGE 壓縮，以盡可能不影響工作負載效能的情況下節省最大的空間，在第三個磁碟分割上啟用 ROW 壓縮，最後一個磁碟分割則不進行任何壓縮。
您可以使用 Alter Table 或 Alter Index Data Definition Language (DDL) 陳述式，在線上或離線啟用壓縮。SQL Server 也提供預存程序，以用於預估可節省的空間。您所省下的空間將視資料分散程度和要壓縮的物件的結構描述而定。
根據測試許多客戶資料庫所得的結果，似乎大部分客戶都能夠縮減 50-65% 的資料庫大小，並大幅提升繫結 I/O 查詢的效能。然而，要評估對繫結 CPU 查詢效能的影響需要一點技巧，而且要看查詢的複雜度而定。在 SQL Server 中，只有在存取索引或資料表時才會產生解壓縮成本。如果掃描運算子的相對 CPU 成本與查詢的整體 CPU 成本比起來偏低 (通常是在資料倉儲的案例下)，對 CPU 使用率的衝擊應該不會超過 20-30%。

對齊磁碟分割的索引檢視
在 SQL Server 2008 中，對齊磁碟分割的索引檢視可讓您更有效地建立和管理關聯式資料倉儲裡面的摘要彙總，並將它們運用在過去無法有效使用的案例中。這麼做可改進查詢效能。在典型的案例中，您通常有一個依日期分割的事實資料表。此資料表上會定義索引檢視 (或是摘要彙總) 以利加快查詢的速度。當切換到新資料表磁碟分割時，與分割資料表上定義的對齊磁碟分割的索引檢視相符的磁碟分割也會跟著切換，而且是自動進行。
這明顯要比 SQL Server 2005 優越許多，在 SQL Server 2005 中，您必須先卸除分割資料表上定義的任何索引檢視之後，才能使用 ALTER TABLE SWITCH 作業來回切換磁碟分割。在 SQL Server 2008 中，對齊磁碟分割的索引檢視功能提供您大型分割資料表上的索引檢視優點，同時免去了在整個分割資料表上重建彙總所需的成本。這些優點包括自動維護彙總和索引檢視對應。

磁碟分割層級鎖定擴大
SQL Server 支援範圍磁碟分割，它可讓您分割資料以方便管理，或是根據資料的使用模式來分組。比方說，銷售資料可依月度或季度來分割。您可以將磁碟分割對應到它本身的檔案群組，再轉而將檔案群組對應到一組檔案。這提供兩大優點。第一，您可以將磁碟分割備份和還原為獨立的單元。第二，您可以將檔案群組對應到緩慢或快速的 I/O 子系統，視使用模式或查詢負載而定。
其中有趣的地方在於資料的存取模式。查詢和 DML 作業可能只需要存取或操作磁碟分割子集。所以，假設您正在分析 2004 年的銷售資料，您只需要存取相關的磁碟分割，而且在理想的情況下，除了系統資源外，您應不會受到同時存取其他磁碟分割中的資料的查詢所影響。在 SQL Server 2005 中，同時存取其他磁碟分割內的資料可能會導致資料表鎖定，進而影響到其他磁碟分割的存取情況。
為了盡可能減少這種干擾，SQL Server 2008 引進了資料表層級選項，在磁碟分割或資料表層級控制鎖定擴大。根據預設，鎖定擴大是在資料表層級啟用，SQL Server 2005 中便是如此。不過，您可以覆寫資料表的鎖定擴大原則。譬如，您可以將鎖定擴大設定如下：
Alter table <mytable> set (LOCK_ESCALATION = AUTO)
這個命令會指示 SQL Server 選擇最適合資料表結構描述的鎖定擴大細微度。如果資料表未分割，則鎖定擴大會在資料表層級進行。如果資料表已分割，那麼鎖定擴大細微度會在磁碟分割層級進行。SQL Server 也會將這個選項當作是不在資料表層級提供鎖定細微度的提示。

總結
本文只是簡短介紹 SQL Server 2008 中的增強功能，這些功能將幫助您針對關聯式資料倉儲達到更佳的決策支援查詢效能。但是也別忘了，雖然爭取決策支援查詢的回應時間很重要，但還有其他重要的需求，不過這已超出本文範疇。
其他一些與關聯式資料倉儲相關的功能如下：
  • 支援 T-SQL 中的 MERGE 語法，透過一個陳述式和一次往返資料庫來更新、刪除或插入 (維度) 資料。
  • SQL Server 引擎的最佳化記錄效能以容許更有效率的 ETL。
  • 群組集合以方便使用 T-SQL 編寫彙總決策支援查詢。
  • 備份壓縮以降低完整和增量備份的 I/O 需求。
  • 資源監管以控制配置到不同工作負載的系統資源。
我們非常鼓勵您到 SQL Server 網頁上瞧瞧所有這些新酷功能的相關詳細資訊，網址是 microsoft.com/sql。
在此特別感謝 Boris Baryshnikov、Prem Mehra、Peter Zabback 和 Shin Zhang 貢獻技術長才。

Sunil Agarwal 在 Microsoft 的 SQL Server 儲存體引擎 (SQL Server Storage Engine) 小組擔任資深專案經理，他負責並行、索引、tempdb、LOBS、支援性和大量匯入/匯出。
Torsten Grabs 在 Microsoft SQL Server 小組中擔任核心儲存體引擎 (Core Storage Engine) 的資深專案經理，他擁有資料庫系統的博士學位，並且在 SQL Server 方面有 10 年的經驗。
Dr. Joachim Hammer 在 Microsoft 的查詢處理 (Query Processing) 小組擔任專案經理，他擅長於大規模資料倉儲應用程式的查詢最佳化，也專精分散式查詢、ETL 和資訊整合。


 SQL Server: 盡可能減緩 SQL Server 中的封鎖情形
SQL Server Cherié Warren

盡可能減緩 SQL Server 中的封鎖情形
摘要:
  • 為什麼會發生鎖定擴大
  • 避免不必要的封鎖
  • 查詢最佳化
  • 監視鎖定對效能的影響

要支援同時讀寫資料庫，肯定少不了鎖定，雖說如此，封鎖也可能會拖累系統效能，不過有時候還很難察覺得到。在本文中，我將探討如何將 SQL Server 2005 或 SQL Server 2008 資料庫最佳化，
以便將封鎖的情形減至最低，還會討論如何監視系統，讓您更加了解鎖定對效能的影響。

鎖定和擴大
SQL Server® 會根據有多少記錄會受到影響，還有系統上同時存在什麼活動來選擇適當程度的鎖定。在預設的情況下，SQL Server 會盡可能選擇最細微的鎖定，只有在更能有效運用系統記憶體的情況下，才會選擇較廣泛的鎖定。如果擴大可提高整體系統效能，SQL Server 就會擴大鎖定。如 [圖 1] 所示，當特定掃描中的鎖定數目超過 5,000，或是系統用於鎖定的記憶體超過可用的容量時，就會發生擴大的情形。
Figure 1 導致鎖定擴大的條件
Figure 1 導致鎖定擴大的條件
  • 如果鎖定設定為 0，資料庫引擎會使用 24% 的非 Address Windowing Extensions (非 AWE) 記憶體
  • 如果鎖定設定不是 0，資料庫引擎會使用 40% 的非 AWE 記憶體
發生擴大的，一定是資料表鎖定。

避免不必要的封鎖
任何程度的鎖定都可能會發生封鎖，但若發生擴大，封鎖範圍就會增大。鎖定擴大可能是應用程式設計、編寫或設定不良的徵兆。
若要預防封鎖，一定要遵守資料庫設計基礎 (例如透過縮小金鑰使用正規化結構描述，以及避免在交易系統上進行大量資料作業)。若不遵守這些準則 (例如將報告系統與交易系統相區隔，或是在非營業時間處理資料餵送)，將很難微調系統。
若要知道存取資料需要多少鎖定，編製索引可說是關鍵的要素。索引會減少資料庫引擎必須執行的內部查詢次數，藉此減少查詢存取的記錄數量。譬如，當您從資料表的非索引資料行上選取單一資料列時，資料表中的每一個資料列都必須暫時加以鎖定，直到找出所需的記錄為止。相反地，如果該資料行已經編製索引，就只需要一個鎖定。
SQL Server 2005 和 SQL Server 2008 兩者都包含動態管理檢視 (sys.dm_db_missing_index_group_stats、sys.dm_db_missing_index_groups、sys.dm_db_missing_index_details)，它們會根據累計的使用統計資料，顯示被索引嘉惠的資料表和資料行。
分散情形也可能暗喻著效能問題，因為資料庫引擎可能需要存取比沒有分散情形時更多的頁面。另外，錯誤的統計資料也可能使查詢最佳化工具選擇比較沒有效率的計畫。
請記住，雖然索引可以加速資料存取，但也可能減緩資料的修改作業，因為不僅基本資料需要變更，連索引也需要更新。動態管理檢視 sys.dm_db_index_usage_stats 特別說明了索引使用的頻率。低效率索引最常發生在複合索引身上，在這裡無論隔離或複合都會編製相同的資料行。由於 SQL Server 是從左到右存取索引，只要最左邊的資料行可用，就會使用索引。
分割資料表不但可將系統最佳化 (縮小封鎖的範圍)，也可將資料分成不同的實體物件以供個別競用。雖然分隔資料比較明顯的作法是啟用資料列磁碟分割，但是您也可以考慮水平分割資料。您可以特意選擇取消正規化，方法是將資料表分割成含有相同資料列和金鑰數目但資料行不同的個別資料表，藉此降低不同處理序同時獨佔存取資料的可能性。
應用程式可存取特定資料列之資料的方法越多元化，該資料列裡面可包含的資料行就越多，而資料行分割的方法也越吸引人。這種方法有時候也可以嘉惠應用程式佇列和狀態資料表。SQL Server 2008 新增了依磁碟分割 (若資料表未啟用磁碟分割的話，可依資料表) 停用鎖定擴大的功能。

查詢最佳化
查詢最佳化在強化效能方面扮演了很重要的角色。下面是您可採取的三種方法：
縮短交易 減少封鎖以及提升整體效能最重要的方法之一，就是盡量縮小交易的規模。任何對交易完整性不重要的處理作業 (例如查詢相關資料、編製索引，以及拖曳資料) 都應該去除以縮小交易。
SQL 會將每個陳述式視作隱含交易。如果陳述式會影響大量資料列，即使是一個陳述式也可以構成大型交易，尤其若是牽涉到許多資料行或是資料行包含大型資料類型的話更是如此。如果填滿因素偏高，或是 UPDATE 陳述式以大於之前配置的值來填滿資料行的話，單一陳述式也可能會導致頁面分割。在這種情況下，比較實用的作法是將交易分成資料列群組，一次處理一個，直到全部完成為止。您應該只在個別陳述式或一組陳述式可分成較小型的批次，而且這些小型批次無論成功或失敗都能被視為完整的工作單位時，才考慮採用批次處理。
排列交易順序 在交易內部特意排列陳述式的順序，可以降低封鎖的可能性。您必須牢記兩個準則。第一，在系統內所有的 SQL 程式碼中，務必以相同的順序存取物件。如果順序不一致，兩個競爭的處理序就會以不同的順序存取資料，這種情形可能會產生死結，進而導致其中一個處理序發生系統錯誤。第二，務必將最常存取或耗用最多資源存取的物件，置於交易結尾。SQL 會在交易中等到必要時才鎖定物件。延遲對「作用點」的存取，可縮短這些物件保有鎖定的時間。
使用鎖定提示 您可以針對特定資料表或檢視，在工作階段層級或陳述式層級使用鎖定提示。使用工作階段層級提示的典型案例，是資料倉儲所用的批次處理，在這項作業中，開發人員知道該處理序是在特定時間內在該資料集合上唯一執行中的處理序。SQL Server 不會保留任何讀取鎖定 (方法是在預存程序開始時使用諸如 SET ISOLATION LEVEL READ UNCOMMITTED 等命令)，因此也減少整體的鎖定負荷並提升效能。
當開發人員知道可以安全的進行中途讀取時 (例如，從資料表讀取其他並行處理序永遠都不需要的資料列)，或是當所有其他效能微調皆告失敗時 (結構描述設計、索引設計和維護，以及查詢微調)，以及開發人員想要強制編譯器使用特定種類的提示時，都是使用陳述式層級提示的典型案例。
如果監視指出在查詢幾乎影響不到記錄的地方發生較廣泛的鎖定，這時候使用資料列鎖定提示比較理想，因為這樣可以減少封鎖的情形。如果監視指出幾乎資料表中所有的記錄都受到查詢影響時，發生較細微的鎖定，這時候使用資料表鎖定提示比較適合，因為這樣可以減少保持鎖定所需的系統支援。請注意，指定鎖定提示並不保證在鎖定數目到達系統記憶體閾值時鎖定不會擴大。不過，這麼做倒可以防止其他所有的擴大情況。

調整組態
如 [圖 2] 所示，設定 SQL Server 系統時有幾項因素需要考慮。
Figure 2 SQL Server 如何判斷可用於鎖定的記憶體量
Figure 2 SQL Server 如何判斷可用於鎖定的記憶體量
記憶體 鎖定一定是保存在非 AWE 記憶體中，因此擴大非 AWE 記憶體，可以增加系統容納鎖定的容量。
如果想要增加鎖定容量，應先考慮 64 位元架構，因為 32 位元架構只能使用 4GB 的非 AWE 記憶體，而 64 位元則完全沒有限制。
在 32 位元的系統上，您可以在 Boot.ini 檔案中加入 /3GB 參數，向作業系統多抓取 1GB 的記憶體給 SQL Server 用。
SQL Server 組態設定 您可以透過會影響鎖定的 sp_configure，調整各種設定。鎖定設定會設定系統在擲出錯誤之前可保有多少鎖定。根據預設，這項設定值為 0，也就是說，伺服器會與其他競用記憶體的處理序動態調整保留的鎖定數目。SQL 最先會保留 2,500 個鎖定，而且每個鎖定會耗用 96 個位元組的記憶體，不會用到分頁記憶體。
最小和最大記憶體設定會保留 SQL Server 所用的記憶體量，因而設定讓伺服器靜態保有記憶體。由於鎖定擴大與可用記憶體有關，因此競用處理序所保留的記憶體量，對於是否會發生擴大有著深遠的影響。
連線設定值 在預設的情況下，封鎖的鎖定並不會逾時，但是您可以使用 @@LOCK_TIMEOUT 設定，在超過釋放鎖定的指定等候閾值時產生錯誤。
追蹤旗標 鎖定擴大與兩個追蹤旗標特別息息相關。一個是追蹤旗標 1211，它會停用鎖定擴大。如果取用的鎖定數目超過可用的記憶體，就會發生錯誤。另一個是追蹤旗標 1224，它會停用個別陳述式的鎖定擴大。

觀察系統
深入閱讀
  • 《Inside Microsoft SQL Server 2005:The Storage Engine》，Kalen Delaney 著
  • 如何監視 SQL Server 2005 與 SQL Server 2000 中的封鎖情形
  • SQL Server 2005 效能統計資料指令碼
  • 如何解決因 SQL Server 封鎖擴大所造成的封鎖問題
  • 鎖定擴大 (資料庫引擎)

您可以針對封鎖和鎖定，監視鎖定對整體系統效能的衝擊，方法是在指定間隔 (可能是每小時) 輪詢狀態資料，以及擷取保有鎖定的執行統計資料。您要擷取的重要資訊有：
  • 受影響的物件、鎖定程度和鎖定類型
  • 鎖定和封鎖持續的時間
  • 發出的 SQL 命令 (預存程序名稱、所含的 SQL 陳述式)
  • 相關封鎖鏈的資訊
  • 系統如何取用它的可用鎖定容量
您可以執行如 [圖 3] 所示的指令碼來擷取這項資訊，將它寫入含相關時間戳記的資料表中。若要進一步分析遭到封鎖的資料的 ResourceId，可以執行像 [圖 4] 所示的指令碼。
Figure 4 Learning more about blocked data (Close Figure 4)
DECLARE @SQL                           nvarchar(max)
      , @CallingResourceType           varchar(30)
      , @Objectname                    sysname
      , @DBName                        sysname
      , @resource_associated_entity_id int

-- TODO: Set the variables for the object you wish to look up

SET @SQL = N'
USE     ' + @DbName + N'
DECLARE @ObjectId int

SELECT  @ObjectId = CASE
                    WHEN @CallingResourceType = ''OBJECT''
                    THEN @resource_associated_entity_id
                    WHEN @CallingResourceType IN (''HOBT'', ''RID'', ''KEY'',''PAGE'')
                    THEN (SELECT  object_id
                          FROM    sys.partitions
                          WHERE   hobt_id = @resource_associated_entity_id)
                    WHEN @CallingResourceType = ''ALLOCATION_UNIT''
                    THEN (SELECT  CASE
                                     WHEN type IN (1, 3)
                                     THEN (SELECT  object_id
                                           FROM    sys.partitions
                                           WHERE   hobt_id = allocation_unit_id)
                                     WHEN type = 2
                                     THEN (SELECT  object_id
                                           FROM    sys.partitions
                                           WHERE   partition_id = allocation_unit_id)
                                     ELSE NULL
                                     END
                          FROM    sys.allocation_units
                          WHERE   allocation_unit_id = @resource_associated_entity_id)
                    ELSE NULL
                    END

SELECT  @ObjectName = OBJECT_NAME(@ObjectId)'

EXEC    dbo.sp_executeSQL
        @SQL
      , N'@CallingResourceType varchar(30)
      , @resource_associated_entity_id int
      , @ObjectName sysname OUTPUT'
      , @resource_associated_entity_id = @resource_associated_entity_id
      , @CallingResourceType = @CallingResourceType
      , @ObjectName = @ObjectName OUTPUT
Figure 3 Capturing locking stats (Close Figure 3)
SELECT  er.wait_time                      AS WaitMSQty
      , er.session_id                     AS CallingSpId
      , LEFT(nt_user_name, 30)            AS CallingUserName
      , LEFT(ces.program_name, 40)        AS CallingProgramName
      , er.blocking_session_id            AS BlockingSpId
      , DB_NAME(er.database_id)           AS DbName
      , CAST(csql.text AS varchar(255))   AS CallingSQL
      , clck.CallingResourceId
      , clck.CallingResourceType
      , clck.CallingRequestMode
      , CAST(bsql.text AS varchar(255))   AS BlockingSQL
      , blck.BlockingResourceType
      , blck.BlockingRequestMode
FROM    master.sys.dm_exec_requests er WITH (NOLOCK)
        JOIN master.sys.dm_exec_sessions ces WITH (NOLOCK)
          ON er.session_id = ces.session_id
        CROSS APPLY fn_get_sql (er.sql_handle) csql
        JOIN (
-- Retrieve lock information for calling process, return only one record to
-- report information at the session level
              SELECT  cl.request_session_id                 AS CallingSpId
                    , MIN(cl.resource_associated_entity_id) AS CallingResourceId
                    , MIN(LEFT(cl.resource_type, 30))       AS CallingResourceType
                    , MIN(LEFT(cl.request_mode, 30))        AS CallingRequestMode
-- (i.e. schema, update, etc.)
              FROM    master.sys.dm_tran_locks cl WITH (nolock)
              WHERE   cl.request_status = 'WAIT' -- Status of the lock request = waiting
              GROUP BY cl.request_session_id
              ) AS clck
           ON er.session_id = clck.CallingSpid
         JOIN (
              -- Retrieve lock information for blocking process
              -- Only one record will be returned (one possibility, for instance,
              -- is for multiple row locks to occur)
              SELECT  bl.request_session_id            AS BlockingSpId
                    , bl.resource_associated_entity_id AS BlockingResourceId
                    , MIN(LEFT(bl.resource_type, 30))  AS BlockingResourceType
                    , MIN(LEFT(bl.request_mode, 30))   AS BlockingRequestMode
              FROM    master.sys.dm_tran_locks bl WITH (nolock)
              GROUP BY bl.request_session_id
                    , bl.resource_associated_entity_id
              ) AS blck
           ON er.blocking_session_id = blck.BlockingSpId
          AND clck.CallingResourceId = blck.BlockingResourceId
        JOIN master.sys.dm_exec_connections ber WITH (NOLOCK)
          ON er.blocking_session_id = ber.session_id
        CROSS APPLY fn_get_sql (ber.most_recent_sql_handle) bsql
WHERE   ces.is_user_process = 1
        AND er.wait_time > 0
您也可以透過 SQL Profiler (Lock:Escalation event)、dm_db_index_operational_stats 動態管理檢視 (index_lock_promotion_count) 或定期輪詢系統鎖定資訊，來監視系統的擴大情形。從監視擴大所收集的相關資訊是處理作業是否核准擴大，如果不核准，相關的預存程序是否可以找出效能問題的根源。含大量資料或高度並行使用量的資料表，應該是擴大的主要重點。
收集了鎖定、封鎖和擴大的相關資料後，接著可以分析該資料，判斷每個物件的累加封鎖和鎖定時間 (事件的數量乘以事件的持續時間)。通常這就是部署、監視、分析和修正變更的重複效能調整週期的開端。有時候只需要進行簡單的變更 (例如新增索引以大幅提升效能)，就可以更改系統中最頭痛的效能瓶頸區。
有關減少 SQL Server 封鎖的詳細資訊，請參閱「深入閱讀」資訊看板。如果能夠在設計、編寫程式碼和穩定化階段當中，特別注意不讓交易規模擴大，許多封鎖問題便能迎刃而解。適當的硬體也能大幅降低發生不必要擴大的可能性。無論如何，只要持續評估系統上的封鎖情形，就可以迅速找出效能問題的根源。

Cherié Warren 擔任 Microsoft IT 的資深開發主任一職，她目前負責 Microsoft 內部最大的交易資料庫之一。Cherié 也經常追根究底，以及解決封鎖相關的效能問題。她專事企業層級 SQL Server 資料庫已有 10 年的時間。


 Microsoft Office: 整合 Access 資料庫與 SharePoint
Microsoft Office Peter Serzo

整合 Access 資料庫與 SharePoint
摘要:
  • 整合 Access 與 SharePoint 的優點
  • 將 Access 資料移轉至 SharePoint
  • 透過 SharePoint 擴充 Access 功能

當我跟使用者談到 Microsoft Office SharePoint Server (MOSS) 2007 時，我總是要他們示範所使用的工具，還有使用的方法。屢試不爽，
公司裡面始終有人使用 Microsoft® Office AccessTM 來解決基本的商務需求。Access 仍是可行的工具，而且是許多公司的重要資產。
使用 MOSS 2007，您可以運用以 Access 為基礎建置而成的應用程式，將它們整合至 SharePoint® 中，建立範圍更加廣泛的全新解決方案。本文的重點是要說明 MOSS 是如何還有在什麼地方與 Access 整合，以及使用者要如何設定這兩種產品來建置解決方案。
MOSS 帶入 Access 的基本技術結合了工作流程、通用儲存機制 (SQL Server®)，以及以網路為基礎的介面 (瀏覽器)。SharePoint 的功能包括文件管理、工作空間，以及設定自訂清單和利用內建工作流程及現成網頁組件的功能，範圍從通告事件到建置連絡人清單或問題清單，到管理使用者建立的表單等，應有盡有。此外，使用便利性和熟悉的 Office 技術也將強化使用者的掌控能力。您將看到，MOSS 並不會對現行的解決方案造成威脅。MOSS 反而會提高效率，因為您不用重新撰寫應用程式，藉此讓使用者把重心放在解決商務問題上，而不是技術問題上。
從中受益的還不只是使用者而已。設法協助使用者維護公司中林立的所有自訂資料庫的 IT 部門和系統管理員也受益匪淺。許多人甚至等到碰到特定的問題，才知道原來 Access 是解決任務關鍵商務問題的主角，這些問題包括儲存限制、多使用者存取、安全性、修復損毀資料庫、網路使用、不相容的 Access 版本，以及在多部桌上型電腦間部署變更等。SharePoint 可一一解答上述各個問題。
雖然 Access 有其限制，但它的功能強大而且容易使用，特別是對那些不會寫程式碼的人來說。您可以在同一個地方取得可設定的關聯式資料表、簡單的查詢 (和複雜的查詢)、拖放前端表單建立工具、以資料為主的報表，以及設定多使用者的功能。根據 Access 和 SharePoint 來建置解決方案對於尋求聯合資源和專才的公司，以及想要利用多年累積的應用程式和技能的個人來說，都很合適。

快速入門
Access 2007 提供好幾個與 MOSS 2007 整合的出發點。如您在 [圖 1] 中所見，這些包括：從 SharePoint 清單匯入資料，將資料發佈到 SharePoint 網站，建立 SharePoint 清單，使用 SharePoint 資料作為外部來源，將 Access 資料庫移轉到全新或現有的 SharePoint 網站，以及離線存取 SharePoint 資料。
Figure 1 Access 2007 提供與 MOSS 2007 整合的簡易進入點。
Figure 1 Access 2007 提供與 MOSS 2007 整合的簡易進入點。
從 Access 資料表建立 SharePoint 清單是一個不錯的起點。SharePoint 清單與 Access 中的資料表非常類似，它是儲存在 SQL Server 內容資料庫中，內含特定的欄位屬性，而且支援查閱。
建立 SharePoint 清單時要牢記在心的一些限制包括：Microsoft 建議每個檢視都有 2,000 個項目的上限以達到最佳效能；SharePoint 並不會強制參考完整性；OLE 物件不會匯出到 SharePoint；還有資料的驗證有限。
若要從 Access 資料表建立 SharePoint 清單，先選取 [外部資料] 索引標籤，然後在 [匯出] 群組下按一下啟用的 [SharePoint 清單] 按鈕。您現在必須指定啟用此清單的 SharePoint 網站，您可以在此處填寫 [圖 2] 所示的 [匯出 - SharePoint 網站] 對話方塊，或是在資料表上按一下滑鼠右鍵，然後選取 [匯出資料至 SharePoint 清單]。要注意的是，如果資料表是關聯性當中的子系，也會一併匯出所有的父系資料表。
Figure 2 Access 資料表會匯出到您指定的 SharePoint 網站
Figure 2 Access 資料表會匯出到您指定的 SharePoint 網站
匯出程序完成後，會提供選項讓您儲存匯出步驟，這樣一來您就不用重複步驟。這時候，您可以前往 SharePoint 網站並查看上載的資料。這項簡單的作業對於移動資料到 SharePoint，然後讓使用者存取來說蠻實用的。好處是可以提高安全性，因為資料現在是儲存在 SQL Server 資料庫中，而且加上資訊可透過瀏覽器取得，因此非常方便存取。
不過，另外一項作業 — 將 SharePoint 中的清單連結成 Access 中的資料表 — 反而是更有效整合 Access 與 SharePoint 的方法。要進行這項作業，在 Access 中按一下 [外部資料] 索引標籤，然後選取 [匯入] 群組下的 [SharePoint 清單]。這會顯示 [圖 3] 中的對話方塊。
Figure 3 連結 Access 到 SharePoint
Figure 3 連結 Access 到 SharePoint
選取包含要作為連結資料來源之 SharePoint 清單的網站，然後選取您要連結的清單。此作業完成時，清單會在 Access 中顯示成連結資料表，而且在應用程式的右下角，您會看到一個 [與 SharePoint 連線] 的指示器。Access 與 SharePoint 之間現在會雙向同步處理，支援從 SharePoint 或 Access 新增、變更和刪除作業。如您所見，您可以對資料表編寫程式碼來提供額外的功能。
當在 Access 中連結到 SharePoint 清單時，您會看到預設還會匯入和連結另一個資料表，那就是 Windows® SharePoint Services (WSS) Users Information List。另外還會建立一個叫做「移至 SharePoint 網站議題」的議題資料表。您可以在此處檢閱與資料發生的任何衝突。
如需有關移轉資料，以及資料類型在交談期間是如何處理的詳細資訊，請參閱＜Access 如何在Access 與 SharePoint 資料類型之間轉換＞ (office.microsoft.com/en-us/access/HP010477131033.aspx)，以及＜移動 Access 資料庫中的資料表至 SharePoint 網站並加以連結＞ (office.microsoft.com/en-us/access/HA101314681033.aspx) 一文的「移轉限制」一節。
第三種整合資料表和清單的方法是透過 SharePoint 起始。選擇一份清單，然後在 [動作] 索引標籤下，按一下 [以 Access 開啟] 選項。接著會出現一個對話方塊，詢問資料庫的名稱 (全新或現有的)。輸入資料庫的名稱之後，您將選擇是否要直接連結到 SharePoint 網站上的資料，還是要將資料直接匯出至 Access (見 [圖 4])。
Figure 4 使 SharePoint 資料可透過 Access 存取
Figure 4 使 SharePoint 資料可透過 Access 存取

移動資料庫至 SharePoint
到目前為止，我們討論了將 SharePoint 清單匯入成連結的資料表，以及將資料表當作清單匯出至 SharePoint，但若是您需要存取整個資料庫的話怎麼辦呢？許多公司都有任務關鍵應用程式在 Access 中執行，而且需要這些應用程式從遠端也能使用，以便讓個人執行報表和查詢，以及輸入資料。在這種情況下，重寫應用程式不一定永遠可行 — 無論是從成本上或是可用技能方面考量。SharePoint 和 Access 提供了 [移至 SharePoint] 選項來解決這個問題，這個選項可在 [存取 SharePoint 清單] 索引標籤下找到。它跟使用「SQL 轉換精靈」移至 SQL Server 的選項類似，這個精靈首先是出現在 Access 97。
將整個 Access 資料庫移動到 SharePoint 的好處是，所有的資料表都會轉換成 SharePoint 清單；會製作 Access 資料庫的備份；清單自動在 Access 中變成連結的資料表；您可以移動整個資料庫，而不只是資料表；而且資料庫的運作方式跟移動前沒有什麼出入。
在按下 [移至 SharePoint] 按鈕後，會出現 [圖 5] 中的對話方塊。指定網站之後，您必須決定是否要選取要儲存資料庫的選項。若要這麼做，整個資料庫便會儲存至選定的文件庫中。這表示整個資料庫 (包括表單、報表、查詢和巨集) 會儲存到 SharePoint 中，因此能在伺服器上使用。當使用者想要存取資料庫時，他只要導覽至資料庫所在的程式庫，在它上面按一下滑鼠按鍵，該資料庫就會自動部署到他的桌面。
Figure 5 指定您要移動資料庫的 SharePoint 網站
Figure 5 指定您要移動資料庫的 SharePoint 網站
選擇移動整個資料庫時，功能區下方會出現一個 [發佈變更] 訊息列。這可讓您將本機上的設計和資料的變更與伺服器上的複本保持同步。如果沒有選取這個選項，則只有資料表會轉換成清單並連結至 Access。若是發生這種情形，使用者社群將無法使用整個資料庫，而且資料庫也不會備份成 SharePoint 中的物件。
選取其中一個選項之後，資料庫及其相關的資訊就可以透過您所選的 SharePoint 網站提供。而且還會自動建立一個叫做「移至 SharePoint 網站議題」的資料表。這裡會記錄任何因移轉作業而產生的衝突。您可以檢閱 Access 在 SharePoint 網站上上載資料表時遇到的任何問題。

檢視、表單及報表
資料庫一旦移動後，您就應該測試它的功能性。開始前，確定您看得到 [與 SharePoint 連線] 指示器。請注意，Access 查詢會變成 SharePoint 檢視；SharePoint 檢視與 Access 查詢非常類似。
當移動整個資料庫時，會將現有的查詢當作檢視複製到 SharePoint 中。Access 使用者知道撰寫查詢可讓他們看到資料的子集。學著在 SharePoint 檢視中進行這樣作業有助您了解資料在 SharePoint 清單內的排列方式。
您可以建立的其中一個最實用的檢視是 Access 檢視。要建立檢視的話，導覽至您要建立檢視的清單，依序選取 [檢視]、[建立檢視]。您在該處會看到 [Access 檢視] 選項，可讓您根據清單建立表單和報表。按一下此選項並選取 Access 資料庫時，會出現一個像 [圖 6] 中的對話方塊。您可以看到，現在您可以定義格式 (表單類型、樞紐分析圖、樞紐分析表或報表)，而且當程序完成之後，Access 資料庫中會有一個連結的表單或報表。
Figure 6 建立 Access 檢視
Figure 6 建立 Access 檢視

離線 Access
在真實世界中，擴充任務關鍵應用程式的影響範圍，可獲得投資報酬。要擴充整合式 Access/SharePoint 應用程式的影響範圍，其中一個方法是了解您不一定要連線到 SharePoint 才能使用它。為了提升這方面的效率，Access 2007 引進了離線工作的功能。資訊在連接到伺服器之前，會快取到資料庫的本機複本中。若要使資料庫離線，按一下功能區上 [外部資料|SharePoint 清單] 群組上的 [離線工作] 按鈕。
準備好重新連線到 SharePoint 時，就可以選擇 [線上工作] 或 [同步處理]。兩個選項都會上載資料並顯示當中的衝突以供檢閱；不過，要是使用 [同步處理] 的話，資料會上載，但應用程式會保持離線。
在 [SharePoint 清單] 群組中還有另外一個項目要注意的是 [捨棄變更]，它有兩個選項。第一個是捨棄全部變更，但不在 Access 中更新 SharePoint 資料。第二個選項是捨棄全部變更，並更新 SharePoint 資料 (連結的清單)。

Access 範本
Access 2007 有幾個預先建置的範本可協助使用者快速建立商務解決方案，您可以在 [資料表] 群組中按一下 [建立] 索引標籤下的 [SharePoing 清單] 按鈕看到這些範本 (見 [圖 7])。選取其中一個範本會自動為連結至 SharePoint 的資料表定義結構描述。目前只支援連絡人、工作、議題和事件。也就是說，假如您匯出一個包含當中一種資訊的資料表，則資料最後會變成相對應的 WSS 內容類型 (例如，議題對議題)。
Figure 7 選擇清單類型
Figure 7 選擇清單類型
您也可以建立可用於 SharePoint 清單的自訂範本，或是使用自我連結的 Access 2007 資料庫建立 SharePoint 網站範本。這麼做需要有 Access 2007 Developer Extensions，也必須設定資料表的 WSSTemplateID。這個屬性會追蹤哪個資料表擁有相等的 SharePoint 清單範本。

Access 和中繼資料
擁有運作穩固的 Access 應用程式的企業並不一定能夠或想要將所有這些應用程式移到 SharePoint。碰到這種情況，有時候在 Access 中撰寫程式碼來更新 SharePoint 比較合理。您可以透過程式碼，把 SharePoint 與 Access 結合在一起。
舉 Northwind Trader 的資料庫這個簡單的例子，它會儲存關於產品、供應商和客戶訂單的資訊。每個產品一般都有相關產品表，廠商會以 .pdf 檔案提供。Access 資料庫會追蹤產品表上所含的全部資訊，例如地理位置、產品編號、修訂記錄，以及公司部門代碼。這項資訊需要透過 SharePoint 外部網站讓供應商和廠商使用。
接下來會設立 SharePoint 網站，而且所有文件也會移到連結的文件庫中，但是中繼資料欄位會留白 (見 [圖 8])，因為 Access 中會追蹤資料 (而且監視資料的人使用 Access 非常得心應手，一點也不急著做任何改變)。
Figure 8 在 SharePoint 中檢視不含中繼資料的 Northwind 文件
Figure 8 在 SharePoint 中檢視不含中繼資料的 Northwind 文件
幸好，如 [圖 9] 所示，您可以加入 Visual Basic® for Applications (VBA) 程式碼透過 Access 應用程式來更新中繼資料，而不必重寫應用程式。員工可繼續使用他所熟悉的工具，並同時發展到網路，廠商可以根據他們的權限存取外部網站 (因此只能查看他們應該可以查看的內容)，而沒有一致性或資料庫大小的問題。
Figure 9 使用程式碼更新中繼資料
Figure 9 使用程式碼更新中繼資料

內建安全性
將 Access 應用程式移至 SharePoint 最大的好處之一，就是能夠利用 SharePoint 安全性模型，這種模型有內建的 Active Directory® 驗證。也就是說，您不必再藉著建立結構描述和資料表，然後加入使用者來在 Access 應用程式中實作安全性。透過 SharePoint 清單，您可以利用安全性調整，當中使用者只能查看允許他們查看的內容；這是 SharePoint 特有的功能。此外，如果您不想將某些資料庫元件移往 SharePoint，您不必移動它們。
SharePoint 提供一種細微的角色型安全性模型。在決定要如何和何時移動資料庫時，您應該先設計網站和安全性，然後再進行移轉。這樣的話，設定和測試權限比較容易。另外，移轉的問題也會比較少，而且 Access 資料庫執行起來也比較有效率。

參考完整性
我一定得討論一下參考完整性這個主題，不然就是我的疏忽。事實上，SharePoint 並不會像 Access 一樣強制參考完整性。許多安裝在某些程度上都已正規化。若要讓這些任務關鍵 Access 資料庫順利運作的話，也必須把這列入考量。好在，實際上有幾項因應措施可當做現有系統的增強。
我之前有提到，在移動資料庫到 SharePoint 時，如果移動子資料表的話，父資料表也會跟著移動。此外，SharePoint 如果認出欄位選擇是根據其他資料表而決定的，便會使用查閱欄位。比方說，假設在 Northwind Traders 資料庫中選取了一個客戶，也下了一張訂單。若將這些資料表移到 SharePoint，則客戶欄位會在訂單清單中變成查閱。
那麼串聯更新/刪除和比較複雜的作業呢？這時候應該考慮採用 SharePoint 和它的工作流程作為可能的解決方案。回到 Northwind Traders 資料庫的例子，假設客戶打電話取消現有的訂單，這隨之會觸發幾項動作：庫存必須放回，必須通知供應商，負責訂單的員工必須連絡客戶處理後續事宜，送貨必須取消，而且也需要更新會計。這牽涉到很多移動組件和協調工作。
利用 SharePoint Designer，您可以在 SharePoint 中建立工作流程，以便在訂單狀態一變更時，立刻完成上述所有動作。有 22 種現成的工作流程可混搭成上百個動作。SharePoint Designer 是建立您的網站品牌以及建立工作流程的絕佳工具。
最棒的是，使用者只要熟悉如何為 Access 進行「程式設計」，就等於具備以 SharePoint Designer 建立工作流程的技能。換句話說，建立 Access 應用程式的使用者不需要費太多功夫，就可以轉換和擴展他們的技能來建立工作流程。利用 SharePoint Designer 建立工作流程完全不用寫程式碼，而且部署這些工作流程也很簡單。

Peter Serzo 在 CDW Berbee 擔任資深工程師一職，他主要負責為全球各地的公司建構 SharePoint Enterprise 解決方案。


 編輯的話: 向老朋友和新朋友致意
編輯的話
向老朋友和新朋友致意

本月份，我們不得不以 感傷和喜悅參半的心情開頭。感傷的是，我們得向 The Cable Guy ─ Joseph Davies 互道珍重。Joseph Davies 將以本期的《TechNet Magazine》專欄，為他的工作畫下句點。我們非常幸運能夠請到像 Joseph 這麼深具水準的專家，指導我們各種 Windows 網路方面的主題。但是 Joseph 最近接下 Microsoft 一份很有挑戰性的新工作，因此必須放下這個月刊。在此我們所有的《TechNet Magazine》工作人員，謹向他多年來卓越的貢獻致上誠摯的謝意，希望他在新的工作領域能夠一路順風。
儘管抱著難過不捨的心情歡送 The Cable Guy，我們的戲還是得繼續上演。因此在下一期，我們將開闢一個標題為「SharePoint 內幕」的新專欄。過去一年來我們收到大量客戶反映，希望我們提供更多 SharePoint 方面的教學和指導。SharePoint 是一項有趣且快速成長的技術，因此作為每月專欄的標題再適合不過了。本專欄將由 Pav Cherny will 打頭陣，以 SharePoint 基礎結構的架構概觀揭開序幕。接下來的幾個月，我們將陸續討論安全性、可用性、效能、疑難排解等議題。如果您有任何關於 SharePoint 的主題希望我們討論，請不吝告訴我們。來信請寄 tnmag@microsoft.com。
同時，我們也必須向我們的資深編輯 Terrence Dorsey 和 Nancy Michell 獻上誠摯的感謝。Terry 和 Nancy 從草創之初便和大家共同打拼，以豐富的才華和經驗，讓《TechNet Magazine》從零開始逐漸成形，最後成功付梓，至今仍努力不懈。但是，Terry 和 Nancy 將從本期開始，全力轉向我們的姐妹刊物《MSDN Magazine》。而另外兩位才華洋溢的資深編輯 Matthew Graven 和 Sharon Terdeman 則結束他們在《MSDN Magazine》的工作，全力投入《TechNet Magazine》。幸好，Terry 和 Nancy 並未離開太遠，我們仍然熱切仰賴他們的專業與眼光，陪伴《TechNet Magazine》繼續成長。
現在內部人事已經大致就緒，接下來就請各位好好欣賞本月份的內容。數量與範圍與日俱增的資料，可說是您最重要的商業資產，本期焦點就擺在即將推出的 SQL Server 2008，探討各項協助您儲存、保護、管理和運用資料等新功能。 —Joshua Hoffman


 讀者來信: 讀者有話直說
讀者來信
讀者有話直說

強式和弱式主機
2007 年 9 月份的《The Cable Guy》專欄 (technetmagazine.com/issues/ 2007/09/CableGuy)＜強式和弱式主機模型＞裡提到啟用或停用弱式主機的功能，但沒有指出啟用或停用的方法。這項功能的作用只是啟用或停用防火牆，或是設定登錄參數嗎？它有沒有相關聯的登錄參數呢？
另外，本機存取設定需要兩項資訊：IP 位址和 IP 遮罩。為什麼 Microsoft 把不含選擇性閘道參數的設定視為無效設定呢？
—Milt B.
對於 Windows Vista® 和 Windows Server® 2008 ，您可以根據圖中所列的命令設定強式或弱式主機行為 (首次於 2007 年 9 月份出版)。它沒有對應的登錄項目。您不可以在 Windows® XP 和 Windows Server 2003 設定強式或弱式主機行為。IPv4 是弱式主機專用；而 IPv6 是強式主機專用。
至於第二個問題，根據我們瞭解，介面上的 IPv4 或 IPv6 設定並不需要預設閘道或路由器的設定，只需經由使用者介面或命令行即可。


 工具箱: 適合 IT 專家的新產品
工具箱
適合 IT 專家的新產品
Greg Steen

管理多個監視器
UltraMon
realtimesoft.com
隨著 LCD 螢幕價格節節下降，大部分系統管理員的工作站再怎麼陽春，至少都有兩台以上的監視器，幫助他們留意不同的系統管理儀表板(如果您還沒這麼做，強烈建議您趕快採取行動，這可是省時省力的好辦法！) 不過，多了一台 (或兩台) 監視器，就得更密集的使用滑鼠，而這也會使速度趨緩。面對這種情況，優秀好用、具有鍵盤快速鍵的顯示器管理公用程式，將可助上您一臂之力。其中 Realtime Soft 所開發的 UltraMon，就是一個值得考慮的公用程式，它支援包括 32 位元和 64 位元版本在內的 Windows® 98 到 Windows Vista®。
當您第一次啟動 UltraMon 時，可能會注意到每一個應用程式視窗的角落，都有兩個小圖示。第一個圖示可將應用程式視窗快速延伸到其他監視器，第二個圖示可將應用程式傳輸到另一端的監視器。另外，工作列也會延伸到每一個監視器，並且含有該監視器專屬的應用程式。換句話說，要延伸應用程式，不必回到主要監視器就辦得到，而且應用程式在最大化和最小化時所出現的位置，您馬上可以瞭如指掌。
每一個應用程式捷徑上都會有一個新的 UltraMon 索引標籤，讓您定義該應用程式應該在哪一個監視器的哪一個位置上啟動，比方說，您這樣就可以讓 Microsoft® Outlook® 一律在左視窗顯示，而讓 Internet Explorer® 一律在右視窗開啟。身為一個 IT 專家，您很可能會從不同的遠端位置 (例如膝上型電腦或家裡的桌上型電腦) 連線到工作站；只不過要建立每一個遠端連線，可能需要對桌上型電腦和顯示器解析度稍做更改。
幸好，UltraMon 也支援顯示器設定檔，可讓您快速變更各監視器的自訂檢視。如果您是與其他需要或希望擁有自己自訂檢視的人共用電腦，或者您希望根據自己的活動來變更自己的檢視，這一點無異是如虎添翼。
如果您的作業系統是 Windows 2000 或 Windows XP，也可以啟用適合簡報用的「鏡像」功能，這項功能允許讓主要監視器的解析度高於簡報監視器，但仍然能夠在兩個螢幕上鏡映這些應用程式活動。如果您尚未升級到 Windows Vista，也可以讓應用程式將螢幕畫面延伸到多個監視器 (這是 Windows Vista 的預設功能)。
其他還有一些顯示器功能，例如，[顯示器設定] 畫面的捷徑，在您的系統上快速設定及切換主要監視器的功能，以及切換到不同的顯示器設定檔，這些都是 UltraMon 系統匣圖示提供的幾項可快速存取重複活動的功能。除此之外，您也可以在這裡啟動 [UltraMon 選項 (UltraMon Options)] 視窗，自訂「智慧型工作列」(Smart Taskbar)、設定移動和變更視窗用的快速鍵，以及將滑鼠移到指定的焦點。

價格： 單份授權 $39.95 美元起。
The options window in UltraMon lets you set up hotkeys and manage your Smart Taskbar
The options window in UltraMon lets you set up hotkeys and manage your Smart Taskbar

書評
Microsoft SQL Server 2005 Analysis Services
informit.com
大量收集客戶群的相關資料是一回事，但是要瞭解這些資料，並且運用這些資料而得出有用且深入的統計資料，則是另當別論。要取得預先規劃的檢視和預測，需要一個靈活且強而有力的商務智慧方案。Microsoft 對於商務智慧和線上分析處理 (OLAP) 競爭的情況，所提出的部分對策是 SQL Server® 2005 Analysis Services。而能夠引導您確實運用這個方案的，正是《Microsoft SQL Server 2005 Analysis Services》這本書。
無論您是否考慮部署新的資料採礦，是否要從 Analysis Services 2000 升級到 Analysis Services 2005，或者您是不是一位有興趣瞭解這些工具對於您和貴公司能帶來哪些助益的資料庫系統管理員，由 Py Bateman、Alexander Berger、Irina Gorbach 和 Edward Melomed 合著的這本書，都適合您閱讀。本書不落入商務智慧理論的俗套，而是深入現實生活，具體描述在現實生活使用、開發、部署以及管理 Analysis Services 的方式。它以該軟體所檢附的範例資料庫 Food Mart 2005 為主軸提供許多範例，讓您馬上在自己的測試環境中進行實驗。
本書簡介部分詳列 2005 版的新功能，包括含 Web 服務 XML for Analysis (XMLA) 通訊的主從架構、Unified Dimensional Model，以及新版本的延展性提升。另外還介紹 Food Mart 範例資料庫以及多維度資料庫的基礎。接著就讓您學習資料定義語言 (DDL) XML、維度屬性與階層以及 Cube 與多維度分析，來建立資料模型，並且介紹具有 Business Intelligence Development Studio 的 2005 Analysis Services 商務智慧專家的設計與開發工作場所。
大致了解設計概念之後，接下來就進入以多維度運算式 (MDX) 來運用資料的部分。在這裡除了觀察如何以 MDX 查詢資料之外，還會學習如何使用 MDX 函數與成員及儲存格屬性；處理空的 Set 和 Null、Subselect 和 Subcube；以及學習建立和使用 Cube MDX 計算，與利用預存程序來延伸您的查詢。然後是探索關鍵效能指標 (KPI)、詳細分析和計分卡，幫助您深入瞭解業務成長、衡量標準和目標的各個層面。
接下來則介紹資料的解壓縮、轉換和載入 (ETL) 程序，不僅告訴您如何將資料匯入系統中，同時也告訴您如何發揮彙總設計的優點，採用主動快取來提升效能。您也可以在這裡一一瞭解 Cube 和維度的實體資料模型，以及當中各項處理作業如何與 2005 Analysis Services 搭配運作。此外，您還可以學習根據自己的商務需求來擴展部署作業，其範圍包含了網路負載平衡、OLAP 伺服器陣列、連結量值和維度群組，以及遠端磁碟分割程序。
接下來就進入查詢執行的核心部分，帶您深入瞭解基本作業，協助您提升應用程式的效能。它所探討的是從用戶端的角度來存取資料，以及可以採用哪些方法來執行這項作業，例如 XMLA、ADOMD.net 和 Analysis Management Object (AMO)。在這一節當中，您必須擺脫「當中的程式碼作者」，才能瞭解如何使用 Visual Studio 和商務智慧 IDE 來建立自己的自訂資料倉儲應用程式。
最後一節則探討管理 Analysis Services 安裝，包括使用追蹤工具、飛航記錄器和 SQL Server Profiler 來監視系統的效能和性能。此外，您還可以在一些探討使用 DDL 命令來備份資料庫、透過 SQL Server Agent 或 SQL Server Integration Services (SSIS) 進行自動化，以及復原遺失或損毀資料的技術等章節當中，看到各種備份和還原部署的方法。整體來說，這本 SQL Server 2005 Analysis Services 的指導手冊，是一本內容廣泛完善的書籍。

價格： $59.99.

診斷資料庫問題
ApexSQL Audit
apexsql.com/sql_tools_audit.asp
您應該知道要排解問題疑難或追蹤潛在問題，第一步是針對事件問題癥結所在，收集適當的資訊。如果您有參與使用者支援的工作，對於「系統遺失資料」這類的抱怨應該不陌生。而由 ApexSQL 所開發的 ApexSQL Audit，正可以幫助您快速鎖定 SQL Server 資料庫問題的工具，它完全支援 SQL Server 7.0 到 SQL Server 2005。
從名稱就猜得到，這個應用程式主要在追蹤指定資料庫的活動，讓您針對稽核記錄建立一份自訂報告作為分析之用。稽核項目是透過 SQL 觸發程序加入，儲存在一個自動產生的結構描述中。您可以選擇將稽核資訊與您所監看的資料儲存在同一個資料庫，也可以將稽核資訊儲存在它自己的資料庫中加以隔離。
透過圖形 UI 來安裝 (和移除) 稽核結構描述 (一般稱之為結構) 是一項輕鬆的作業。為資料庫設定稽核計劃一點也不難：只要選定資料庫，選取您要監看的表格和欄位，然後再按一下按鈕，產生觸發程序就行了。
這個應用程式不但可讓您修改專案的觸發程序範本，而且範本編輯器還針對稽核物件模型，提供類似 IntelliSense® 的功能，方便它自訂發動觸發器的時間以及所要儲存的資訊，真是深得我心。另外它還可讓您輕鬆參考查閱資料表，進一步的瞭解稽核資訊，相較於一串晦澀難懂的識別碼，這項功能無疑高明多了。如果您要對應直欄的話，也可以將監看的欄位名稱，對應到稽核欄位名稱。
操作一切順利之後，就可以藉由 UI 快速瀏覽目前套用的稽核觸發程序，而且必要時，只要按一下滑鼠按鍵就可以啟用和停用特定的觸發程序。您也可以檢查方便好用的介面表格檢視涵蓋了哪些稽核範圍。
一般大眾普遍認為稽核資訊稍嫌冗長，需要規劃一個資訊管理方案來封存和修剪稽核資料庫。而 ApexSQL Audit 所提供的資料管理工具，只要按一下滑鼠按鍵就可以讓您刪除所有的資訊，指定一組準則後再刪除，或是排定條件式的刪除作業。
排定的工作會自動建立為 Data Transformation Services (DTS) 封裝，並且透過 SQL 代理程式加以排定。不用多說，取得所有的稽核資訊是一回事，能不能夠使用它們又是另一回事。幸好 ApexSQL Audit 有一個強大的報告元件可以產生自訂的篩選檢視，讓您查看不可部分完成的稽核資料，以及產生彙總檢視，讓您查看所有的稽核資料。報告產生之後，就可以將它輕鬆印出，或者將輸出匯出到 HTML、Microsoft Excel 或文字檔。

價格： $599 美元起。
The look-up tables in ApexSQL Audit provide extensive audit information
The look-up tables in ApexSQL Audit provide extensive audit information

將密碼到期提醒自動化
Password Reminder PRO v1.4
sysoptools.com/password-reminder-pro.html
不知您有沒有注意到，每當密碼到期原則掃過貴公司的一個群組時，支援工程師就會接到一窩蜂的電話。果真如此，不妨試試 SysOp Tool 推出的 Password Reminder PRO。這個簡單的工具整合了 Active Directory®，可通知一般使用者他們的帳戶或密碼即將到期。
您可以設定三種不同的提醒，每一種都各自以不同的文字化或格式化 HTML 電子郵件範本加以設定。您也可以將最長密碼期限，比照您的 Active Directory 設定天數值，以及傳送提醒的小時值來設定，這樣就不會與尖峰時段相衝突。測試模式可讓您在不影響使用者的情況下預覽效果，以確保每一個設定都正確無誤。
這個公用程式還有一個報告主控台，可以顯示資料格檢視，讓您查看不同的使用者類別：即將到期的帳戶、非使用中的使用者、新帳戶以及已停用的帳戶等等。您可以從這個報告主控台，將所有的資訊匯出到 XLS 檔供稍後複閱。為了額外稽核已經送出的電子郵件，Password Reminder PRO 還會傳送一份每日報告，告訴您哪些提醒已經傳送給哪些使用者。

價格： 每份百位使用者授權 $249 美元起。
Password Reminder PRO previews configurations before deployment
Password Reminder PRO previews configurations before deployment

簡化遠端疑難排解
UltraVnc SC
uvnc.com/pchelpware/sc
若要排解問題的疑難，或者引導使用者執行某個程序，最簡單的方法通常是在機器上實際操作，但這對於現今分散各地的公司來說往往難以成行。雖然 Windows 內建的「遠端桌面連線」和「遠端協助」工具可以協助您連接到您環境當中的部分電腦，若要了解基本原理，可試試 UltraVNC SC，這是主力專案 UltraVNC 的製造商。
UltraVNC SC 與舊版一樣，可讓您檢視和控制遠端機器；不過，這個版本是您設定並傳送給一般使用者的小型 166K UltraVNC 伺服器。它不需要任何登錄項目，也不是執行成服務，更不需要安裝程式，因此使用者也不需要進行任何設定。使用者只要按兩下執行檔，啟動迷你 VNC 伺服器，就可以連接到您要支援和管理的機器。
但是標準的 UltraVNC 伺服器支援檔案和目錄轉送，而目前的 UltraVNC SC 只支援檔案轉送。從安全性的角度來說，通訊是加密到您 Microsoft Crypto API (40 或 128 位元) 的層級。另外，迷你伺服器並不接受連入連線，只能由一般使用者建立，而且在傳送到一般使用者之前，只能連接到您設定所指定的機器。
若要建立自訂檢視器，就得調整一下文字設定檔和圖形，然後從另一個稱為 PCHelpware 的專案附加元件安裝執行一個批次檔，藉此來產生執行檔。雖然說明文件不是很完備，倒也向您說明了如何進行這個超級簡單的程序。最後，當連線用畢關閉之後，這個應用程式就會自動解除安裝，因此不會留下任何追蹤或安全漏洞。

價格：免費。

Greg Steen 是一位技術專家和企業家，為人十分熱心。他總是四處探尋新的工具，協助 IT 專家更輕鬆地進行操作、品管及開發。


 SQL 問答集: 擴大資料庫，使用 IFilters，以及從遠端連線
SQL 問答集
擴大資料庫，使用 IFilters，以及從遠端連線
Edited by Matthew Graven

提示：清除快取
有沒有納悶過為什麼預存程序在測試環境明明運作得很順利，但部署到實際執行 SQL Server 後卻行不通呢？這可能是快取的問題。如果能夠在預存程序部署到生產環境之前，先清除快取的查詢計畫，再於測試環境中進行測試，這麼一來，您就知道預存程序在「冷」快取環境中會怎麼運作了。這裡有幾個好用的訣竅可以參考。
若要清除 SQL Server 上的程序快取：
DBCC FREEPROCCACHE
Go
查詢以列出所有快取的計畫：
Select * from sys.dm_exec_cached_plans
Go

問：我的資料庫在白天的時候流量很大，但我不想使用自動成長，因為萬一 SQL Server® 決定在尖峰時段進行這項作業的話，有可能會導致逾時。我想要實作定期工作，根據所用空間的特定百分比來擴大資料庫檔案。我該怎麼做呢？
答：檔案成長是相當耗費磁碟 I/O 的作業，如果 SQL Server 必須等候資料或記錄檔擴大的話，肯定會折損效能，也會影響回應時間。資料檔案預設的成長幅度是 1MB，而記錄檔則是 10%，這種成長幅度對忙碌的系統來說可能不夠。此外，仰賴自動成長可能會導致磁碟分散，因為資料或記錄檔在磁碟上並不是連續的，也就是說，回應時間可能會比需要的更長，因為資料實際上是四散在磁碟上。
達到良好效能的關鍵，是一開始就為資料和記錄檔主動配置足夠的檔案空間。而配置足夠的檔案空間通常需要進行一些趨勢分析和成長預測，這麼做也可以提高效能，因為檔案在磁碟上是連續的，可以避免自動成長在尖峰時段所耗費的 I/O 成本。自動成長通常應該保持在啟用狀態，因為資料或記錄檔若是全滿的話，會完全阻礙資料庫的存取。但是要記住，自動程式應該被視為安全網，而不是當作管理資料庫的一項功能。
定期擴大資料庫檔案能免則免，因為這也會導致磁碟上的非連續檔案，進而折損效能。不過您可以進行主動監視，定期執行指令碼來判斷每個資料庫的可用空間百分比 (由 SQL Agent 工作執行)，然後採取行動 (例如傳送電子郵件警示或透過 Database Mail)。圖中程式碼所提供的範例程式碼，就在說明如何收集目前資料庫的可用空間百分比。
萬一產生警示，則可以使用 ALTER DATABASE 命令編寫指令碼一次擴大檔案，再以 SQL Agent 工作，將這個動作排在尖峰時段以外的時間進行。您可以將檔案擴大到足以供可預見的未來使用，以避免檔案在未來少量遞次擴大。同時，最好能夠確定所有資料庫上都沒有啟用自動壓縮 — 因為自動壓縮可能會產生不必要的資料庫壓縮或成長週期。
—Justin Langford
判斷資料庫內的可用空間
-- Script to gather size, free space and
-- calculate % free space for current
-- USER database
DECLARE @size DEC(15,2)
DECLARE @free DEC(15,2)
DECLARE @result DEC(15,2)

SELECT @size = SUM(size)*1.0/128
FROM sys.database_files

SELECT @free =
(SUM(unallocated_extent_page_count)*1.0/128)
FROM sys.dm_db_file_space_usage

PRINT 'DB Size ' + CONVERT(VARCHAR(15), @size)
PRINT 'Free Space ' +
CONVERT(VARCHAR(15), @free)

SELECT @result = (@free/@size)*100

PRINT '% Free Space ' +
CONVERT(VARCHAR(15), @result)

問：我們公司使用 Varbinary 和影像資料行，在資料庫裡面儲存了不同格式的檔案。我聽說 SQL Server 有整合的功能可以讓我搜尋這些不同的檔案格式。我要如何設定 SQL Server 這麼做？
答：這項功能是內建在全文檢索服務中。這個服務提供了使用 IFilter 介面的彈性，因此能夠開發和載入從專利資料擷取實用資訊的篩選器。其他產品 (像是 Microsoft® Office SharePoint® Server) 也可以使用這些 IFilter，來收集編目檔案的相關資訊。
IFilter 是由檔案格式的建立者或是協力廠商所提供。SQL Server 已經含有一些在安裝 FulltextService (FTS) 時所載入的 Ifilter (其中包括 HTML 和 DOC 檔案的篩選器)，不過必要時也可以另外加入其他的 IFilter。例如，Adobe 網站上就提供了 Adobe PDF 用的篩選器，2007 年底也發行了 2007 Office System 延伸模組用的新篩選器套件。但是您必須知道您所需要的是哪一個版本的 Ifilter。比方說，針對 32 位元系統設計的 Ifilter，就不能用於 64 位元的 SQL Server 安裝版本。
在用戶端上執行安裝封裝後，一般會在 OS 的生態系統內註冊 IFilter。在 OS 註冊位元之後，必須再執行幾個步驟，讓 FTS 能夠載入 IFilter。當您啟動查詢執行工具之後，請發出下列命令：
  • sp_fulltext_service 'load_os_resources',1 (這個陳述式會讓 FTS 載入註冊的位元以進行處理，其中包括像是文字分隔和字幹等元件)。
  • sp_fulltext_service'verify_signature',0 (此處 SQL Server 不會檢查使用的篩選器是否經過簽署，因為很多廠商都不根據標準簽署他們的篩選器)。
  • 重新啟動 SQL Server 執行個體和 FTS 的執行個體。
  • 在下面兩種資料行上建立全文檢索：將二進位資料列作為供 IFilter 編目的內容的資料行，以及讓 SQL Server 選擇要將哪個篩選器的內容重新導向哪個篩選器的延伸資料行 (表示含延伸類型的資料行，例如 DOCX)。
如需其他詳細資訊，請參閱 go.microsoft.com/?linkid=7912971。
—Jens Suessmeyer

問：我連不上遠端 SQL 伺服器。我需要在用戶端還是伺服器電腦上設定防火牆呢？
答：SQL Server 2005 遠端連線失敗的原因有很多，而防火牆組態只是最常見的問題之一。SQL 通訊協定部落格 (blogs.msdn.com/sql_protocols) 是尋找有關進行 SQL 連線資訊的絕佳資源。
SQL Server 2005 的預設安裝並不允許遠端連線。請在執行 SQL 的電腦上，從 [開始] 功能表選取 [Microsoft SQL Server 2005] | [組態工具] | [SQL Server 介面區組態]。再從此處前往 [服務和連接的介面區組態]、選取 [遠端連線]，然後選取 [使用 TCP/IP 和具名管道] 選項按鈕。接下來必須重新啟動 SQL，讓變更生效。
根據預設，SQL Server 會使用連接埠 1433。若要確認此連接埠處於開啟狀態，請使用下面的 telnet 命令，把 <ipaddress> 換成執行 SQL Server 之電腦的實際 IP 位址：
telnet <ipaddress> 1433
如果您收到連線失敗的回應，請開啟 Windows® 防火牆、前往 [例外狀況] 索引標籤、選取 [新增連接埠]，然後新增 TCP 連接埠 1433。這樣 Telnet 應該就能順利運作了 (請注意，Windows Vista® 預設並不會安裝 Telnet)。
—Rick Anderson
感謝下列 SQL Server 專家對本專欄的貢獻：
Justin Langford 服務於 Coeo Ltd.，這是一家位於英國的系統整合廠商和微軟認證夥伴 (Microsoft Certified Partner)。Jens Suessmeyer 是德國 Microsoft 的資料庫顧問。Rick Anderson 任職於 Microsoft 的開發人員使用者教育 (Developer User Education) 小組。Saleem Hakani 在 Microsoft 擔任資深資料庫工程師兼 SQL Server 社群組長。


 公用程式焦點: Web Capacity Analysis Tool
公用程式焦點
Web Capacity Analysis Tool
Greg Steen

網頁記錄 和歷程記錄流量分析或許可讓您洞察在經過一段時間之後可預期什麼樣的流量，但您要如何確知基礎結構真正的處理能力？若要深入了解，您需要有能夠發揮基礎結構及其應用程式堆疊極限的工具。其中一項工具就是免費的 Web Capacity Analysis Tool (WCAT)，這是輕量級的負載產生公用程式，可向網頁伺服器 (或是負載平衡的伺服器陣列) 執行指令碼式的 HTTP 要求，並同時收集效能統計資料以供後續分析。最新版 (撰寫本文時為 6.3.1) 可供 x86 與 x64 Windows 系統使用 (x86：iis.net/downloads/1466/ItemPermaLink.ashx；x64：iis.net/downloads/1467/ItemPermaLink.ashx)，同時也支援 IPv6 網路。WCAT 除了是多執行緒之外，還支援從單一來源所控制的多負載測試用戶端，以便模擬數千名並行使用者。
透過這個公用程式，您可以將舊電腦改作為測試用戶端，而且測試用戶端分別能產生多個虛擬用戶端 (虛擬用戶端的數目上限需視網路介面卡和用戶端電腦的其他硬體而定)。您可以在有或沒有 SSL 的情況下選擇 HTTP 1.0 或 HTTP 1.1 要求。再者，如果測試案例有此需求，您也可以使用指令碼式的基本驗證或 NTLM 驗證來存取網站上那些受限制的部分 (如果您的網站使用 Cookie、表單或工作階段架構的驗證，您可以建立正確的 GET 或 POST 要求以驗證測試使用者)。WCAT 還會管理您的網站可能設定的各種 Cookie，藉此保存設定檔及工作階段資訊。
WCAT can help you test the limits of your Web site infrastructure
WCAT can help you test the limits of your Web site infrastructure
WCAT 隨附完備的使用者指南，可輔助您快速建立 Microsoft® .NET Framework 主控台應用程式，進而根據網站流量和歷程記錄所得的使用者流量資料來產生測試用戶端指令碼，好讓我在著手部署之前，先於新的程式碼基底上模擬真實世界的流量。如果員工裡面有 C 程式設計師，您可以建立自訂函式與回應處理常式，並由案例檔案呼叫來訂製適合您的環境的功能。
若要使用 WCAT，您必須設定兩個檔案，一個是包含一般測試設定 (例如，用戶端數目、每個用戶端的虛擬用戶端、要追蹤的效能計數器以及您要測試的網頁伺服器) 的控制器檔案；另一個則是包含測試案例、預設要求參數以及自訂函式與程式庫參考的案例檔案。
此應用程式會將測試結果記錄到 XML 檔案，您可以對此檔案套用隨附的 XSL 樣式表，以便在 Internet Explorer® 中檢視結構分明的結果表格。報告包含摘要資訊，例如執行的交易數量、發生過的內容切換、CPU 使用率百分比 (所有 CPU)，以及遇到的錯誤總數。另外還有一個區段會列出您在設定檔中設定的效能計數器結果 (相關範例請參閱螢幕擷取畫面)、回應時間分析、各交易的統計資料報告、每個用戶端的明細區段，以及關於測試案例如何設定的資訊。此外，您會看到所測試之遠端網頁伺服器的硬體組態，再加上所有已安裝的更新列表。這是判斷和追蹤修補程式對於您的網站有無效能影響的好方法。
總而言之，若您負責管理網站基礎結構，WCAT 公用程式可協助您在下一次重大程式碼發行前，精確掌握您的平台在壓力下執行的狀況。

Greg Steen 是一位技術專家和企業家，為人十分熱心。他總是四處探尋新的工具，協助 IT 專家更輕鬆地進行操作、品管及開發。


 The Cable Guy: 疑難排解 NAP 強制的問題
The Cable Guy
疑難排解 NAP 強制的問題
Joseph Davies

內建在 Windows Vista、Windows Server 2008 和 Windows XP SP3 的新網路存取保護 (NAP) 平台，可以強制遵守電腦健康需求，協助保護您的私人內部網路。NAP 的主要元件是 NAP 用戶端、NAP 強制端點以及 NAP 健康原則伺服器。
NAP 用戶端是一部可提供健康狀態資訊用於評估系統健康的電腦。NAP 強制端點是一部電腦或網路存取裝置，它使用 NAP 或者與 NAP 合作，要求評估 NAP 用戶端的健康狀態，並且提供有限的網路存取或通訊。NAP 健康原則伺服器是一部執行 Windows Server® 2008 和網路原則伺服器 (NPS) 服務的電腦，它會儲存健康需求原則並且執行 NAP 用戶端的健康評估。NAP 健康原則伺服器和 NAP 強制端點負責與遠端驗證撥入使用者服務 (RADIUS) 伺服器和 Proxy 訊息，交換系統健康資訊以及限制存取指示。
在本專欄中，我將一一說明健康需求原則的元件、NPS 服務如何處理連入要求以進行 NAP 評估，以及如何疑難排解 NAP 強制的常見問題。

健康需求原則
NAP 健康評估的運作方式
NAP 健康原則伺服器上的 NPS 服務採用下述程序來執行健康評估：
  1. NPS 服務將連入要求訊息與其經過設定的連線要求原則集互相比較。對 NAP 來說，要求訊息應該符合指定 NPS 服務在本機執行驗證和授權的連線要求原則。
    2. 連線要求原則也可以強加連線需求。比方說，如果是 802.1X 和 VPN 強制，連線要求原則會要求使用受保護的可延伸驗證通訊協定 (PEAP) 型的驗證方法。如果連線用戶端不使用 PEAP，連線要求就會遭到拒絕。
  2. NPS 服務會評估要求訊息中的健康資訊，這些健康資訊是由包含健康狀態資訊的系統健康聲明 (SSoH) 所組成。NPS 服務將健康狀態資訊傳給它所安裝的 SHV，再由 SHV 將健康評估資訊傳回給 NPS 服務。
  3. 接著 NPS 服務將要求訊息和 SHV 傳來的健康評估資訊，與適當的網路原則集比照。健康評估資訊會與 NAP 網路原則的健康原則條件做比較。健康原則條件會指定符合或不符合健康的條件。接著 NPS 服務將第一個符合的網路原則，套用到要求訊息。
  4. NPS 服務根據符合的 NAP 網路原則及其相關的 NAP 設定，建立一個系統健康回應聲明 (SSoHR)。這個回應包含 SHV 所傳來的健康評估資訊，它指出 NAP 用戶端具備的存取權是限制亦或無限制，以及 NAP 用戶端是否應該自動修復其健康狀態。
  5. NPS 服務將 RADIUS 回應訊息連同 SSoHR 一起傳給 NAP 強制端點。如果用戶端已獲有限制存取權，回應訊息也可能包含指定限制 NAP 用戶端存取權的指示。
  6. 接著 NAP 強制端點再將 SSoHR 傳給 NAP 用戶端。

健康需求原則結合了連線需求原則、一或多個網路原則、一或多個健康原則，以及 NAP 強制方法的 NAP 設定。若要建立健康需求原則，請使用 [網路原則伺服器] 嵌入式管理單元中的「設定 NAP 精靈」。(有關評估程序的詳細資訊，請參閱「NAP 健康評估的運作方式」資訊看板)。
連線要求原則 連線要求原則是依序排好的規則集，容許 NPS 服務決定連入連線要求應該在本機處理，還是轉送到另一部 RADIUS 伺服器。NAP 健康原則伺服器是在本機處理連線要求。
Windows® NAP 強制端點發出的連入 RADIUS 要求，可包含指定像動態主機設定通訊協定 (DHCP) 伺服器或虛擬私人網路 (VPN) 伺服器等 NAP 強制端點類型的來源標記。
如果連入要求訊息包含來源標記，NAP 健康原則伺服器上的 NPS 服務只會根據那些具有相符來源的連線要求原則，尋找相符的要求 (其他連線要求原則一律不管)。如果連入要求訊息不含來源標記，則 NPS 服務會根據具有未指定之來源的連線要求原則，尋找相符的要求 (其他有指定來源的連線要求原則一律不管)。
比方說，NAP DHCP 伺服器發出的連入要求，會指定 DHCP 的來源標記。NPS 服務會盡量根據含有 DHCP 來源的連線要求原則，在 DHCP 伺服器發出的要求中尋找相符的要求。 啟用 802.1X 的交換器和無線存取點發出的連入要求，不會指定來源標記。因此 NPS 服務會根據沒有指定來源的連線要求原則，在這些要求中尋找相符的要求。
本機或遠端處理評估所用的連線要求原則，是套用到連入要求的部分原則清單中 (該清單中的原則將依序排列)，第一個相符的連線要求原則。如果該要求不符合任何連線要求原則，就會遭到拒絕。
網路原則 網路原則是經過排序的規則集，它會指定與連入要求訊息相對應的連線嘗試是在何種情況下通過授權或遭到拒絕。每一項規則都有一個存取權限 (授予權限或拒絕權限)、一組條件、一組條件約束以及網路原則設定。如果連線獲得授權，網路原則條件約束和設定便可以指定一組連線限制。對於 NAP 來說，網路原則可以指定一個健康原則條件來查驗健康需求和強制行為設定。
與連線要求原則一樣，網路原則也是使用來源標記，來決定要以哪些網路原則尋找相符的連入要求。如果連入要求訊息包含來源標記，NPS 服務只會根據那些具有相符來源的網路原則，尋找相符的要求 (其他網路原則一律不管)。如果連入要求訊息不含來源標記，則 NPS 服務會根據具有未指定之來源的網路原則，尋找相符的要求 (其他有指定來源的網路原則一律不管)。
授權或健康評估所用的網路原則，是套用到連線嘗試的原則子集排序清單中第一個相符的網路原則。如果該嘗試不符合任何網路原則，就會遭到拒絕。
健康原則 健康原則可讓您就安裝的系統健康狀態驗證 (SHV) 這方面來指定健康需求 (用於健康評估)，以及 NAP 用戶端必須通過還是不用通過任何或所有選定的 SHV。比方說，合格 NAP 用戶端的健康原則，可以指定用戶端必須通過所有的健康檢查。而不合格 NAP 用戶端的健康原則，可以指定用戶端至少不通過一個健康檢查，或者所有的健康檢查都不通過。
網路存取保護設定 網路存取保護設定包括針對健康需求和錯誤狀況而安裝在 NAP 健康原則伺服器的 SHV 設定，以及補救伺服器群組，後者會指定一組伺服器，供對 DHCP 和 VPN 強制方法具有限制網路存取權之不合格 NAP 用戶端進行存取。

定出 NAP 強制問題的範圍
邏輯方法可以幫助您排解任何問題的疑難。下面是在進行疑難排解時最常見的問題：哪一個適用？哪一個不適用？適用者和不適用者之間有何關聯性？不適用者過去曾經適用過嗎？如果曾經適用過，那麼自從上次適用之後，有哪些改變？
這些問題在處理 NAP 強制問題時，明顯有越來越受重視的傾向。連線或連線能力是否在部署 NAP 強制方法之前就能使用？比方說，網際網路通訊協定安全性 (IPsec) 伺服器或網域隔離是否在部署 IPsec 強制之前就能使用？802.1X 驗證是否在部署 802.1X 強制之前就能使用？VPN 遠端存取是否在部署 VPN 強制之前就能使用？DHCP 是否在部署 DHCP 強制之前就能使用？
另外，特定的 NAP 強制方法之前是否曾經能夠使用？如果是，則 NAP 用戶端、NAP 強制端點或 NAP 健康原則伺服器後來又做了哪些改變？這些問題的答案，就可以告訴您該從哪裡著手進行疑難排解，說不定還能讓您隔離導致問題的元件、階層或設定問題。
在針對 NAP 強制問題進行一般的疑難排解時，必須先定出問題的範圍。第一步先釐清問題到底是不是 NAP 強制。如果是 IPsec 強制，判斷 NAP 用戶端是否有適合 IPsec 對等交涉和資料保護用的 IPsec 原則集。如果是 DHCP 強制，查明 NAP 用戶端是否能夠與 DHCP 伺服器交換 DHCP 訊息。如果是 802.1X 和 VPN 強制，則判斷 NAP 用戶端是否能夠順利進行驗證。比方說，如果您的 VPN 用戶端無法執行 VPN 連線的驗證，請驗證 VPN 用戶端的驗證設定和認證。
如果您確認問題是 NAP 強制，接下來就要定出範圍。所有 NAP 強制方法的所有 NAP 用戶端都會受到影響嗎？特定強制方法的所有 NAP 用戶端都會受到影響嗎？特定強制方法和 NAP 強制端點的所有 NAP 用戶端都會受到影響嗎？所有身為特定群組成員的 NAP 用戶端都會受到影響嗎？問題只會影響特定的 NAP 用戶端嗎？
比方說，如果您所有的 NAP 用戶端都不適合所有類型的 NAP 強制方法，也許您的 NAP 健康原則伺服器有設定問題。如果您所有的 NAP 用戶端在一遇到某個特定的 NAP 強制方法就會出現問題，表示設定問題是出在 NAP 用戶端的群組原則設定，或是 NAP 健康原則伺服器上該特定 NAP 強制方法的健康需求原則。如果只有特定的 NAP 用戶端會出現 NAP 強制問題，可能只有那些 NAP 用戶端有 NAP 強制的設定問題。

常見的 NAP 強制問題
NAP 資源
  • 網路存取保護簡介
  • 網路存取保護簡介平台架構
  • Windows Server 2008 的網路存取保護原則
  • NPS 網路存取保護

無限制存取 如果 NAP 用戶端具有無限制的存取權 (沒有任何限制)，可能是因為 NAP 用戶端已被 NAP 健康原則伺服器評為合格，而這正是您所要的。但是，獲得無限制存取權的原因，也可能是因為 NAP 用戶端沒有收到 SSoHR，而這是 NAP 用戶端沒有接受健康評估時常見的現象。如果沒有接受 NAP 健康評估，便不會有任何 SSoHR 傳回 NAP 用戶端，NAP 用戶端因而能夠無限制存取。
舉個例說，採用 DHCP 強制的 NAP 用戶端，會將它的 SSoHR 傳給它的 DHCP 伺服器。如果執行 Windows Server 2008 的 DHCP 伺服器不採用 NAP，便不會傳送健康評估要求訊息給 NAP 健康原則伺服器。此外，如果執行 Windows Server 2008 且採用 NAP 的 DHCP 伺服器，無法連接 NAP，那麼根據預設值，健康原則伺服器還是會指派一個無限制存取的位址設定。
如果 NAP 健康原則伺服器不執行健康評估，是因為連入要求符合一項不需要 NAP 健康評估的網路原則，也可能獲得無限制存取權。有關決定符合 NAP 用戶端要求的網路原則，請參閱本專欄的「逐步排解 NAP 強制的疑難」一節。
限制存取 具有限制存取權的 NAP 用戶端，已被 NAP 健康原則伺服器評為不合格。如果 NAP 用戶端具備限制存取權，但其實應該是具備無限制存取權，請根據對應於符合 NAP 用戶端要求之網路原則的健康原則設定，驗證 NAP 用戶端的健康狀態。
無自動修復 只要是經過妥善設定的 NAP 用戶端，都可以自動修復其健康狀態。如果 NAP 用戶端無法自動修復，請確認符合 NAP 用戶端要求之網路原則的 NAP 強制設定，有勾選 [啟用用戶端電腦的自動修復功能] 核取方塊。
另外，如果受限制的 NAP 用戶端無法連接補救伺服器來下載更新，也可能會影響自動修復功能。如果是 IPsec 強制，請確認補救伺服器有套用正確的 IPsec 原則。如果是 802.1X 強制，請檢查指派存取控制清單 (ACL) 或虛擬區域網路識別碼 (VLAN ID) 的相符網路原則中的設定，並且確認交換器或無線存取點 (AP) 的 ACL 或 VLAN 設定。如果是 VPN 或 DHCP 強制，請檢查相符網路原則中有關補救伺服器群組的設定，並且確保所有的補救伺服器都設定為該群組的成員。如果是 DHCP 強制，請確保 NAP 用戶端的 DHCP 範圍選項有妥善設定，例如，NAP 使用者類別的 [預設閘道] 選項值。
不支援 NAP 的評估 對於任何一種 NAP 強制方法，請確認 NAP 用戶端有啟用對應的強制用戶端。如果是 802.1X 和 VPN 強制，請確認 NAP 用戶端有針對連線要求原則和 NAP 用戶端上啟用的 PEAP 驗證方法進行系統健康檢查 (有選取 [受保護的 EAP 內容] 對話方塊中的 [啟用隔離檢查] 核取方塊)。
NAP 用戶端沒有受限，卻無法連接內部網路 如果是 IPsec 強制，請查驗合格 NAP 用戶端的 IPsec 原則，以及內部網路電腦的 IPsec 原則，有一組共用的交涉和保護設定。如果是 802.1X 強制，請確認合格 NAP 用戶端的網路原則是指定內部網路 (而不是限制網路) 的 ACL 或 VLAN ID。請查驗交換器或無線 AP 上內部網路的 ACL 或 VLAN ID 設定。如果是 VPN 強制，請確保網路原則沒有針對限制 VPN 用戶端流量的合格 NAP 用戶端，設定 IP 封包篩選器。

逐步排解 NAP 強制的疑難
要疑難排解特定 NAP 用戶端的 NAP 強制問題，其中一個方法是從 NAP 用戶端的設定著手，檢查 NAP 用戶端事件記錄，然後前往 NAP 健康原則伺服器，以判斷 NPS 服務處理 NAP 用戶端要求的方式。
步驟 1：檢查 NAP 用戶端設定 NAP 用戶端設定是由 Windows 服務、強制用戶端和 NAP 強制專屬的設定所組成。若要顯示 NAP 用戶端狀態和設定資訊，請使用 netsh nap client show state 和 netsh nap client show configuration 命令。
請注意，如果 NAP 用戶端設定是由群組原則所提供，則所有的 NAP 用戶端設定便會由群組原則指定，所有的本機 NAP 用戶端設定一律略過不管。碰到這種情況時，請使用 netsh nap client show grouppolicy 命令，來顯示以群組原則為主的 NAP 用戶端設定，並且透過群組原則進行變更。
如果是在執行 Windows Vista® 的電腦上採用 IPsec 強制，請使用 net start 命令，確認網路存取保護代理程式、IKE 和 AuthIP IPsec 金鑰處理模組以及 IPsec 原則代理程式服務已經啟動。並且使用 netsh nap client show configuration 命令，確認 IPsec 信賴憑證者強制用戶端已經啟用。必要時，請使用 [NAP 用戶端設定] 嵌入式管理單元來啟用 IPsec 信賴憑證者強制用戶端，或是使用 netsh nap client set enforcement 79619 enabled 命令。Netsh nap client set enforcement 命令應該以較高的權限，從命令提示字元執行。
如果是在執行 Windows Vista 的電腦上採用 802.1X 強制，請使用 net start 命令，確認可延伸驗證通訊協定、網路存取保護代理程式、有線自動設定 (用於有線連線的 802.1X 強制)，以及 WLAN 自動設定 (用於無線連線的 802.1X 強制) 服務已經啟動。
接著再度使用 netsh nap client show configuration 命令，確認 EAP 隔離強制用戶端已經啟用。必要時，請使用 [NAP 用戶端設定] 嵌入式管理單元來啟用 EAP 隔離強制用戶端，或是使用 netsh nap client set enforcement 79623 enabled 命令。並查驗有線或無線連線的受保護 EAP 驗證方法的內容，已勾選 [啟用隔離檢查] 核取方塊。
如果是在執行 Windows Vista 的電腦上採用 VPN 強制，請使用 net start 命令，確認可延伸驗證通訊協定、網路存取保護代理程式和遠端存取連線管理員服務已經啟動。
請使用 netsh nap client show configuration 命令的顯示畫面，確認遠端存取隔離強制用戶端已經啟用。必要時，請使用 [NAP 用戶端設定] 嵌入式管理單元來啟用遠端存取隔離強制用戶端，或是使用 netsh nap client set enforcement 79618 enabled 命令。並查驗 VPN 連線的受保護 EAP 驗證方法的內容，已勾選 [啟用隔離檢查] 核取方塊。
如果是在執行 Windows Vista 的電腦上採用 DHCP 強制，請使用 net start 命令，確認網路存取保護代理程式和 DHCP 用戶端服務已經啟動。必要時，請使用 [服務] 嵌入式管理單元或 Sc.exe 工具來啟動這些服務，並且設定讓它們自動啟動。
請使用 netsh nap client show configuration 命令的顯示畫面，查驗 DHCP 隔離強制用戶端已經啟用。必要時，請使用 [NAP 用戶端設定] 嵌入式管理單元來啟用 DHCP 隔離強制用戶端，或是使用 netsh nap client set enforcement 79617 enabled 命令。
步驟 2：檢查 NAP 用戶端事件日誌 請使用 [事件檢視器] 嵌入式管理單元，檢查網路存取保護代理程式服務所建立的事件日誌中的事件。如果是執行 Windows Vista 的電腦，請使用事件檢視器嵌入式管理單元，檢視 [應用程式及服務記錄檔]\[Microsoft]\[Windows]\[網路存取保護]\[操作] 中的事件。如果是執行 Windows XP 含 SP3 的電腦，則使用 [事件檢視器] 嵌入式管理單元，檢視系統事件日誌中的 NAP 事件。
請從 NAP 用戶端事件取得 NAP 用戶端健康評估的交互關聯識別碼。您可以使用 NAP 用戶端的交互關聯識別碼或電腦名稱，來尋找 NAP 健康原則伺服器上對應的健康評估事件。[圖 1] 顯示含有交互關聯識別碼之不合格 NAP 用戶端的事件範例。
Figure 1 Windows Vista NAP 用戶端事件的範例
Figure 1 Windows Vista NAP 用戶端事件的範例
步驟 3：檢查 NPS 事件日誌 在 NAP 健康原則伺服器上，請使用 [事件檢視器] 嵌入式管理單元，檢視由 NPS 服務所建立的 [Windows 記錄]\[安全性記錄檔] 中的事件。若要檢視 NPS 事件，請在事件檢視器中先後開啟 [自訂檢視] 和 [伺服器角色]，然後再按一下 [網路原則與存取服務]。若要檢視與該事件相關的線上說明主題，請在該事件的 [一般] 索引標籤上，按一下 [事件日誌線上說明] 連結。
一般的 NAP 健康評估事件都有事件識別碼 6278 (無限制存取) 或 6276 (限制存取)。請根據 NAP 用戶端的電腦名稱 (事件描述的 [用戶端電腦] 區段中的 [帳戶名稱] 欄位) 或交互關聯識別碼 (事件描述的 [隔離資訊] 區段中的 [工作階段識別碼] 欄位)，尋找對應的 NAP 健康原則伺服器事件。
NPS 事件日誌的事件 6278 和 6276 包含 NAP 健康評估的相關資訊，例如，相符連線要求原則的名稱 (事件描述的 [驗證詳細資料] 區段中的 [Proxy 原則名稱] 欄位)，以及相符網路原則的名稱 (事件描述的 [驗證詳細資料] 區段中的 [網路原則名稱] 欄位)。[圖 2] 是事件識別碼 6276 的 [詳細資料] 索引標籤的範例，其中包含 Proxy 原則名稱、網路原則名稱和交互關聯識別碼 (名稱為 QuarantineSessionID)。這是 [圖 1] 當中對應到 Windows Vista NAP 用戶端事件的 NAP 健康原則事件。
Figure 2 NAP 健康原則伺服器事件的範例
Figure 2 NAP 健康原則伺服器事件的範例
如果沒有任何事件對應到 NAP 用戶端事件，請確認已啟動網路原則伺服器服務，已妥善設定 NAP 強制端點來執行 NAP，並且已將 NAP 健康原則伺服器作為 RADIUS 伺服器使用。另外還要查驗 RADIUS 訊息可以在 NAP 強制端點和 NAP 健康原則伺服器之間傳送。
只要遵守上述三個步驟，應該就可以順利找出 NAP 強制無法正常運作的原因。如需 NAP 的詳細資訊，請參閱「NAP 資源」資訊看板。

Joseph Davies 是 Microsoft 的技術文件作家，自 1992 起開始教授及撰寫有關 Windows 網路方面的課程與文章。他曾為 Microsoft Press 寫過八本書，目前擔任 TechNet 每月《Cable Guy》線上專欄的作者。


 Windows PowerShell: 請在此簽名
Windows PowerShell
請在此簽名
Don Jones

在 2008 年 1 月份的 Windows PowerShell 專欄中，我特別強調過數位簽署 Windows PowerShell 指令碼的重要性。我也討論了一些案例來說明 AllSigned 以外的其他任何執行原則將會在環境中造成重大的安全性漏洞。
有一點我尚未詳細講解，就是如何確實簽署指令碼。您可以參閱以下網址的專欄：http://technet.microsoft.com/zh-tw/magazine/cc137728.aspx。猜猜看本月討論的主題是什麼？

不只是簽章
簽章正是我要討論的技術名詞，不過這個用語本身並不能完全闡述它在本文中的用途。與合約或信用卡帳單不同，簽署指令碼並不表示您核准或授權它。在數位安全性的世界中，簽署是一種將您的身分識別添附到某事物的處理程序，並確保「某事物」未遭到任何形式的修改。這全都是以密碼編譯為基礎，而且此密碼編譯 (至少在本例中) 會以一組加密金鑰為開頭。
這些金鑰指的是非對稱金鑰，因為這些金鑰彼此互異。這個組合包含一個只有您能存取的私密金鑰，還有一個任何人都能存取的公開金鑰。簡單來說，基本上所有使用私密金鑰加密的內容都只能以對應的公開金鑰解密。
以下是它的運作方式。同樣地，我會透過簡化的方式來討論這個過程。我有一個要簽署的 Windows PowerShell® 指令碼，還有包含要用來簽署指令碼的私密金鑰的憑證。Windows PowerShell 本身的某個命令程式可以利用指令碼和憑證進行實際的簽署，稍後我會談到。進行簽署時，Windows PowerShell 使用我的私密金鑰來加密該指令碼。加密過的複本看起來像無意義的文字，以一連串註解的形式加入指令碼底端 (見 [圖 1])。我的身分識別也編碼到這些註解中，但未加密 — 身分識別本身無須密碼編譯就可以解讀。
Figure 1 簽章區塊存放在指令碼底端
Figure 1 簽章區塊存放在指令碼底端
稍後，當 Windows PowerShell 檢查簽章時，便會解碼我的身分識別並使用此身分識別來取得我的公開金鑰。由於只有我的公開金鑰可以解密簽章的其餘部分，因此 Windows PowerShell 知道假如這個公開金鑰可以解密簽章，就表示簽署的人一定是我。如果是其他人簽署的，我的公開金鑰便無法解密該簽章。一旦解密簽章之後，Windows PowerShell 會比較指令碼與加密至簽章的複本。如果兩者相符，則表示簽章完整無缺。如果兩個指令碼不同，簽章便會損毀，且視為無效。
這就是簽章如何保護純文字指令碼避免被偷改的方法。請記住，雖然指令碼本身很容易被更改，但是除非使用我的私密金鑰，否則簽章不可能變更成與修改過的指令碼相符 — 而且只有我才擁有我的私密金鑰。
我所描述的基本技術程序已經過大幅簡化。在現實生活中，簽章可以包含更多資訊，而且往往也是如此，例如公開金鑰的複本、關於發行金鑰的憑證授權單位 (CA) 的相關資訊等等。但是我在此所做的說明的確捕捉了這個程序的重要部分，也強調出簽章事實上可以保護您的指令碼避免未經授權的修改。
關鍵性的安全要素在於嚴密保護您的私密金鑰 — 您不會希望它落入他人之手。在 Windows 中安裝金鑰時，您應該立即使用密碼保護它，以免惡意處理序在您不知情的狀況下使用您的金鑰。包含您的私密金鑰的智慧卡可以提供更完善的安全性。透過使用智慧卡，您的私密金鑰永遠不會離開這張卡。相對來說，您要加密的資料會經由讀取器硬體傳輸到智慧卡上，而智慧卡本身的電路會執行加密並傳回結果。

取得憑證
本月指令程式：Export-CSV
PowerShellCommunity.org 的論壇成員常詢問 Windows PowerShell 可否匯出到 Microsoft Excel®。當然沒問題！Export-CSV 指令程式的功用就在此，因為 Excel 原本就可以開啟、編輯和儲存 CSV 檔案。舉例而言，若您要匯出服務清單，只要執行 Get-Service | Export-CSV MyServices.csv 即可。事實上，您可以將 Export-CSV 貼到任何管線尾端，那麼該管線中的所有物件都會包含在您指定的 CSV 檔案中。根據預設，Export-CSV 在檔案頂端加入標題行，以用來指定所匯出的物件類型。這一行是註解，因此不會阻礙 Excel 開啟檔案。若您不希望匯出類型資訊，只需要在 Export-CSV 中加入 -notype 參數即可。此外，您可以在不顯示提示的情況下 (預設會提示) 加入 -force 參數來強制覆寫包含相同名稱的現有 CSV 檔案，也可以加入命名巧妙的 -noClobber 參數來防止覆寫現有檔案。

若要簽署指令碼，您需要特定類型的憑證 — 第三級 Authenticode 程式碼簽署憑證 (Class III Authenticode Code-Signing Certificate) — 取得此憑證的方法有三種。第一種方法是使用貴公司內部公開金鑰基礎結構 (PKI)，若有的話。實作完善的 PKI 有一個貴公司所有電腦都信任的根 CA — 若要在組織中使用 CA 發行的憑證，這是必備條件。
Windows Server® 自 Windows® 2000 起即隨附自己的憑證伺服器軟體，您可以使用此軟體來建立自己的 PKI。成熟的 PKI 實作需要詳細規劃，但是如果您使用 PKI 的唯一目的是發行程式碼簽署憑證，就不需要這麼大費周章。只要使用群組原則將 CA 根憑證發送到電腦中，這些電腦就會信任它。
第二種選擇是使用商業 CA。使用商業 CA 的優點之一是，如果您選擇其中一種主要 CA，貴公司內的電腦可能已經設為信任該 CA 的憑證 (請注意，Windows XP 在預設情況下信任大部分的商業 CA，但是 Windows Vista® 根據預設只信任一小部分)。其中一個常見的商業 CA 是 VeriSign (verisign.com)。其他還有一些值得一探究竟的商業 CA，像是 CyberTrust (cybertrust.com) 和 Thawte (thawte.com)。
取得程式碼簽署憑證的第三種作法，是使用 Makecert.exe 之類的工具建立自己的自我簽署憑證。這個工具包含在 Windows Platform SDK 內，也會安裝在某些版本的 Microsoft® Office 中，另外還有很多地方可以看到它的蹤跡。自我簽署憑證的好處除了它是免費的之外，還不需要任何基礎結構。而壞處則是它只能用於您的電腦上。但如果您只需要在您的電腦上啟用指令碼執行 — 進行程式碼簽署測試或一般實驗 — Makecert.exe 就是一個很棒的選項。有關此工具的說明文件請參閱以下網址：http://msdn2.microsoft.com/zh-tw/library/bfsktky3(VS.80).aspx。但要小心的是，這個工具的許多版本已存在多年，因此您的電腦所執行的舊版本與說明文件描述的運作方式可能會有出入。
有了 Makecert.exe 之後，您就可以建立自我簽署的憑證，方法從 Windows PowerShell 命令列是執行下列命令 (可別讓我抓到正在閱讀這篇專欄的讀者使用 cmd.exe)：
makecert -n "CN=MyRoot" -a sha1 –eku
1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer
–ss Root -sr localMachine
接著執行下列命令：
makecert -pe -n "CN=MyCertificate" -ss MY
–a sh1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk
–c root.cer
Makecert.exe 會提示您輸入密碼以保護金鑰，然後便會建立憑證。您可以在 Windows PowerShell 中執行以下程式碼來確認安裝：
gci cert:\CurrentUser\My -codesigning
這會顯示 CERT: 磁碟機 (就是您的 Windows 憑證存放區) 中屬於程式碼簽署憑證的所有項目清單。附帶一提，這些資訊也全都記錄在 Windows PowerShell 中。若要尋找該說明文件，只要執行 help About_Signing，然後參閱接下來的幾個畫面即可。

簽署指令碼
現在既然有了憑證和指令碼 (您可以視需要快速建立一個指令碼，以供測試之用)，就可以開始簽署指令碼。使用 Windows PowerShell 來進行簡單的不得了 — 只要輸入：
$cert = @(gci cert:\currentuser\my
-codesigning)[0]
Set-AuthenticodeSignature myscript.ps1 $cert
第一個部分會擷取首先安裝的程式碼簽署憑證 (如果您安裝了多個憑證，而且想要使用第一個以外的憑證，只要適當變更 "0" 這個數字即可)。第二個部分會簽署檔案 (當然，您必須變更成相符的檔名)。就是這麼簡單！不過老實說，我覺得 Set-AuthenticodeSignature 指令程式名稱沒必要這麼長，因此我建立了稱為 Sign 的別名。現在，我只要如下執行：
Sign myscript.ps1 $cert
開啟這段指令碼，您會看到簽章區塊被插到底部。試著使用設為 AllSigned (Set-ExecutionPolicy AllSigned) 的執行原則來執行此指令碼，應該能正常運作。現在您要修改並儲存指令碼，不過請確認您沒有再次簽署它。Windows PowerShell 現在應該會直接拒絕執行修改過的版本，因為簽章已損毀。

一切都值得
這些程序步驟這麼麻煩，真的值得嗎？想要編寫一些系統管理工作的指令碼，又不想花 500 美元取得憑證或實作全新的基礎架構項目，這樣要求會太過份嗎？坦白說，我自己也是系統管理員，您的顧慮我也懂。但是答案很簡單，您所花的一切努力絕對都值得。
事實就是，維護安全性總是會牽涉或多或少的麻煩事。防毒軟體可能會造成您的不便，可是您不可能不使用它。防火牆軟體更是討厭，但您也知道，不使用防火牆執行系統就不安全。Windows Vista 使用者帳戶控制 (UAC) 可能也很麻煩，但是它能讓您的電腦更安全。而我們努力想達到的，不正是這樣強化的安全性嗎？
Windows PowerShell 是一個功能強大的工具，就像其他工具一樣，一定有可能被惡意使用者扭曲而變成安全性弱點。因此您必須採取各種步驟來遏止這些惡意使用者。
程式碼簽署是您所能採取的最佳行動，而且不必花費太多精力。譬如說，我使用圖形化指令碼編輯器，在我每次按下 [儲存] 時自動簽署我的指令碼，因此程式碼簽署對我來說幾乎沒什麼負擔。
即使沒有花俏的編輯器，您也可以不費吹灰之力。舉例來說，您可以建立自己的 Windows PowerShell 設定檔 (在您的文件資料夾中名為 WindowsPowerShell 的資料夾下建立檔案 Microsoft.PowerShell_profile.ps1)，然後加入以下函式：
function sign ($filename) {
  $cert = @(gci cert:\currentuser\my
-codesigning)[0]
Set-AuthenticodeSignature $filename $cert
}
現在您只要輸入下列內容就可以簽署指令碼：
Sign c:\scripts\myscript.ps1
當然，您要簽署的第一個指令碼應該就是設定檔指令碼。重點就是花幾個步驟，讓指令碼簽署盡可能方便使用，而不造成您的困擾。
專為發行程式碼簽署憑證而部署單一伺服器 PKI 並不需要費什麼功夫 (但是請記得，您確實需要調查並規劃您的 PKI，包括保護根 CA 和提供嚴重損壞修復，尤其是它還有其他用途的時候)。如果您是唯一一個需要在環境中執行指令碼的人，始終可以使用 Makecert.exe。請注意，About_Signing Windows PowerShell 說明主題也包括如何保障使用 Makecert.exe 所產生的憑證安全性的相關資訊。

Don Jones 是《Windows PowerShell: TFM and VBScript, WMI, and ADSI Unleashed》的作者。您可以透過 PowerShellCommunity.org 網站與他聯繫。


 嗨，Scripting Guy！: 重返資料庫指令碼
嗨，Scripting Guy！
重返資料庫指令碼
The Microsoft Scripting Guys
下載本文程式碼: HeyScriptingGuy2008_04.exe (151KB)

大家都知道， 如果說 Scripting Guy 有什麼弱點 (拜託，我們只是假設而已)，那就是：我們對於有做和沒做的事可能的後果過於憂心。我們不是像為了自己的利益而小心翼翼地採取行動，而總是為了眾人的利益而打拼。而且無論採取的行動對我們會產生什麼影響，我們仍然勇往直前。
就以資料庫指令碼的相關文章為例。坦白說，要寫關於資料庫指令碼的文章，對 Scripting Guy 來說並不容易。但原因並不是因為資料庫指令碼很難寫；資料庫指令碼其實蠻簡單的。問題在於，Scripting Guy 沒什麼機會處理資料庫；因此每次寫到資料庫的相關主題時，我們都得要停下來思考我們的行動。您可能早已經發現，要成為 Scripting Guy，思考絕對不是必要條件。
事實上，如果當初有人深思熟慮過，今天就沒有 Scripting Guy 了。
既然撰寫有關資料庫指令碼的文章對 Scripting Guy 來說這麼困難，為什麼我們還要繼續寫呢？答案很簡單：我們擔心如果我們不再寫這些文章，整個世界可能發生什麼不好的事。當推理作家科南道爾決定處死福爾摩斯 (讓他在《最後一案》中墜崖)，還以為只不過是擺脫了一個不想再寫的角色。但是，這麼做引起舉世激憤。據報導指出，真的有些倫敦市民在聽到消息後換上喪服。《最後一案》於 1893 年發表在史傳德雜誌 (The Strand Magazine) 上；為此，20,000 名讀者取消訂閱該雜誌。
這可不妙。
Scripting Guy 擔心如果停筆不寫有關資料庫指令碼的文章，可能也會導致類似的全球效應。我們不想讓這麼多人痛苦絕望，更不希望 20,000 名讀者取消訂閱《TechNet Magazine》。有鑑於此，我們宣布 Scripting Guy 將繼續撰寫有關資料庫指令碼的文章。何時呢？不如就現在吧！

將記錄加入資料庫
本月我們打算示範一些簡潔的小技巧來處理資料庫。當然，這些技巧不同於我們曾在 2007 年 9 月份專欄 (http://technet.microsoft.com/zh-tw/magazine/cc137809.aspx) 中討論過的技巧；就算是 Scripting Guy 也不至於卑劣到將完全相同的文章重複發稿兩次。
當然啦，除非我們有脫身之計，才會這麼做。
一開始，我們先教您一個簡單的方法將記錄加入資料庫中。假設有一個名為 C:\Scripts\Inventory.mdb 的資料庫，而且此資料庫中包含一個名為 Computers 的資料表。Computers 資料表包含下列欄位：
  • ComputerName
  • SerialNumber
  • UserName
  • Department
現在，我們要如何將新的電腦加入到該資料庫中？請看一下 [圖 1] 中的程式碼。
Figure 1 Adding a record to the Computers table (Close Figure 1)
Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = C:\Scripts\Inventory.mdb"

objRecordSet.Open "INSERT INTO Computers (ComputerName, SerialNumber, UserName, Department)" &  _
    "VALUES ('atl-ws-07', '11234', 'Ken Myer', 'Finance')", _
        objConnection, adOpenStatic, adLockOptimistic
這段指令碼的前幾行我們不討論；如果您需要相關的背景資訊，您可以參考指令碼中心提供的一些資源，網址是：http://www.microsoft.com/taiwan/technet/scriptcenter/default.mspx。重點是我們使用常數 adOpenStatic 和 adLockOptimistic 來控制資料錄集的指標類型和記錄鎖定 (的確，聽起來很了不起，但其實都是一些簡單的東西)。建立 ADODB.Connection 和 ADODB.Recordset 物件的執行個體後，接著使用以下命令來開啟資料庫：
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = C:\Scripts\Inventory.mdb"
附帶一提，該命令會開啟 Microsoft® Access® 2003 資料庫。若要開啟 Access 2007 資料庫，請改用以下命令：
objConnection.Open _
"Provider = Microsoft.ACE.OLEDB.12.0; " & _
"Data Source = C:\Scripts\Inventory.accdb"
雖然一開始有點偏離主題，不過您可以使用與下面類似的命令來開啟 SQL Server® 資料庫：
objConnection.Open _
"Provider=SQLOLEDB;" & _
"Data Source=atl-sql-01;" & _
"Trusted_Connection=Yes;" & _ "InitialCatalog=Inventory;" & _
"User ID=fabrikam\kenmyer;Password=34DE6t4G!;"
到目前為止，我們所示範的都是現成的程式碼；您馬上就會看到，幾乎所有資料庫指令碼都是以這幾行程式碼起頭。我們想要強調的是下行程式碼：
objRecordSet.Open _
  "INSERT INTO Computers " & _
  "(ComputerName, SerialNumber, " & _
  "UserName, Department) " & _
    "VALUES ('atl-ws-07', 'A14B1234', " & _
      "'Ken Myer', 'Finance')", _
        objConnection, adOpenStatic, _
        adLockOptimistic
在此，我們使用 INSERT INTO 查詢將新記錄插入到 Computers 資料表中。請注意，緊接在資料表名稱後面的是所有具有值的欄位，我們使用逗號分隔這些欄位名稱，並將這些名稱都放入括號內。
您可能會問：Scripting Guy 所說的「所有具有值的欄位」是什麼意思？問得好。假設這台新電腦尚未指派給 Department。假定資料庫可讓我們在 Department 欄位輸入 Null 值，我們就可以直接在清單中忽略 Department，而且不指派值給它。換句話說，我們可以撰寫如下的查詢：
objRecordSet.Open _
  "INSERT INTO Computers " & _
  "(ComputerName, SerialNumber, " & _
  "UserName) " & _
    "VALUES ('atl-ws-07', 'A14B1234', " & _
      "'Ken Myer')", _
        objConnection, adOpenStatic, _
        adLockOptimistic
說到指派值，欄位名稱後緊接著是什麼：VALUES 關鍵字再加上我們要為各個欄位指派的值 (這些值也會以括號括住)。請記住，當我們列出欄位名稱時，這些名稱可能以任何順序排列；比方說，我們把 ComputerName 放在第一位，雖然它可能不是資料庫中的第一個欄位。這對欄位名稱沒差，但是值可就不行。值必須完全依照欄位順序排列。如果第一個列出的欄位是 ComputerName，那麼第一個值必須是電腦名稱。不然就麻煩大了 (舉例來說，我們最後可能會將使用者名稱或序號指派到 ComputerName 欄位)。
您已經看到了，指派值並不複雜；只要確保您是根據資料類型而使用值格式就行了：日期和字串值應該包含在單引號中；數字和布林值則不應該包含在單引號中。
對了，如果您的值自己已經有單引號了 (例如名稱 O'Brien)，您就必須用兩個單引號來「逸出」：
'O''Brien'
出乎意料吧，但這是真的。

從資料庫刪除記錄
實在蠻酷的：我們只要執行單一 SQL 查詢就可以將記錄加入資料庫。還有什麼比這更棒的？據我們所知是沒有。
呃，除非能夠使用單一查詢來刪除資料庫的多筆記錄。
假設您的公司決定消滅人事部 (這不是開玩笑的，我們跟 Microsoft 人事部之間的麻煩事還真不少)。您如何從 Inventory 資料庫刪除所有 Human Resources 電腦？[圖 2] 顯示方法之一。
Figure 2 Deleting multiple records (Close Figure 2)
Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = C:\Scripts\Inventory.mdb"

objRecordSet.Open "DELETE * FROM Computers Where Department='Human Resources'", _
    objConnection, adOpenStatic, adLockOptimistic
如您所見，此特定指令碼的開頭與我們剛才加入新記錄的指令碼一模一樣：定義一些常數，建立幾個物件，然後連接到 Inventory.mdb 資料庫。接著我們直接使用 DELETE 查詢來刪除 Computers 資料表中的所有記錄 (*)，否則至少要刪除 Department 欄位等於 Human Resources 的所有記錄：
objRecordSet.Open _
  "DELETE * FROM Computers " & _
   "Where Department='Human Resources'", _
    objConnection, adOpenStatic, _
    adLockOptimistic
這就跟掉下懸崖一樣簡單。
無冒犯之意，福爾摩斯。

更新資料庫中的記錄
相信每個人都同意，刪除人事部的所有記錄真是其樂無窮 (僅致 Microsoft 人事部：我們是指對其他人和其他公司的人事部來說很有趣，不是我們，我們覺得一點兒都不好玩)。然而，從 Inventory 資料庫刪除所有 HR 電腦可能不是最佳的作法。為什麼？因為除非人事部員工帶著所有硬體潛逃 (聽起來正像他們的所作所為 — 算了，講好不開玩笑的)，那些電腦仍屬於貴公司；也就是說，那些電腦還是應該列入資料庫中。知道這一點之後，就來著手進行。我們不從資料庫刪除這些記錄，而只是更新每筆記錄；我們要直接將這些電腦的部門名稱從 Human Resources 改為 None。換言之，我們將執行如 [圖 3] 所示的指令碼。
Figure 3 Updating records (Close Figure 3)
Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = C:\Scripts\Inventory.mdb"

objRecordSet.Open "UPDATE Computers Set Department = 'None' " & _
    "Where Department = 'Human Resources'", _
    objConnection, adOpenStatic, adLockOptimistic
同樣地，這段程式碼中唯一的差異就是 SQL 查詢。在本例中，我們要使用 UPDATE 查詢來更新 Computers 資料表中的記錄。除了 UPDATE 關鍵字以外，我們還需要加入兩個參數，告訴查詢如何更新記錄和更新哪些記錄：
  • Set Department = 'None'，這只是指定 Department 欄位的新值。實際上，您可以使用類似下面的語法，同時設定不只一個欄位值：Set Department = 'None', UserName = 'None'。誠如您所看到的，這麼做會同時將 Department 和 UserName 欄位設為 None。
  • Where Department = 'Human Resources' 是標準的 Where 子句，表示要更新的記錄；在此，這代表所有 Department 欄位等於 Human Resources 的記錄。之所以要加入這個子句，原因很簡單：我們不是要修改資料庫中的所有記錄，而只要修改原先屬於人事部的記錄 (電腦)。
您可用 Update 查詢做一件蠻酷的事情，假設貴公司為了因應物價上漲，給每位員工加薪 10% (Scripting Guy 顯然與科南道爾有一點很像：我們的作品經常出現虛構的故事)。下面的指令碼可開啟名為 Employees 的資料表，並修改每位員工的 Salary 欄位。但是它要將 Salary 欄位設為什麼呢？查詢會將此欄位設為員工目前的薪水乘以 1.1；換句話說，也就是為每位員工加薪 10% (有這麼容易就好了！)請看看以下的查詢：
objRecordSet.Open _
  "Update Employees " & _
  "Set Salary = (Salary * 1.1)", _
    objConnection, adOpenStatic, _
    adLockOptimistic
這到底棒在哪裡呢？如您所見，您可以在 Update 查詢中進行計算。要是您決定將所有短期雇員的合約延長 60 天呢？此時，類似下面的查詢就派上用場了：
objRecordSet.Open _
  "Update TempEmployees " & _
  "Set ContractExpirationDate = " & _
  "(ContractExpirationDate + 60)", _
    objConnection, adOpenStatic, _
    adLockOptimistic

擷取資料的好方法
既然談到方便好用的查詢，我們就一鼓作氣介紹一些從資料庫擷取資料的好方法。舉例來說，有一個簡單但非常好用的指令碼。假設我們的 Inventory 資料庫包含名為 Price 的欄位，這個欄位理所當然地代表電腦的價格。想要知道公司中最貴的前五台電腦嗎？[圖 4] 中的範例程式碼可以告訴您答案。
Figure 4 Sorting the recordset (Close Figure 4)
Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = C:\Scripts\Test.mdb"

objRecordSet.Open "SELECT Top 5 * FROM Computers Order By Price", _
     objConnection, adOpenStatic, adLockOptimistic

objRecordSet.MoveFirst

Do Until objRecordset.EOF
    Wscript.Echo objRecordset.Fields.Item("ComputerName")
    objRecordset.MoveNext
Loop

objRecordSet.Close
objConnection.Close
您可以看到，在這個 SQL 查詢中我們做了兩件事：我們按照 Price 排序資料錄集 (Order By Price)，而且只要求取得前五名電腦 (也就是最貴的五台電腦)；SELECT Top 5 就是負責執行這個工作。若要取得前 10 名最貴電腦的清單，我們會使用以下查詢：
objRecordSet.Open _
  "SELECT Top 10 * FROM Computers " & _
  "Order By Price", _
    objConnection, adOpenStatic, _
    adLockOptimistic
注意：我們也加入了可遞迴處理資料錄集並顯示各台電腦名稱的程式碼。前面的指令碼不需要此程式碼，因為那些指令碼並不會傳回和顯示資料。
或者，我們可以使用以下查詢來取得前 10% 的結果：
objRecordSet.Open _
  "SELECT Top 10 PERCENT * " & _
  "FROM Computers Order By Price", _
    objConnection, adOpenStatic, _
    adLockOptimistic
現在，假如我們想要知道最便宜的電腦呢？沒問題；只要使用相同的方法，但這次我們是以遞減順序來排序資料錄集 (也就是從最低價排到最高價)。換句話說，我們使用這個查詢再加上 DESC 來指定以遞減順序排序資料錄集：
objRecordSet.Open _
  "SELECT Top 5 * FROM Computers " & _
  "Order By Price DESC", _
    objConnection, adOpenStatic, _
    adLockOptimistic
看到了嗎？早就說很好用吧。
另外還有兩件事您可能會感興趣。假設您的資料庫包含名為 Budgeted 的欄位，用來追蹤電腦原本的預算金額。想要比較實際成本與預算金額嗎？此查詢會傳回成本高於預算金額的電腦清單：
objRecordSet.Open _
  "SELECT * FROM Computers " & _
  "Where (Budgeted < Price)", _
    objConnection, adOpenStatic, _
    adLockOptimistic
此外，這項查詢還會計算所有電腦的平均價格 (SELECT AVG(Price) FROM Computers)，然後傳回所有成本低於平均價格的電腦清單：
objRecordSet.Open _
  "SELECT * FROM Computers " & _
  "WHERE Price < " & _
  "(SELECT AVG(Price) FROM Computers)", _
    objConnection, adOpenStatic, _
    adLockOptimistic
您說的沒錯，我們的確在 Where 子句中使用了 SELECT 查詢。究竟是怎麼運作的？說來話長，請待下期分曉。不過如您所見，本文的指令碼為我們開啟一扇大門，讓您利用 SQL 查詢擷取各式各樣有趣的資訊。

這個故事的寓意
我們在本月專欄一開始就說過了，我們不知道是否該寫另一篇關於資料庫指令碼的文章。不過我們很高興這麼做了，一部份的原因是我們相信您會覺得這些查詢很有用，另一部分的原因則是：如果現在不寫這篇專欄，遲早也要寫。畢竟，就連科南道爾也被逼得讓福爾摩斯死而復生。科南道爾先寫了一篇據說是發生在神探死亡之前的新的福爾摩斯故事，藉此試探風聲。不過由此以後，他就屈服於廣大讀者的壓力，編造出福爾摩斯裝死這樣的薄弱理由。結果是每個人、每件事都安然無恙。
有趣的是，推出最新的福爾摩斯故事後，又有 30,000 名新讀者訂閱史傳德雜誌 (The Strand Magazine)。心懷感激的英美出版商因此讓科南道爾成為世界上稿費最高的作家。
嗯，科南道爾帶回了眾人深愛的角色，成為全世界稿酬最高的作家；現在 Scripting Guy 帶回了大家最愛的主題 — 還不必裝死。不曉得《TechNet Magznie》那些仁慈的同事注意到沒？

Dr. Scripto 的指令碼謎題 (Scripting Perplexer)
這個每月一次的挑戰不僅測試您的解謎功力，更要測試您的指令碼技巧。

2008 年 4 月：選個字母
在本月的謎題中，您必須在藍色空格中插入 A 到 O 的字母，以便顯示 VBScript 函數的名稱。每個字母 (A 到 O) 都只能使用一次，而且這些字母不會按照字母順序顯示。插入的字母可以是函數名稱開頭、函數名稱結尾，或是函數名稱中的任何位置。比方說，在下行中您會插入字母 D 來完成函數名稱 IsDate：
現在您可以試試看；插入字母 A 到 O 來顯示格子中的 VBScript 函數名稱：

Dr. Scripto 的指令碼謎題 (Scripting Perplexer)
答案是：選個字母，2008 年 4 月

The Microsoft Scripting Guys 為 Microsoft 做事，也就是受雇於 Microsoft。他們在不玩、不教或不看棒球 (或者其他各種活動) 的時候，就負責管理 TechNet 指令碼中心。請造訪他們的網站：http://www.microsoft.com/taiwan/technet/scriptcenter/default.mspx。


 安全性監控: 我的 PII 在哪裡？
安全性監控
我的 PII 在哪裡？
Frank Simorjay

我們老是強調 PII (個人識別資訊) 是最需要保護的重要資訊。但是要保護 PII 之前，您必須先充分了解電腦上收集了哪些 PII。您或許會說電腦上的一切資料都是機密，但是所謂的一切資料究竟指的是什麼？
為了釐清這一點，一開始我會深入剖析問題本質，細分敏感的資料類型，並找出資料可能存放在電腦上的哪些位置。首先，敏感資訊的位置通常因人而異。舉例來說，有些人對於自己的名字出現在搜尋結果中感到不自在。當然，除非您離群索居，否則很可能已經有人透過某種形式把您的姓名公佈在網際網路上。有興趣的話，不妨到您最常用的搜尋引擎線上搜尋您的姓名。請注意，您的姓名越常見，就越難找到直指您身分的搜尋結果，您不妨把它當作是一樁好事。
如果想在網際網路上搜尋自己，您也可以試試看一些受歡迎的社交網站，像是 LinkedIn、Facebook 及 YouTube。過去難找的私密資訊，現在卻如此輕易地在網際網路上存放和散佈，實在很不可思議。
如今，要瞭解該保護什麼樣的資訊需要更專門的技術。為了提供協助，我覺得找一下電腦上是否有您未察覺且需要保護的潛在私密資訊應該蠻有趣的。雖然您可能會說，所有可用來竊取您的身分識別的個人資訊都屬機密，但實際上資訊可以區分為兩種詳細資料層級。有一種資訊是隨手可得，而另一種資訊則比較私密，後者通常被視為攸關個人身分識別的重要資訊。
一般而言，唾手可得的資訊並不會被當做是 PII。這些資訊包括您的姓名，也可能涵蓋電話號碼、街道地址、電子郵件地址、性別，而且往往包含受雇的地點和教育資訊。這些項目都可以隨手從網際網路和公共目錄 (如電話簿) 上取得。洩漏這些資訊可能會產生惱人的後果 (例如，不小心讓濫發垃圾郵件者得知您的電子郵件地址)，但這種事本身並不會導致身分識別遭竊。
機密資訊是由更私密的資料所構成，這些資料可連結到您的身分識別。您不希望公開的資料包括您的身份證號碼 (或是其他由政府提供之類似的唯一識別代碼)、銀行帳號、信用卡號碼 (尤其是加上到期日與信用卡會員帳號)、駕照號碼和指紋 (或其他有關生物特徵的資訊)。一旦落入壞人手中，這些項目就可能被不當利用。因此您必須要充分掌握在網際網路與電腦上記錄和存放這些資訊的位置及方式。為此，我現在要討論一些簡單的方法來尋找可能存放在系統硬碟上的 PII。

在電腦上尋找 PII 資料
PII 資訊散佈在各處。事實上，如果您檢查一下垃圾筒，可能隨便就找得到一些 PII。保護這類資訊要盡心盡力，建議每個人都買一台好的碎紙機，用它來絞碎所有包含個人資訊的紙張。
但是對於潛藏在電腦上的 PII 該怎麼辦？尋找這些資料就跟安全地存放這些資料一樣困難。Windows Vista® 還有其他一些桌面搜尋工具可以協助您在系統上尋找資訊。但是您必須先知道要找什麼資訊。
為了說明問題所在，我使用了一些簡單工具以便提供相關的實作範例。我使用 Windows PowerShell® 來編寫指令碼。Windows PowerShell 的功能很多，而且您會發現它也提供絕佳的字串比對功能。針對本文目的，我將著重在它比對規則運算式的功能上。Windows PowerShell (請參閱 microsoft.com/powershell) 是功能強大的工具，它已迅速成為管理工作的標準。
此外，我會使用 findstr.exe 來當做管理誤判的工具，也就是能夠忽略那些包含看來耐人尋味的字串 (基於資料字串在二進位檔中隨機組合的特性) 但其實無關緊要的檔案。換句話說，在此操作中可以忽略非文字檔。
我選用了兩種代表性的 PII 資料類型：身份證號碼與信用卡資訊。如果這些資料是以純文字的方式儲存在硬碟上，應該就很容易找得到。這兩種資料類型的結構與模式皆十分獨特，因此可以使用簡單的指令碼來尋找該資訊。不過，這些資料同時也具備高度機密性，所以我不建議無故就將它們存放在電腦上。如果您想要儲存這類資訊，就必須確定會好好保護它們。稍後我將討論如何保護您的 PII。無可否認地，我在此說明的內容很有限 — 還有其他重要的 PII 資料類型未包含在內，例如使用者名稱及密碼。

搜尋身份證號碼
在此有一個簡單字串會在檔案中尋找包含標準美國身分證號碼 (格式為 XXX XX XXXX 或 XXX-XX-XXXX) 的資訊。在 Windows PowerShell 中，您可以直接輸入下面幾行：
Get-ChildItem  -rec -exclude *.exe,*.dll |
select-string " [0-9]{3}[-| ][0-9]{2}[-| ]
[0-9]{4}"
或者您可以利用以下方式，使用 findstr.exe 來確保搜尋中不會讀取二進位檔：
Get-ChildItem  -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
" [0-9]{3}[-| ][0-9]{2}[-| ][0-9]{4}"
在此範例中，Get-ChildItem –rec 會從執行命令的目錄開始，對檔案執行遞迴目錄搜尋。Findstr.exe 會搜尋檔案中的字串，而 Select-string 則是 Windows PowerShell 字串搜尋函式 (Findstr.exe 也提供類似的功能，不過我不打算在此論述)。另外也請注意，規則運算式的前置空格是故意的。這麼做可以消除不必要的資訊以減少誤判，像是 HKLM\SOFTWARE\tool\XXX-XX-XXXX 這樣的登錄字串。
在我執行的範例中，搜尋模式傳回一個被我放入子目錄的測試範例檔，而且找到位於 XML 檔案中的範例，這些範例符合信用卡和身份證號碼的檔案模式 (見 [圖 1])。
Figure 1 搜尋數字模式的結果
Figure 1 搜尋數字模式的結果
我在第一個範例中使用排除功能來捨棄所有 .exe 和 .dll 檔案，因為這些檔案會產生不必要的干擾。您可能發現其他檔案類型也會造成誤判。此時，您可以使用排除功能來微調搜尋作業。
如果您只搜尋特定的身份證號碼，可以執行下列動作 (將「123 45 6789」取代為您自己的身份證號碼)：
Get-ChildItem  -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
"123 45 6789","123-45-6789"
此搜尋動作的結果如 [圖 2] 所示。
Figure 2 搜尋特定號碼
Figure 2 搜尋特定號碼

搜尋信用卡資訊
信用卡資訊的格式不盡相同，因此比較棘手。而且我想要避免誤判 (也就是看起來像信用卡號碼的隨機結果)，儘管如此，搜尋最後可能還是會找到一些貌似信用卡號碼的隨機序號。
我在建置這些字串時，使用的資訊是參考 Michael Gilleland 所寫的＜信用卡號碼結構剖析＞ (請參閱 merriampark.com/anatomycc.htm)。譬如說，我的搜尋字串指定第一個數字必須是 4、5 或 6，因為根據定義，這些是信用卡的主要企業識別碼。
我在此建造的簡單字串將搜尋 Discover、MasterCard 和 Visa 信用卡。就 Windows PowerShell 來說，我的搜尋字串看起來像這樣：
Get-CchildItem  -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
 "[456][0-9]{15}","[456][0-9]{3}[-| ][0-9]{4}
[-| ][0-9]{4}[-| ][0-9]{4}"
在 [圖 3] 顯示的範例中，我使用排除功能來避免來自 .rtf、.rbl 及 .h 檔案類型的干擾。除此之外，範例程式碼還會尋找沒有空格或連字號的信用卡字串。但是這樣可能會讓結果顯示暴增。因此下面提供另一個具備相同功能的命令，不過它不會抓取無空格或無連字號的信用卡號碼：
Figure 3 使用排除功能來消除搜尋結果中的干擾
Figure 3 使用排除功能來消除搜尋結果中的干擾
Get-ChildItem  -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
"[456][0-9]{3}[-| ][0-9]{4}[-| ][0-9]{4}
[-| ][0-9]{4}"
由於美國運通卡的格式截然不同，因此我建立了經過修訂的搜尋字串來尋找此信用卡模式。就 Windows PowerShell 來說，搜尋字串看起來像這樣：
Get-ChildItem -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
"3[47][0-9]{13}","3[47][0-9]{2}[-| ][0-9]{6}
[-| ][0-9]{5}"
資料暴增也可能影響到此結果。以下這個替代命令具備相同功能，不過它不會抓取無空格或無連字號的信用卡號碼：
Get-childitem -rec | ?{ findstr.exe
/mprc:. $_.FullName } | select-string
"3[47][0-9]{2}[-| ][0-9]{6}[-| ][0-9]{5}"
撰寫本專欄時，我在自己的系統上執行過這些搜尋，而且很驚訝地發現我的身份證號碼儲存在多個根本不應該存放的位置，原來資料是我前陣子寫在便箋上留下來的，只是早忘了。這讓我重新思考哪些東西應該寫下，哪些則否！
如果您覺得自己需要以安全的方式存放這些資訊，不妨試試看 Password Safe (請參閱 passwordsafe.sourceforge.net) 這類工具。您也可以使用「BitLockerTM 磁碟機加密」這樣的工具來加密硬碟。最後，Data Encryption Toolkit for Mobile PC (行動電腦資料加密工具組) 可提供實證的指引來保護行動電腦上的資料。這些解決方案至少可以讓那些試圖竊取您電腦上的個人資訊的人無法輕易得逞。

總結
尋找 PII 資訊相當簡單，要留意這些資訊就比較複雜。不過別忘了，只消一小段惡意程式碼或某個心懷不軌存取您系統的使用者，就可以輕易用類似的探索技術來尋找系統上的資訊。注意您在何時何地輸入 PII 資訊，如果您想要儲存這類資訊，請務必予以加密。
在此特別感謝 Matt Hainje 協助解決我的 Windows PowerShell 指令碼難題。

Frank Simorjay 是 Microsoft Solution Accelerator ─ 安全性和法規遵循小組的技術專案經理；他為 Microsoft 客戶設計安全性解決方案，在會議 (例如他創立的 Secure World Exposition) 上發表演說，提供安全性教育訓練，並勤奮地撰寫各種有關安全性的文章和書籍。「惡意程式碼移除工具之入門套件」是他最新的作品。


 桌面檔案: 使用 WAIK 部署 Windows XP
桌面檔案
使用 WAIK 部署 Windows XP
Wes Miller

世間客戶百百種，光是其間的差別就足以讓人嘆為觀止。在理想的世界中，所有客戶總是處於相同的部署階段，部署著相同的 Windows 版本。這樣的確可以讓測試作業更容易。實際情況當然並非如此。其中某些客戶正在經歷 — 或已經克服 —
部署 Windows Vista® 的磨合期，或是正興致勃勃地準備在生產環境中部署第一個 Windows Server® 2008 唯讀網域控制站 (RODC)，但同時也有很多人不斷提醒我 (非常感謝)，他們正在進行長期規劃的 Windows® XP 和/或 Windows Server 2003 R2 部署作業。
某天我收到一封讀者的電子郵件問道：「要是把 Windows 自動化安裝套件 (WAIK) 用於 Windows XP 呢？我要如何在部署 Windows XP 的過程中運用 WAIK？」接下來我將試試看並回答這個問題。

WAIK 的不同面貌
大約一年前，我寫了一篇討論 WAIK 的專欄，WALK 是專為協助部署 Windows Vista 而設計的超強工具組 (http://technet.microsoft.com/zh-tw/magazine/cc162524.aspx)。WAIK 現在也可以輕鬆應付 Windows Server 2008 部署作業，這兩個作業系統具有全新的安裝程式基礎結構 — 而 WAIK 中的工具著重在有效運用這些優勢。不管好壞，Windows Vista 之前的 Windows 版本 (無論使用自動安裝或 Sysprep) 都需要您使用專為其設計的工具。不過我想帶您看一下 WAIK 的另一面，特別介紹那些可用來協助您部署 Windows XP 的工具。
Windows PE 2.0 為了達到共識，首先參考一下我的 2008 年 2 月份專欄 (http://technet.microsoft.com/zh-tw/magazine/cc194422.aspx) 中有關 Windows PE 2.0 和 Windows XP 雙重開機的部份。基本上，如果 Windows PE 2.0 在上述的案例下可行，在此也同樣行得通。但您必須自問：「我是要將 Windows XP 部署在 RAM 低於 512 MB 的系統上，或不支援 Windows Vista 的進階組態與電源介面 (ACPI) 的系統上？」如果其中一項問題的答案是肯定的，您就需要使用 Windows PE 1.6，而且必須確認您是否可透過軟體保證來存取它。目前只有 Windows PE 2.0 和 2.1 是免費提供的；1.6 版及更舊版本仍需要軟體保證成員資格。
ImageX/WIM ImageX 和 Windows Imaging Format (WIM) 兩者都是從無到有設計而成，以便用於 Windows 2000 之後的所有 Windows 版本，而且 NTFS 或 FAT 磁碟區都適用 — 所以您絕對可以用它們來部署 Windows XP (或 Windows Server 2003)。
Windows 部署服務 Windows 部署服務 (WDS) 取代了遠端安裝服務 (RIS)，它原先是隨附在 WAIK 1.0 的 Out-of-Band (OOB) 版本中，後來經過更新並整合到 Windows Server 2003 SP2 中。WDS 現在已經囊括在 Windows Server 2008 的強大功能中，但還是非常適用於 Windows XP 部署。
如果您有 RIS 伺服器，或是執行舊模式的 WDS 伺服器，就不太適合使用 WDS。不過若您已經開始轉換至執行混合或原生模式的 WDS，那就行得通 — 您應該考慮將 WDS 作 Windows XP 部署一部分的案例。
Windows 系統映像管理員 (WSIM) 事實上，WSIM 僅適用於 Windows Vista 和 Windows Server 2008 部署。若您是部署 Windows Server 2003 或更舊版本，WSIM 幫不上什麼忙。

Windows XP 部署工具
Windows XP (正如 Windows NT® 4.0 到 Windows Server 2003 之間的所有版本一樣) 可以經由 unattend.txt 檔案或「映像」來部署。基於本專欄的目的，我將忽略自動安裝，因為它已經過時了。如果您要利用 WAIK (特別是 ImageX)，您將是進行以映像為主的部署。因此您需要的是 Sysprep.inf (Sysprep 的回應檔案格式)，而非 unattend.txt。
我在此所謂的映像是泛指如何取得 OS 映像。過去您多半使用過 Ghost、PQDI 或其他建立映像工具。在 ImageX 出現之前，Microsoft 並未提供任何方法讓您挑選經過 Sysprep 處理的 OS 和應用程式，並將它們複製到一或多台目的地電腦。
建置 Windows 的映像時應謹記兩個重點：
  • 您無法變更硬體抽象層 (HAL)，除非是在單一處理器與多處理器系統之間移轉。正如我在之前的專欄中提過，您無法在 ACPI 與非 ACPI 架構之間轉換時安全地變更映像。
  • 您可以變更大量存放控制器。有人以為不能變更，這是常見的誤解。但若要這麼做，您必須使用 Sysprep 來安裝目標電腦可能需要的任何大量存放控制器；完成部署後，您使用 Sysprep 移除「卡在」目標系統上的驅動程式以外的所有驅動程式，這我稍後會講解。
記住這兩點之後，您應該可以開始在其中一個系統上準備映像，並在使用相同或相容 HAL 的目標系統上套用此映像。

專業工具
每次在以映像為主的部署案例中處理 Windows XP 時，您都需要備妥以下三樣東西：
Ref.chm 這是自動安裝文字檔參考。請記住，對 Windows Vista 之前的任何 Windows 版本進行選用元件最佳化設定的最好時機，就是在建立映像之前。不過，如果您非得在安裝作業之後安裝選用元件，您可以根據 support.microsoft.com/ kb/222444 的說明，執行 sysocmgr.exe 來達到此目的。若您部署的是 Windows XP Tablet PC Edition，請遵照 go.microsoft.com/fwlink/?LinkId=108589 中的步驟，建立單一映像以便在適用的系統上安裝 Tablet PC 元件。
Sysprep 這是 Microsoft 支援的建立磁碟複製系統的方法。偶爾我還是會看見有人推薦協力廠商安全性識別碼 (SID) 變更器；不過一如往常，我只建議使用 Sysprep，因為其他工具常會遺漏關鍵的 Windows SID 位置 (尤其是那些不太公開的工具)。
安裝管理員 這是建立 sysprep.inf 檔案最簡單快速的方法。跟往常一樣，請務必確認您準備好正確的版本 — 這個版本通常應該與您要部署的 Windows 相同 (舉例來說，Windows XP SP2 搭配 Windows XP SP2 部署工具)。
您可以在 Windows XP 光碟片上找到上述這三樣東西。更新版可以從以下網址取得：http://www.microsoft.com/downloads/details.aspx?FamilyId=3E90DC91-AC56-4665-949B-BEDA3080E0F6&displaylang=zh-tw。
您也需要就近準備好 tap.exe。這個公用程式隨附在 Windows XP Embedded 工具中 (go.microsoft.com/fwlink/?LinkId=108590)，甚至也包含在免費的試用版內。Windows PE 下的 tap.exe 會傳回 Windows PE 找到的所有隨插即用 (PnP) 裝置的相關資訊；最有趣的是，它還會告訴您 Windows PE 為裝置所選的 HAL (見 [圖 1])。這點之所以重要，主要是因為 Windows PE 選取 HAL 所採用的邏輯跟完整 Windows 安裝用來決定要設置的 HAL 的邏輯一樣 — 因此 Windows PE 下的 tap.exe 可方便您查看 Windows 針對特定系統建議的 HAL。
Figure 1 Tap.exe 公用程式會告訴您 Windows PE 針對特定系統選擇的 HAL
Figure 1 Tap.exe 公用程式會告訴您 Windows PE 針對特定系統選擇的 HAL

建立映像
您可以依據下列步驟，開始準備要您要使用 ImageX 部署的 Windows XP 映像 (當然，您可以使用其他映像工具 — 但您很快就會發掘在此特定的工作流程中，ImageX 是最理想的工具)。
第一步是收集所有必要工具和元件，包括 Sysprep、安裝管理員、ImageX 及 Windows PE (2.0 或 1.6 版，視您的需求和存取權而定。別忘了，如果您是使用 2.0 版與 ImageX，建立磁碟分割時就必須使用 bootsect.exe 與 /nt52 切換，以確保您的開機程式碼與 Windows XP 相容)。
當然，您還需要安裝 Windows XP (任何 SKU) 的電腦，另外也要安裝 Windows 和其他已安裝軟體的最新更新。最理想的情況是，這個系統之前從未加入網域 — 這樣可降低之後可能發生網域/網路問題的可能性。系統應該只安裝不妨礙建立映像的應用程式，而且不該包含私自儲存電腦名稱、SID、網域或使用者特定資訊的任何項目，因為 Sysprep 在 SID 變更時會遺漏或無法取代這些項目。此外，您應該使用預期會最常部署的 HAL。在較新的硬體上，有鑑於 ACPI 與多核心的受歡迎度，通常是使用 ACPI 多處理器 (MP) HAL (還有之前的超執行緒技術也是使用 MP HAL)。
現在根據您希望向使用者展示的方式來設定 Windows XP 系統。安裝您希望大部分使用者擁有的所有應用程式 (以及無法自動安裝的應用程式)。安裝或移除 Windows 選用元件，以便將系統設定為您要為使用者提供的樣子。接著設定桌面。以系統管理員身分登入，進行所需的設定檔修改，包括桌面背景、螢幕保護程式、[開始] 功能表等等。根據預設 (從 Windows XP SP2 開始)，Sysprep 會為您從系統管理員帳戶複製設定到預設使用者帳戶。
接下來，執行安裝管理員 (見 [圖 2])，指定您要建立新的 Sysprep 自動安裝檔案，並將安裝程序完全自動化。請注意，在您執行安裝管理員的過程中，必須輸入產品金鑰。如果您手邊沒有產品金鑰，或是想要稍後再寫下 (而且您沒有大量授權金鑰)，您可以指定 Windows XP 或 Windows Server 2003 光碟片上的預設 unattend.txt 檔案中提供的金鑰 (此舉可允許完成安裝，但不會允許啟動)。
Figure 2 使用安裝管理員建立 Sysprep 回應檔案
Figure 2 使用安裝管理員建立 Sysprep 回應檔案
您也必須提供電腦名稱。您或許想要稍後再使用 SQL 或其他一些機制來自動化此作業，但是請暫時先輸入一些值，然後在執行 Sysprep 之前且電腦已部署 WIM 之後，再使用指令碼來取代此電腦名稱。
請記住，如果您為系統管理員帳戶提供一個密碼，唯有當映像中現有的系統管理員帳戶沒有密碼時，才會套用您提供的密碼。此外還必須注意，加入網域區段並不允許您加密加入網域認證。您應該盡可能使用最低權限帳戶來設定電腦帳戶。最後，我建議使用安裝管理員中的 [版本字串] 選項來追蹤您剛才建立的映像「版本」。
現在將 Sysprep.inf 檔案與 sysprep.exe 和 setupcl.exe 一併放入 C:\Sysprep 目錄，然後在 .inf 檔案中加入以下內容：
[Sysprep]
BuildMassStorageSection = Yes

[SysprepMassStorage]
接著執行 Sysprep –bmsd。這樣會修改您的 sysprep.inf，並將 Windows 安裝所知的大量存放識別碼全都加入，如 [圖 3] 所示。您可以加入其他裝置，或者您也可以將它們加入 Windows 安裝並重新執行 sysprep –bmsd。
Figure 3 將大量存放識別碼加入 sysprep.inf
Figure 3 將大量存放識別碼加入 sysprep.inf
接著，將您的 sysprep.inf 檔案複製到共用位置，然後執行 sysprep.exe –factory 並關閉系統。重新開機到 Windows PE，使用以下程式碼連線到 UNC 共用 (建議作法)：
NET USE Y: \\myserver\myshare
/USER:DOMAIN\USER password
現在使用下列內容擷取映像：
ImageX /capture C: Y:\NewImage.wim
"Factory Mode capture from 4/1/2008"
然後關閉系統。
您現在已經取得一個準備好透過原廠模式更新的映像。細節我就不多著墨，不過，總而言之，原廠模式是保存映像直到您要使用這些映像進行部署為止最安全模式。如需詳細資訊，請參閱前文提到的 Windows XP deploy.cab 說明文件。
當您準備好建立部署所需的映像時 — 也就表示您準備好首展 — 開機到 Windows PE 並使用 Diskpart 來建立想要的磁碟分割。使用 format 命令格式化磁碟分割，必要時使用 bootsect.exe 來套用前 Windows Vista 啟動碼 (/nt52)。現在使用以下方式連線至 UNC 共用 (或是映像所在的光碟)：
NET USE Y: \\myserver\myshare
/USER:DOMAIN\USER password
接著套用映像，如下所示：
ImageX /apply Y:\NewImage.wim C: 1
最後，重新開機到 Windows 原廠模式，對映像進行必要的更新 (在此您需要使用 winbom.ini 檔案；請參閱 deploy.cab 中的 ref.chm 以取得協助)。Winbom.ini 應該永遠包含以下數行內容，這些內容會告訴它重新封裝映像以便在下次開機時準備好執行迷你安裝：
[FACTORY]
ResealMode = Mini
當您完成時，請關機。重複剛才用來擷取映像的步驟，但是現在將擷取命令修改為：
ImageX /append C: Y:\NewImage.wim "Resealed
and ready for deployment – captured 4/4/2008"
使用 /append 可讓您省下可觀的空間。您已將原廠模式與重新封裝的映像結合在一起，因此可以輕鬆地在兩者間切換。您也可以使用 /delete 來刪除您決定途中不要使用的映像。但是請記得，這麼做並不會節省空間；此舉只是刪除指定的磁碟區映像參考。若要清理無用的空間，您必須匯出所有您要保留的磁碟區映像。
您現在應該可以了解，無論是要部署最新版本或舊版的 Windows，即使 WAIK 主要是針對 Windows Vista 與 Windows Server 2008 而設計和支援，它仍能助您一臂之力。雖然您需要搭配使用 Windows XP 工具和 WAIK 工具 (主要是 ImageX，可能也需要 Windows PE 2.0)，但 Microsoft 如今已提供您所需的一切援助來開始部署各種版本的 Windows。

Wes Miller 在位於德州奧斯汀的 CoreTrace (www.CoreTrace.com) 擔任資深技術產品經理。他之前任職於 Winternals Software，並且曾在 Microsoft 擔任專案經理一職。 您可以透過電子郵件與 Wes 聯絡：technet@getwired.com。


 現場筆記: 了不起的創舉
現場筆記
了不起的創舉
Neil Fawcett

假設您的地下室放了 5,000 部經過整修的電腦，而且客戶也正等著排隊上門購買這些電腦。硬體可以有第二春，可是作業系統......就要另當別論。它是合法版本嗎？每一部電腦都剛好搭配一個作業系統嗎？您可以將它轉售嗎？
這些問題都可以藉由新推出的 Microsoft Authorized Refurbisher (MAR) 商業計劃所提供的方案加以解決。表面上，這個新方案的概念相當簡單：幫助商業公司回收舊電腦、安裝合法的作業系統，然後再將它們銷售出去。
其實 MAR 計劃還有更深遠的目標。從務實的角度來看，對於 Microsoft 和商業電腦回收站而言都是一個大好商機。從法律的角度來看，它可以防止有意或無意的軟體盜版行為。從環保的角度來看，它可以讓還能使用的硬體免於被棄置在垃圾掩埋場的命運。最後一點，它建立了一個管道，讓其他公司能夠深入瞭解 Microsoft 內部的授權作業，這一點對於電腦轉手的處理更是重要。
這項計劃不只造福 Microsoft 和電腦回收站，也為客戶提供許多重要的好處：客戶拿到的電腦是經由專業人員清除資料，重新安裝正版的 Windows® XP Home Edition 或 Windows XP Professional；客戶有權存取下載檔案、更新程式和增強功能；也有權存取未來推出的 Windows。而這些都是由一部原本要被丟棄在垃圾掩埋場、成為有毒廢棄物掩埋大戰中另一個統計數據的電腦一手包辦。
MAR 所招募的對象，是平均每個月提供 5,000 部經整修電腦的公司，這些公司必須先提出過去的資料，證明它們能夠達到這個目標，才能參與這個計劃。MAR 是一項全球性的計劃，專門開放給主要的 OEM 電腦回收站以及其他合格且總部設在美加地區的電腦回收站加入。目前合作的業者有 Redemtech、Techturn 和 Apto Solutions 三家。
新軟體產品的授權常把買賣雙方搞得一頭霧水，但是經整修電腦市場針對舊版 Windows 能夠處理與不能處理的部分，把複雜的程序一分為二。MAR 幫助電腦回收站化繁為簡，它提供一組包括 Refurbisher Preinstallation Kit (RPK) 在內的安裝工具，把 Windows XP 的預先安裝簡化為不同類型的翻新電腦。每一個授權都附帶一份由 Microsoft 提供的真品證明書 (COA)。如果經整修的電腦仍保有其 COA，而且公司也擁有原始的復原媒體或安裝在硬碟上的復原影像，就不需要新的 Windows 授權。但是如果沒有提供復原媒體或影像給電腦回收站，就得借助 MAR 來簡化整個程序。
電腦的再利用 (透過捐贈、翻新或轉售) 為大眾增加接觸科技的機會，提供新的希望，尢其是被科技忽略的那些人。同時，它也可以限制科技產業佔用環境。事實上，回收電腦市場 (一般稱為「二手電腦市場」) 已經在許多開發中的經濟結構中，成為擴展科技的推手。
經整修電腦的市場逐漸成長，預言也指出如果公司願意尋求替代產品，就能使數以百萬的電腦免於被丟棄在垃圾掩埋場的命運。MAR 在 Microsoft 不僅扮演策略性的角色，在協助大型公司部署低成本硬體解決方案方面也扮演關鍵性的角色，為其他人帶來相當大的福利。隨著影響地球的環境問題越來越受關注，適當的電腦處置也越形重要。像 MAR 計劃這樣的創舉不但能夠幫助高齡電腦重獲生機，繼續造福尋求低成本技術的人，同時也可以免去淪落有毒廢棄場的浩劫。MAR 計劃成功讓經整修的電腦吸引更多目光，而它所做的只不過是協助釐清軟體授權而已。有關 MAR 計劃的詳細資訊，請上 microsoft.com/oem/mar。

Neil Fawcett 20 年來為不少刊物撰寫和編輯 IT 方面的文章。同時也針對 IT 相關主題發表演說，並出過 13 本 IT 相關主題的書。Neil 在從事寫作生涯之前，曾在矽谷擔任軟體開發人員和硬體工程師。


 Windows 機密文件: 不管好壞，機會平等
Windows 機密文件
不管好壞，機會平等
Raymond Chen

不知道您是否納悶過， 為什麼您在解除安裝程式時，Windows® 總會以刪除檔案「可能會使其他應用程式無法正常執行」，來問您它該不該刪除檔案？首先我要說明的是，這則訊息 (請參閱螢幕擷取畫面) 並非由 Windows 發出，而是由解除安裝程式發出。因此，您該問的其實是：「為什麼應用程式解除安裝程式會顯示這個對話方塊？」。如果說有什麼問題可以問倒使用者的話，這個問題就是最好的例子。到底為什麼會導致這步田地呢？
為了管理由多個應用程式使用之檔案的參考次數 (例如，由多個不相關程式所用的 MFC 執行階段程式庫)，安裝程式以 SharedDLL 登錄機碼建立了一個項目。這個項目會列出該檔案及其參考次數，如果該檔案已經有一個項目，參考次數就會累加。如果該項目還不存在，參考次數就設為 1。相反的，當程式被解除安裝時，參考次數就會減少，當它遞減到 0 時，該檔案就會被刪除，因為那表示已經沒有任何程式在使用它了。至少理論上是如此。
Should I delete it or not?
Should I delete it or not?
這個模型有一個很嚴重的問題，那就是它假設每一個人都願意遵守遊戲規則。但是這卻導致誘惑欺騙的情況更甚，因為最後欺騙者通常都不會受到懲罰。
舉個例說，假設現在有一個使用 MFC 執行階段程式庫的程式，其安裝程式把這些程式庫複製到系統目錄中，卻沒有更新參考次數。這麼一來，當該程式被解除安裝時，它會把程式庫一併刪除。如果該程式企圖與遵守規則的程式並存，那麼會發生什麼情況呢？下面就是事件的基本轉折：
  1. 安裝好程式：安裝程式庫，將參考次數設為 1。
  2. 安裝壞程式：安裝程式庫，但是參考次數不變。
  3. 解除安裝壞程式：刪除程式庫。
這幾個事件的結果是導致好程式停止運作，因為程式庫現在全沒了。
下面是另一個案例：
  1. 安裝好程式：安裝程式庫，將參考次數設為 1。
  2. 安裝壞程式：安裝程式庫，但是參考次數不變。
  3. 解除安裝好程式：參考次數降到 0，然後刪除程式庫。
這個案例的結果是讓壞程式停止運作。
撰寫好程式的人認為：「我們是沒辦法阻止壞程式影響我們，不過至少可以盡量不讓我們自己影響壞程式吧。」因此當他們要刪除檔案時，會先停下來顯示一則警告訊息：「照過來！照過來！我要刪除檔案了，可以嗎？」。如果有一個壞程式仍在使用它，壞程式就會受到影響。如果您手上有一個壞程式，就得按「不要刪除」。好啦我知道，這不是它真正的措辭，不過您應該知道我說的是哪一個對話方塊吧。就連一代才子 Jeffrey Richter 都曾經在 1996 年的 Microsoft Systems Journal 文章中推薦這個做法。
不過，使用者如果採用這個做法，就得面對一個他沒機會答對的問題。
當然嘍，那些要求 Windows 讓他們覆蓋所有前一個動作的控制狂，應該會對這個對話方塊鼓掌叫好吧。即使是世界級的解除安裝程式也會讓您依檔案控制解除安裝程序，所以當您開口要求的時候千萬要小心謹慎，因為您很可能會如願以償。

Raymond Chen的網站「The Old New Thing」以及同名著作均探討 Windows 的歷史和 Win32 程式設計。他很想知道核聚變在他有生之年是否能夠實現。