整合 SQL Azure 與 SharePoint 2010 和 Windows Azure
整合 SQL Azure 與 SharePoint 2010 和 Windows Azure
在 CASI (宣告、Azure 和 SharePoint 整合) 套件上,這篇文章是五個部分系列指南中最有用的。
· 第 1 部分: 整個架構與解決方案的簡介,並說明此系列嘗試執行和涵蓋的內容。
· 第 2 部分: CASI 套件的指導部分。 首先,讓 WCF 成為所有資料的前端,資料可以是資料集、XML、自訂類別,或只是單純的 HTML。 在第 1 階段,我們讓您的標準 WCF 服務具備宣告感知特性,這也是我們可以從 SharePoint 取得使用者 Token,並將它從應用程式或資料中心界限傳送到自訂 WCF 應用程式的原因。 在第 2 階段中,我將說明您必須執行的所有項目,以讓典型 WCF 應用程式從內部部署成為在 Windows Azure 中裝載。 只要完成這些作業,您的後端便會就緒,立即可以支援在多個應用程式和多個 Datacenter 中使用整合的驗證。
· 第 3 部分: 說明自訂工具組組件,這個組件連接雲端中的宣告感知 WCF 應用程式與 SharePoint 伺服器陣列。 我將會完整說明如何使用組件、探討您需要建立且非常容易的自訂控制項 (大約 5 行的程式碼),以及如何在 _layouts 目錄網頁中裝載此控制項以擷取並顯示網頁組件中的資料。 我也會張貼自訂控制項與 _layouts 網頁範例的完整原始程式碼。
· 第 4 部分: 隨附於 CASI 套件的網頁組件。 它提供現成且不需撰寫程式碼的解決方案,可讓您連接非同步的用戶端查詢,以便從雲端服務擷取資料,然後在網頁組件中顯示它。 它也內建攔截程序,您可以自訂此程序,並使用自己的 JavaScript 函數來顯示資料。
· 第 5 部分: 逐步解說一些簡短的範例應用程式,向您示範其他運用您所建立之自訂控制項 (如第 3 部分所述) 的常見案例。 您將使用控制項來擷取某些類型的使用者或設定資料,並將它儲存在 ASP.NET 快取中,然後在自訂網頁組件中使用它。 另一個案例將使用自訂控制項從 Azure 擷取資料,然後在自訂工作中使用該資料 (在此例中,我使用的是自訂 SharePoint 計時器工作)。 我也會張貼這些範例應用程式的完整原始程式碼。
CASI 套件中提供了一些指導和工具,可協助您輕鬆且快速地從 SharePoint 2010 連線到 Windows Azure,同時傳送目前使用者的 Token,以便制定極為細微的安全性決策。 CASI 套件使用的原始 WCF 應用程式僅使用所公開的硬式編碼資料集合。 在後續組建中 (並未確實記載在 CASI 套件文章),我升級了資料部分,因此,應用程式使用 Windows Azure 資料表儲存體來儲存並擷取資料。 現在,我透過建置出 SQL Azure 中的資料,並讓 Windows Azure 的 WCF 從中擷取資料,藉此不斷地改善應用程式。 現在是名符其實的多雲端應用程式套件: Windows Azure、SQL Azure 和 (表面上) SharePoint Online。 這篇文章的重點只是要分享幾個使用 SQL Azure 的秘訣,讓您可以更快速地將程式併入開發專案。
整合秘訣
1. 您真的必須升級為 SQL 2008 R2,才能使用 SQL Server Management Studio 工具開啟 SQL Azure 資料庫。 在技術上,您可以令 SQL Server 2008 運作,但是得執行一連串繁雜的因應措施步驟才行。 2008 R2 都已備妥,您將能在這裡得到最佳的體驗。 如果您真的想要進行 2008 因應措施路線,請參閱這個連結: https://social.technet.microsoft.com/wiki/contents/articles/developing-and-deploying-with-sql-azure.aspx (可能為英文網頁)。 本文真的包含一些不錯的秘訣,無論如何,都值得一讀。
2. 打算使用 T-SQL 執行所有作業。 圖形化工具無法與 SQL Azure 資料庫、資料表、預存程序等搭配使用。 再說,我不是真的 T-SQL 天才,不過我發現有個方法很有用,那就是只先建立本機 SQL Server 資料庫。 在 SQL Management 工具中,我建立兩個連線,一個連到本機 SQL 執行個體,另一個連到 SQL Azure 執行個體。接著,在本機 SQL 執行個體中建立資料表、預存程序等,因此,我可以使用圖形化工具。 然後,我使用 [whatever Sql object] As…CREATE to…New Sql Query Window 指令碼。 這樣會產生 SQL 指令碼來建立我的物件,然後我就可以將它貼到已對 SQL Azure 資料庫開啟的查詢視窗。
3. 各位,這點很重要,預設逾時經常不夠長,以至於無法連線到 SQL Azure。 如果在連接字串中使用 .NET SqlClient 類別,例如,加入 "Connection Timeout=30;",您就可以變更它。 如果您使用 SQL Server Management Studio,請按一下對話方塊中的 [進階] 按鈕,在其中輸入伺服器名稱和認證,將它變更為至少 30。 預設為 15 秒且常常失敗,但是 30 秒似乎就已足夠。 可惜的是,沒辦法變更外部內容類型 (例如 BDC 應用程式定義) 與 SQL Azure 資料來源的連接逾時。
4. 不要使用資料庫管理員帳戶來連接到您的資料庫 (例如,您用來建立資料庫本身的帳戶)。 請另外建立一個使用資料的帳戶。 可惜 SQL Azure 只支援 SQL 帳戶,所以,您無法直接使用要求使用者的身分識別,來制定有關資料存取的決策。 您可以採用因應措施,那就是使用 WCF 做為 SQL Azure 中的資料前端,並在 Windows Azure 中使用宣告驗證,這也是 CASI 套件所使用的模型。 此外,套件還會執行一些步驟,建立可用來連接到特定資料庫資料的登入。 下列是範例:
--先建立資料庫
CREATE DATABASE Customers
--現在建立登入,然後透過登入,在資料庫中建立一個使用者
CREATE LOGIN CustomerReader WITH PASSWORD = 'FooBarFoo'
CREATE USER CustomerReader FROM LOGIN CustomerReader
--現在授與權限給使用者
GRANT INSERT, UPDATE, SELECT ON dbo.StoreInformation TO CustomerReader
--授與「執行」權限給預存程序
GRANT EXECUTE ON myStoredProc TO CustomerReader
如需更多範例和詳細資料,包括為 SQL Azure 中的帳戶設定伺服器層級權限,請參閱 https://msdn.microsoft.com/zh-tw/library/ee336235.aspx (可能為英文網頁)。
5. 您 必須在 SQL Azure 中為每個資料庫建立防火牆規則,才能與不同的用戶端通訊。 如果您想要允許來自其他 Azure 服務的通訊,必須建立 MicrosoftServices 防火牆規則 (SQL Azure 會在您第一次建立資料庫時,為您提供這個規則),規則的起始範圍為 0.0.0.0 到 0.0.0.0。 如果您不要建立這個規則,那麼所有 Windows Azure 應用程式都將無法讀取、新增或編輯 SQL Azure 資料庫中的資料! 此外,您也應該建立防火牆規則,以便與用來路由傳送到網際網路的任何伺服器進行通訊。 例如,如果您有纜線或 DSL 路由器或 RRAS 伺服器,可以針對 RRAS 等項目使用外部位址或 NAT 位址。
這些應該有一些不錯的秘訣,可讓您的資料保持最新並正常運作。
資料存取
透過您的自訂程式碼,例如 Windows Azure WCF、網頁組件等存取資料的方式,幸好與透過內部部署 SQL Server 擷取資料的方式完全一樣。 這裡提供快速編碼範例,然後我將詳細解說一些部分內容:
//set a longer timeout because 15 seconds is often not
//enough; SQL Azure docs recommend 30
private string conStr = "server=tcp:foodaddy.database.windows.net;Database=Customers;" +
"user ID=CustomerReader;Password=FooBarFoo;Trusted_Connection=False;Encrypt=True;" +
"Connection Timeout=30";
private string queryString = "select * from StoreInformation";
private DataSet ds = new DataSet();
using (SqlConnection cn = new SqlConnection(conStr))
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(queryString, cn);
da.Fill(ds);
//do something with the data
}
事實上,不同於連接字串,這個部分不需要太多解說。 幾個要指出的重點是典型連接與內部部署 SQL Server 可能有所不同:
· server: 在含有 “tcp:” 的 SQL Azure 資料庫名稱前面。
· Trusted_Connection:這應該是 false,因為您不是使用整合式安全性
· Encrypt: 對於任何雲端資料庫的連接,這應該是 true
· Connection Timeout: 如前面所述,預設逾時是 15 秒,但這個值經常不夠,因此,這裡我將它設定為 30 秒。
另一個我想要在這裡簡單提到的案例,就是使用資料移轉。 您可以使用 SQL Server 隨附的 BCP 工具,將資料從內部部署 SQL Server 移到 SQL Azure。 移轉資料的基本程序如下:
1. 建立格式檔案:這個檔案可用來匯出本機資料及將資料匯入雲端。 在這個範例中,我為 Test 資料庫中的 Region 資料表建立格式檔案,並將它儲存到 region.fmt 檔案。
bcp Test.dbo.Region format nul -T -n -f region.fmt
2. 從本機 SQL 匯出資料:在這個範例中,我要將 Test 資料庫的 Region 資料表匯出到名為 RegionData.dat 的檔案。 我使用的是在步驟 1 中建立的 region.fmt 格式檔案。
bcp Test.dbo.Region OUT RegionData.dat -T -f region.fmt
3. 將資料匯入到 SQL Azure。 這裡要注意的重點是,當您將資料匯入到雲端時,「必須」以使用者名稱參數加入 “@serverName”,否則匯入將會失敗。 在這個範例中,我要將資料匯入到 SQL Azure 中 Customers 資料庫的 Region 資料表。 匯入來源是我的本機資料匯出到其中的 RegionData.dat 檔案。 我的伺服器名稱 (-S 參數) 就是 SQL Azure 資料庫的名稱。 至於我的使用者名稱 (-U 參數),則是使用上述的 username@servername 格式。 我要求程式使用我在步驟 1 中建立的 region.fmt 格式檔案,並且我一次就設定了 1000 筆記錄的批次大小 (-b 參數)。
bcp Customers.dbo.Region IN RegionData.dat -S foodaddy.database.windows.net -U speschka@foodaddy.database.windows.net -P FooBarFoo -f region.fmt -b 1000
各位,這就是這篇文章的內容。 希望能讓您了解建立 SQL Azure 資料庫、連線到資料庫,以及在 SharePoint 網站中使用資料庫的基礎原理。 順帶一提,我是使用 CASI 套件透過我的 Windows Azure WCF 前端到 SQL Azure 擷取這份資料,然後才在我的 SharePoint 網站上呈現。 我是一邊建立一邊依照自己的 CASI 套件部落格來執行,嘗試驗證先前在這裡發佈的所有內容,結果發現大體上所有內容都相當到位。 我在第 3 部分做了一些小更正,另外新增了疑難排解章節。 不過,還是花了我大約 30 分鐘建立新的自訂控制項,大約 15 分鐘建立新的 Visual 網頁組件。 我利用 CASI 套件網頁組件,從 WCF 顯示一組 SQL Azure 資料,並且在 Visual 網頁組件中,以程式設計方式建立自訂控制項的執行個體來擷取資料集,然後將它繫結到 ASP.NET 資料格。 這些都是在一個範例頁面中完成的,實際上看起來還不錯,而且還能輕鬆地擴充成使用不同方式來顯示資料, 如下所示:
這是翻譯後的部落格文章。英文原文請參閱 Integrating SQL Azure with SharePoint 2010 and Windows Azure