天天看點

MOSS/Sharepoint RBS概念以及運用

注:原文作者不知道是誰,先收藏了這篇

如果使用SharePoint 2007作為文檔管理平台,它很讓人诟病的一點就是,SharePoint 2007将檔案本身直接存儲在SQL Server資料庫之中。雖然Windows SharePoint Services 3.0 SP1增加了一個External BLOB Storage(EBS)接口,但是微軟并沒有提供實作,而是需要開發人員自己來實作它。

SharePoint 2010仍然對EBS提供相容,但并不推薦使用EBS,推薦的解決方案,乃是使用SQL Server 2008 Remote BLOB Storage(RBS)。

SQL RBS是一組API,通過RBS,一個SQL Server 2008資料庫就不再需要将大二進制資料(BLOB)存儲在資料庫内部,而是可以存儲到外面的某個地方,在資料庫裡面可能隻會存儲一個對外部BLOB資料的引用。SQL Server 2008和SQL Server 2008 R2都支援RBS。

聽起來RBS實在是一個很好的東東。但是(總是有但是),RBS僅僅是一組API,換句話說,RBS可以讓開發人員利用這組API,開發出一個RBS Provider,真正實作對BLOB資料的存取。如果沒有RBS Provider,RBS自己可不會自動的将BLOB存儲到某個指定的地方去。不同的RBS Provider,可以讓我們将BLOB存儲到檔案系統、磁盤儲存設備、檔案伺服器等等各種地方,反正不繼續放到SQL Server資料庫裡面就對了。

MOSS/Sharepoint RBS概念以及運用

在你對RBS有了初步認識之後,我們接着介紹SQL Server 2008裡面的另外一個新特性:FILESTREAM。下面這句話摘自SQL Server 2008聯機叢書:“通過将 varbinary(max) 二進制大型對象 (BLOB) 資料以檔案形式存儲在檔案系統上,FILESTREAM 使 SQL Server 資料庫引擎和 NTFS 檔案系統成為了一個整體。”是以,FILESTREAM可以讓管理者選擇将SQL Server資料庫裡面的varbinary(max)類型BLOB資料,存儲到本地NTFS檔案系統上。在通過FILESTREAM對BLOB資料進行存取的時候,還能順便能夠享受到資料庫事務處理的好處。

聽起來,FILESTREAM和RBS很相似,是不是?但其實,RBS和FILESTREAM是兩個不同的東東,它們互不依賴。RBS是一組API接口,通過這組API,應用程式就能将BLOB資料存儲到資料庫之外的某個地方,具體實作由開發人員建立的RBS Provider來完成。FILESTREAM是SQL Server 2008内置的一個特性,它能将原本存儲在資料庫裡面的BLOB資料,存儲到伺服器本地的NTFS檔案系統上。

SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。是以,如果沒有一個RBS Provider,我們并不能馬上就将SharePoint 2010裡面存儲的檔案,存儲到資料庫之外的某個地方去。但是,既然FILESTREAM特性已經擁有了現成的将資料庫中的BLOB資料存儲到NTFS檔案系統上的能力,為什麼不能直接使用FILESTREAM,做一個RBS FILESTREAM Provider,也就是利用FILESTREAM的功能實作的一個RBS Provider呢?這樣,豈不是就能将SharePoint 2010中的檔案,都存儲到NTFS檔案系統上了嗎?

微軟也想到了,是以,微軟以特性包(Feature Pack)的形式,提供了一個RBS FILESTREAM Provider。你可以從這裡下載下傳x64版本的RBS FILESTREAM Provider。但是要在SharePoint 2010系統上安裝并使用它,也是需要按照一定的步驟來操作的。下面就是具體的操作步驟。

1、确定SQL Server 2008已經啟用了FILESTREAM

在安裝SQL Server 2008時,會有一個步驟提示是否安裝FILESTREAM。如果你不确定是否安裝了此特性,從SQL Server 2008伺服器上打開SQL Server配置管理器,從左邊選中"SQL Server 服務",然後從右邊的窗格中用滑鼠右鍵點選運作的SQL Server執行個體,選擇"屬性"菜單項。

MOSS/Sharepoint RBS概念以及運用

在打開的屬性視窗中,選擇"FILESTREAM"頁籤,然後選中啟用FILESTREAM的選擇框,點選"确定"按鈕。

MOSS/Sharepoint RBS概念以及運用

打開SQL Server Management Studio,選中左側的SQL Server執行個體,然後點選工具欄區域的"建立查詢",打開一個查詢界面,然後在裡面輸入下面的SQL語句并執行。

EXEC sp_configure filestream_access_level, 2

RECONFIGURE

MOSS/Sharepoint RBS概念以及運用

2、确定要應用RBS FILESTREAM Provider的内容資料庫

由于RBS是基于資料庫為單元來啟用的,是以你可以選擇在哪些SharePoint内容資料庫上啟用RBS。這意味着,對于SharePoint伺服器場裡面那些存儲檔案數量并不多的内容資料庫,可能并沒有必要為它啟用RBS,而那些可能會存儲大量檔案的内容資料庫,則可以啟用RBS,有效的優化它們。

SharePoint 2010系統中,内容資料庫與網站的關系是:

● 一個Web應用程式可以使用一個或多個内容資料庫;

● 在建立Web應用程式時,會為其自動建立一個内容資料庫,管理者可以稍後為此Web應用程式建立更多的内容資料庫;

● 在Web應用程式中建立一個網站集時,這個網站集會被存儲到Web應用程式的某個内容資料庫中;

● 一個網站集(包括其所包含的首要網站和所有子網站),隻能被存儲在一個内容資料庫中,而不能被分拆存儲到多個内容資料庫中。

管理者可以打開SharePoint 2010管理中心的内容資料庫管理界面,檢視每個Web應用程式所使用的内容資料庫,或是為某個Web應用程式添加新的内容資料庫。

MOSS/Sharepoint RBS概念以及運用

在下面的示範操作中,我們就為上圖中所示的這個名為"WSS_Content"的内容資料庫,啟用RBS。

3、配置内容資料庫

在确定了要啟用RBS的内容資料庫之後,打開SQL Server 2008 Management Studio,找到這個内容資料庫,用滑鼠右鍵點選并選擇"建立查詢"菜單項。

MOSS/Sharepoint RBS概念以及運用

在打開的查詢視窗中,輸入下面這些SQL語句并執行。

use [WSS_Content]

if not exists (select * from sys.symmetric_keys where name =

N'##MS_DatabaseMasterKey##') create master key encryption by password =

N'Admin Key Password !2#4'

use [WSS_Content]

if not exists (select groupname from sysfilegroups where

groupname=N'RBSFilestreamProvider') alter database [WSS_Content]

add filegroup RBSFilestreamProvider contains filestream

use [WSS_Content]

alter database [WSS_Content] add file (name = RBSFilestreamFile,

filename = 'c:\blobstore') to filegroup RBSFilestreamProvider

在上面這些SQL指令中,标記為綠色的,是你在複制了這些指令後,需要按照你的環境中的實際情況,需要修改的部分。"WSS_Content"需要修改為你要啟用RBS的内容資料庫的實際名稱。"c:\blobstore"要修改成你希望用來存放BLOB檔案的檔案夾路徑。從實踐角度出發,你需要選擇一個位于非系統分區、剩餘空間大、速度快、穩定可靠的檔案夾。注意,這個檔案夾隻能是一個本地路徑,而不能是網絡路徑,因為FILESTREAM不支援遠端NTFS檔案夾。另外,這個檔案夾也不要事先建立好,上面的SQL指令會自動幫你将這個檔案夾建立出來。

MOSS/Sharepoint RBS概念以及運用

上述SQL語句執行完畢之後,可以打開資料總管,确認在SQL Server伺服器上,相應的檔案夾已經建立成功。

4、安裝RBS FILESTREAM Provider

将下載下傳到的RBS_x64.msi檔案複制到SharePoint伺服器場中的每一台伺服器上,所有的SQL Server資料庫伺服器和SharePoint伺服器上都必須安裝此RBS Provider。

先在SQL Server資料庫上和SharePoint伺服器上(如果伺服器場中有多台SharePoint伺服器,則在一台Web前端伺服器上),安裝RBS FILESTREAM Provider,安裝步驟如下。

以管理者身份運作指令提示符。

MOSS/Sharepoint RBS概念以及運用

在指令提示符視窗中,使用"cd"指令将目前路徑設定為"RBS_x64.msi"所在的檔案夾,然後輸入下面這行指令并執行:

msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content" DBINSTANCE="sp2010" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1

上面指令中用綠色标注的部分,是需要按照你的環境中的實際情況進行修改的部分。"WSS_Content"需要修改為需要啟用RBS的内容資料庫,"sp2010"需要修改為實際的SQL Server 2008執行個體名稱(如果在安裝SQL Server 2008時,你沒有使用預設執行個體名稱,那麼它的值可能類似"sp2010\express"這樣的格式)。對每個内容資料庫,都隻應該使用msiexec.exe執行一次這條指令。

MOSS/Sharepoint RBS概念以及運用

在你敲入了上面這行很長的指令并敲下回車之後,指令提示符視窗看起來會立即執行完成,但實際上,背景會繼續執行RBS Provider的安裝程式。你可以打開Windows任務管理器,應該會看到有好幾個msiexec.exe程序在執行中。過上一會兒,任務管理器中就不會再顯示有幾個msiexec.exe在運作(在我的環境中仍會剩下一個另外的msiexec.exe程序),這表明RBS Provider安裝過程已經完成。

MOSS/Sharepoint RBS概念以及運用

在RBS Provider安裝過程中,它會将log資訊寫入與"RBS_x64.msi"安裝檔案同目錄的"rbs_install_log.exe"檔案。從資料總管中打開這個log檔案,搜尋其中是否有如下"Installation completed successfully"之類的資訊,這些資訊表示"RBS_x64.msi"的安裝是成功的。

MOSS/Sharepoint RBS概念以及運用

如果在你的SharePoint伺服器場中,隻有一台SharePoint伺服器,那麼按照上面的描述,在它上面安裝完RBS FILESTRREAM Provider就完事了。但是如果伺服器場中存在多台SharePoint伺服器,那麼就需要繼續在其他的Web前端伺服器和應用伺服器上,安裝RBS FILESTREAM Provider,不過,指令提示符裡面的指令需要換成:

msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi DBNAME="WSS_Content" DBINSTANCE="sp2010" ADDLOCAL="Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer"

在RBS FILESTREAM Provider安裝到所有伺服器上之後,打開SQL Server 2008 Management Studio,重新整理内容資料庫的Table清單,應該會看到多出來許多名稱以"mssqlrbs"開頭的,與RBS有關的Table。如果在查詢視窗中執行下面的SQL語句,也應該能查詢出一些結果。

select * from dbo.sysobjects where name like 'rbs%'

MOSS/Sharepoint RBS概念以及運用

如果在内容資料庫中并沒有上面這些Table,運作上面的SQL語句也查詢不出任何結果,那麼表明RBS Provider并沒有正确安裝到内容資料庫上。如果真是這樣,在每台伺服器上,打開資料總管,輕按兩下"RBS_x64.msi",然後在出現的安裝界面中,使用"解除安裝"選項先将RBS Provider解除安裝掉,然後再按照上面的步驟,重新在指令提示符視窗中嘗試安裝它。

5、為内容資料庫啟用RBS FILESTREAM Provider

終于到了最後一個步驟。在SharePoint伺服器上,打開SharePoint 2010 Management Shell,這是一個基于Windows Powershell的指令行管理工具。

MOSS/Sharepoint RBS概念以及運用

在SharePoint 2010 Management Shell中,依次執行下面的指令:

(1) $cdb = Get-SPContentDatabase "WSS_Content"

擷取到指定的内容資料庫(SPContentDatabase)對象執行個體,綠色所标注的"WSS_Content"需要更換成在你的環境中,實際的内容資料庫名稱。

(2) $rbss = $cdb.RemoteBlobStorageSettings

擷取内容資料庫的RBS設定(SPRemoteBlobStorageSettings)對象執行個體。

(3) $rbss.Installed()

檢查在内容資料庫上是否安裝了RBS,如果需要,更新相應的屬性值。

(4) $rbss.Enable()

在内容資料庫上啟用RBS。

(5) $pvdName = $rbss.GetProviderNames()[0]

擷取第一個注冊到内容資料庫上的RBS Provider的名稱。

(6) $rbss.SetActiveProviderName($pvdName)

為内容資料庫設定要激活的RBS Provider。

MOSS/Sharepoint RBS概念以及運用

然後,你可以執行"$rbss"來檢視它的一些屬性值,如果設定正确,它輸出的内容應該如上圖所示。

如果你啟用RBS FILESTREAM Provider的内容資料庫中,已經存儲了一個網站集,那麼在你啟用了RBS Provider之後,網站集裡面的文檔,并不會自動的馬上通過FILESTREAM,轉存到NTFS檔案系統上。隻有新增的文檔才會被存儲到NTFS檔案系統上,網站集裡面之前上載的文檔,仍然會儲存在内容資料庫裡面。如果你希望現在将那些舊的文檔,統統轉存到我們所指定的NTFS檔案系統中,那麼可以繼續在SharePoint 2010 Management Shell中執行下面這個指令:

(7) $rbss.Migrate()

如果你希望設定一個文檔大小門檻值,隻有大小超過此門檻值的文檔,才通過RBS FILESTREAM Provider存儲到NTFS檔案系統上,而小于此門檻值的文檔,仍然存儲在内容資料庫中,那麼可以在SharePoint 2010 Management Shell中繼續執行下面的指令(假設門檻值是1048000位元組,也就是1M):

(8) $rbss.MinimumBlobStorageSize = 1048000

(9) $rbss.Update()

上面的這些指令,都是針對一個内容資料庫的。如果你有多個内容資料庫要啟用RBS,那麼就對每個内容資料庫都執行一遍上述指令。

6、檢查最終效果

在完成了上述所有操作步驟之後,在SharePoint網站中上載一些文檔,然後檢查你所設定的NTFS檔案夾,裡面應該會包含有一些子檔案夾,存儲着這些文檔。

源位址:

如果使用SharePoint 2007作為文檔管理平台,它很讓人诟病的一點就是,SharePoint 2007将檔案本身直接存儲在SQL Server資料庫之中。雖然Windows SharePoint Services 3.0 SP1增加了一個External BLOB Storage(EBS)接口,但是微軟并沒有提供實作,而是需要開發人員自己來實作它。

SharePoint 2010仍然對EBS提供相容,但并不推薦使用EBS,推薦的解決方案,乃是使用SQL Server 2008 Remote BLOB Storage(RBS)。

SQL RBS是一組API,通過RBS,一個SQL Server 2008資料庫就不再需要将大二進制資料(BLOB)存儲在資料庫内部,而是可以存儲到外面的某個地方,在資料庫裡面可能隻會存儲一個對外部BLOB資料的引用。SQL Server 2008和SQL Server 2008 R2都支援RBS。

聽起來RBS實在是一個很好的東東。但是(總是有但是),RBS僅僅是一組API,換句話說,RBS可以讓開發人員利用這組API,開發出一個RBS Provider,真正實作對BLOB資料的存取。如果沒有RBS Provider,RBS自己可不會自動的将BLOB存儲到某個指定的地方去。不同的RBS Provider,可以讓我們将BLOB存儲到檔案系統、磁盤儲存設備、檔案伺服器等等各種地方,反正不繼續放到SQL Server資料庫裡面就對了。

MOSS/Sharepoint RBS概念以及運用

在你對RBS有了初步認識之後,我們接着介紹SQL Server 2008裡面的另外一個新特性:FILESTREAM。下面這句話摘自SQL Server 2008聯機叢書:“通過将 varbinary(max) 二進制大型對象 (BLOB) 資料以檔案形式存儲在檔案系統上,FILESTREAM 使 SQL Server 資料庫引擎和 NTFS 檔案系統成為了一個整體。”是以,FILESTREAM可以讓管理者選擇将SQL Server資料庫裡面的varbinary(max)類型BLOB資料,存儲到本地NTFS檔案系統上。在通過FILESTREAM對BLOB資料進行存取的時候,還能順便能夠享受到資料庫事務處理的好處。

聽起來,FILESTREAM和RBS很相似,是不是?但其實,RBS和FILESTREAM是兩個不同的東東,它們互不依賴。RBS是一組API接口,通過這組API,應用程式就能将BLOB資料存儲到資料庫之外的某個地方,具體實作由開發人員建立的RBS Provider來完成。FILESTREAM是SQL Server 2008内置的一個特性,它能将原本存儲在資料庫裡面的BLOB資料,存儲到伺服器本地的NTFS檔案系統上。

SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。是以,如果沒有一個RBS Provider,我們并不能馬上就将SharePoint 2010裡面存儲的檔案,存儲到資料庫之外的某個地方去。但是,既然FILESTREAM特性已經擁有了現成的将資料庫中的BLOB資料存儲到NTFS檔案系統上的能力,為什麼不能直接使用FILESTREAM,做一個RBS FILESTREAM Provider,也就是利用FILESTREAM的功能實作的一個RBS Provider呢?這樣,豈不是就能将SharePoint 2010中的檔案,都存儲到NTFS檔案系統上了嗎?

微軟也想到了,是以,微軟以特性包(Feature Pack)的形式,提供了一個RBS FILESTREAM Provider。你可以從這裡下載下傳x64版本的RBS FILESTREAM Provider。但是要在SharePoint 2010系統上安裝并使用它,也是需要按照一定的步驟來操作的。下面就是具體的操作步驟。

源位址:http://kaneboy.blog.51cto.com/1308893/288697

posted @ 2010-12-21 20:47 Alvin_jstu 閱讀(16) | 評論(0) | 編輯 2010年12月20日 WSS和MOSS的差別

Microsoft Office SharePoint Service 2007 是微軟最新的企業協作應用和開發平台。簡稱MOSS,MOSS基于Window SharePonit Service 3.0開發,簡稱WSS。MOSS是收費的,WSS是免費的,隻要擁有了Window Server2003的許可,就可以免費安裝WSS。

WSS擁有站點,清單,文檔庫,文檔管理,web part,叢集部署,站點内搜尋,基于WF的工作流等功能。MOSS擴充實作了增強的文檔管理,企業搜尋,擴充了工作流,引入了web内容管理,Form Service , Excel Service,個人站點等。

                   以下章節若沒有特别強調,則所有内容都适合WSS和MOSS的。所有适合WSS的内容也一定适合MOSS,反之則不然。

WSS對IIS的擴充

         WSS基于标準的asp.net 2.0開發 ,這是WSS開發中要始終記住的一點. 要精通WSS開發,一定要精通asp.net。

         每次建立一個WSS站點,IIS中會同樣建立一個網站,我們稱這個網站是被WSS擴充後的網站。那麼擴充後,發生了什麼呢?

         首先,IIS站點的所有檔案的處理都被影射為需要asp.net運作引擎處理,而标準的IIS站點隻有asp.net本身的檔案(如aspx,asmx等)才需要運作引擎處理的,其他檔案由IIS直接輸出到用戶端。

         檢視一下站點下的web.config檔案,我們看到有這麼一項配置:

<httpHandlers>

      <removeverb="GET,HEAD,POST"path="*" />

      <addverb="GET,HEAD,POST"path="*"type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

      <addverb="OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY,GETLIB,PROPPATCH,MKCOL,DELETE,(GETSOURCE),(HEADSOURCE),(POSTSOURCE)"path="*"type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

    </httpHandlers>

HttpHandler是asp.net的一個擴充機制,通過實作一個HttpHandler,可以來直接針對較低層的Request,Response程式設計,WSS通過實作自己的HttpHandler實作對用戶端所有請求檔案的處理,并且,通過擴充Http請求(擴充OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY等動作),實作文檔的線上編輯,線上編輯的實作原理可參考這篇文章:http://www.cnblogs.com/jianyi0115/archive/2007/07/15/818566.html

         注意httpModules節點下的這項配置:

<addname="SPRequest"type="Microsoft.SharePoint.ApplicationRuntime.SPRequestModule, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

         HttpModule也是asp.net的擴充機制,通過實作一個HttpModule,可以切入Http請求的某個階段做出相應的處理,如身份校驗,初始化一些通用子產品等。

         WSS通過實作SPRequestModule,切入Http請求,進行一些需要的處理。最重要的是,WSS通過SPRequestModule引入了SPVirtualPathProvider。SPRequestModule的OnInit方法中有這個關鍵的一句:

    SPVirtualPathProvider provider2 = new SPVirtualPathProvider();

HostingEnvironment.RegisterVirtualPathProvider(provider2);

VirtualPathProvider也是asp.net的擴充機制,通過實作VirtualPathProvider可以控制asp.net頁面的提供機制,預設的VirtualPathProvider的實作直接通路伺服器硬碟上的檔案。WSS通過SPVirtualPathProvider實作了自己的頁面Provider機制—WSS站點的頁面是由檔案系統和資料庫聯合存儲的。

建立一個WSS站點後,它的所有的檔案都是放在硬碟上,我們通過SharePonit Designer打開一個WSS站點,可以看到完整的目錄結構,這些檔案實際上全部都影射到檔案系統上的某個檔案,這個功能叫做ghost。當我們通過SPD修改了某個檔案之後,WSS會把這個修改的檔案儲存到資料庫,這個檔案跟原始的檔案系統上的檔案就脫離關聯了,這叫做unghost.通過ghost,WSS做到了是不同的站點可以共享相同的檔案,通過unghost,WSS又實作了一個站點對頁面的修改不會影響到其他站點.

WSS的一些概念

1)       Farm -- 伺服器場

     伺服器場是WSS最大的一個概念,整個WSS的所有伺服器,包括前端伺服器,資料伺服器,組成了伺服器場,一個伺服器場有一個配置資料庫,多個内容資料庫,多個應用程式..

2)       Application -- 應用程式

應用程式對應IIS的一個站點,它是一個安全和程式檔案的獨立主體。即一個應用程式可以有自己的使用者身份認證機制,有自己獨立的一套運作程式檔案,一個應用程式會映射到硬碟上的一個獨立的目錄,一般為C:"Inetpub"wwwroot"wss"VirtualDirectories"裡面的某個目錄.一個應用程式下可以有多個站點集.

3)       Site Collection -- 站點集

     站點集是一個虛拟的單元,在内容,使用者和權限上是獨立的. 一個站點集可以有多個子站點.

4)       Web -- 站點

     站點内容和權限的組織單元.一個站點可以有多個子站點,多個清單,文檔庫,多個頁面.站點可以有獨立的權限.站點可以有子站點,站點和子站點組成樹型關系.子站點的權限預設內建于父站點.

5)       List-清單和文檔庫

     清單可以了解成一個資料庫表,用來存儲一些業務資料。一個清單有很多字段。

                    WSS3.0的清單可以存放多個内容類型。

6)       ConentType--内容類型

                    内容類型可以了解成資料實體,如使用者,聯系人,日程資料等。一個内容類型包含很多字段。

7)       Field-字段

     可以了解成資料庫的字段,Field是WSS整個架構的最底層元素。

WSS的對象模型       

         WSS開發很大一部分工作是需要調用各種WSS中的對象來實作的.常用的對象都放在Microsoft.SharePont這個dll中.我們通常的開發都要從站點集對象開始.

Using(SPSite site = new SPSte(“”))

{

}                

         SPSite和SPWeb對象都是需要釋放資源的,如果我們自己構造這兩個對象,一定要在代碼執行完畢時調用Dispose方法,來釋放資源.

         如果我們的代碼處于WSS的運作環境之下,即代碼直接運作在WSS的頁面上,那麼我們可以直接從WSS的上下文中擷取到相關對象.

SPSIte site = SPContext.Current.Site;

SPWeb web = SPContext.Current.Web;  

SPUser user = SPContext.Current.Web.CurrentUser;    

        上下文對象提供了更好的性能(不需要重複建立對象),并且直接跟目前使用者的身份挂鈎.上下文對象由運作環境進行資源管理,不需要我們用代碼來Dispose.

MOSS2007建構與WSS V3之上,并在其之上加了很多的企業級應用,其關系如下圖所示:

MOSS/Sharepoint RBS概念以及運用

原文摘自:http://blog.csdn.net/figerdeng/archive/2010/04/26/5532029.aspx

posted @ 2010-12-20 16:07 Alvin_jstu 閱讀(71) | 評論(0) | 編輯 2010年11月25日 SQL SERVER 2005資料庫總結

MOSS/Sharepoint RBS概念以及運用

---------------------------------------------------------------------

常見的基本語句:

select 字段 from 表名 where 條件

insert into 表名(字段) values(内容)

update 表名  set 字段=新内容 where 條件

drop from 表名

truncate table 表名--整表清空,不寫日志,速度極快但很危險

--我們通常通過主鍵來删除内容

---------------------------------------------------------------------

對表格進行處理:

1.建立表格

create table 表名

create table ProdutPriceAndStock--表與表之間的1對1關系

(

    productid int not null primary key foreign key references Product(productid),

    --産品标示号,既當主鍵有當外鍵展現了一對一的關系

    price money not null,

    productcount  int not null--産品目前庫存數量

)

2.删除表格

drop table 表名

3.增加表格字段列

alter table 表名

    add 字段列名 字段類型

4.删除表格字段列

alter table 表名

    drop column 列名

5.修改表格字段列屬性

alter table 列名

    alter column 列名 字段屬性 限制

6.删除表格字段列限制

alter table 表名

    drop constraint  限制名

7.修改表格字段列限制

alter table 表名

    alter column 列名 字段屬性 限制 default 0 for 列名

---------------------------------------------------------------------

程式段程式設計

--程式三要素:定義資料容器、指派、使用

begin--程式段的開始

-----------定義

--declare @局部變量名稱 資料類型

--特殊定義 --表資料類型

declare @infotable table

       (

           username nvarchar(20),

           userpwd nvarchar(50)

       )

-----------指派

set @num=5 ---使用常量來指派

set @num=(select count(accountid) from AccountInfo)---使用子查詢來指派

select @num=30,@str='hello',@isgood=1,@onechar='X'--同時對多個資料容器指派,往往針對表中不同字段來指派

--針對表類型的變量,必須使用操作表資料的語句來指派

-----------使用

--在伺服器端的控制台中輸出,笑話ijiyunxing是無人可以看到作為重要的調試手段

--通過簡單程式來完成運算及簡單的業務邏輯

--大兔3元每隻,小兔一進制三隻,百元買白兔

begin

declare @bigcount int,@smallcount int

declare @infotable table

       (

          大兔數量 int,

          小兔數量 int

       )

set @bigcount=1

set @[email protected]

while(@bigcount<=100)

    begin

       if((@bigcount*[email protected]/3)=100)

           begin

              print '祝賀你找到答案了'

              print '大兔:'+Convert(nvarchar(10),@bigcount)+'隻'

              print '小兔:'+Convert(nvarchar(10),@smallcount)+'隻'

              insert into @infotable(大兔數量,小兔數量) values(@bigcount,@smallcount)

              break--跳出循環

           end

       else

           begin

              print 'bigcount='+Convert(nvarchar(20),@bigcount)+',非答案'

           end

       set @[email protected]+1

       set @[email protected]

    end

select * from @infotable

end

go

---------------------------------------------------------------------

建立視圖

目的:建立視圖其主要目的是為了查詢使用

create view  視圖名

as

select .........

單表視圖

多表視圖---主要考查表的連結

    inner join内聯接----重點,後續的外聯接隻在特殊資料情況下使用

    left outer join左外聯接

    right outer join右外聯接

    full outer join全外聯接

--交叉聯接

select * from Category as c cross join Product as p

go

--内連接配接inner join----on,尋找有效地資料對應項

select * from Category as c, Product as p

where c.categoryid=p.p_c_id

go

--

select categoryname as 分類名稱 ,count(productid) as 分類數量

from Category as c ,Product as p

where c.categoryid=p.p_c_id

group by categoryname

go

select * from Category as c

--full outer全外聯接

--left outer左

--right outer右

 join Product as p

 on c.categoryid=p.p_c_id

go

---------------------------------------------------------------------

--UDF user defined function 使用者自定義函數

--UDF--标量函數,内嵌表值函數,多語句标志函數

--可以接受參數,完成各種常見的查詢任務,根據任務結果的不同性質來合理選用不同的函數方式

--标量函數:查詢結果為獨立的标量值,例如:數字。文字

--我們希望了解任何一個商品分類的目前産品數量

--可變量:産品分類名稱

--查詢目标:産品數量---int--标量------------------FN

create function QueryProductCountByCategory---函數名

(@Categoryname nvarchar(10))---形參字段

returns int-----傳回值

with encryption---加密

as

begin

    declare @count int --傳回變量值

    declare @categoryid nvarchar(15)

    set @categoryid=(select categoryid from Category where [email protected])

    if(@categoryid is null)    

       begin

       set @count=-1--利用無效的傳回值來表示參數有誤

       end

    else

       begin

       set @count=(select count(productid)from Product where [email protected])

--得到大于等于0的有效結果值

       end

    return @count

end

go

-如果我們查詢的目标是一個可以直接得到的結果集表格

--内嵌表值函數------------------------------------IN

--我們希望了解任何一個産品分類的所有産品資訊,何解

create function QueryProductInfoByCategory---函數名

(@categoryname nvarchar(10))---形參字段

returns table

with encryption

as

return

(select * from ProductInfoView where 分類名[email protected])

go

--如果我們發現有時候要得到的結果不友善進行直接查詢得到,我們可以将查詢過程分散,

使用多于具有标志函數來完成全過程

--使用多語句表值函數------------------------------TF

--Multistatement Table_valued Functions

--我們想要知道目前的有效使用者數量,何解

create function QueryAccountInfoByEnable()

returns @infotable table

(數量分類 nvarchar(20),本類數量 int)

with encryption

as

begin

    declare @enablecount int,@disablecount int

    set @enablecount =(select count(accountid)from AccountInfo where [enable]=1)

    set @disablecount=(select count(accountid)from AccountInfo where [enable]=0)

    insert into @infotable(數量分類,本類數量)

    values('有效使用者',@enablecount)

    insert into @infotable(數量分類,本類數量)

    values('無效使用者',@disablecount)

    return

end

go

---------------------------------------------------------------------

--建立存儲過程,接受參數,完成合理的執行過程,執行過程預設可以不提供傳回值,預設等效于void方法

--------------SP

create procedure RegAccountInfo

       @變量名 變量類型(實參)

with encryption

as

begin

..................

end

go

execute SP名 (形參)

go

---------------------------------------------------------------------

--觸發器:一種特殊的存儲過程,滿足某些對資料的發生變化的操作條件時會自動執行,

--觸發器的設計者需要編寫合理的完整代碼以表示自動執行的邏輯達到維護資料完整性的要求

1.觸發器是綁定在一個表中的

2.觸發器的執行條件為:所綁定的表中資料發生了變化,而不是查詢

3.常見的觸發器的執行時機為:改變的代碼在緩存中産生執行效果之後觸發

4.觸發過程中有兩個内部輔助表:inserted與deleted,分别表示本次操作将會加入的新資料及操作中

可能被删除的就資料,任何一次update操作都會同時導緻inserted,delected發生改變,着兩個表格

的格式與本表完全一緻

create trigger AddSaleScoreTrigger

on SaleLog --on後面要寫的是綁定表,綁定表的變化導緻觸發的執行

for insert --描述觸發的前提

as

begin

declare @buycount int ,@buyprice money,@buyaccount nvarchar(20)

declare @oldscore money,@newscore money

select @buycount=salecount,

       @buyprice=saleprice,

       @buyaccount=accountid

from inserted --從最新變化的内部資料表中擷取關鍵資料

set @oldscore=(select buyscore from AccountInfo where [email protected])

set @[email protected][email protected]*@buyprice

update AccountInfo set [email protected]

where [email protected]

end

go

---------------------------------------------------------------------------------------

use MyDB

GO

--假設有兩個由于曆史原因造成的使用者資料表需要歸并,

create table UserInfoOne

(

    userid nvarchar(20) not null primary key,

    userpwd nvarchar(30) not null

)

go

create table UserInfoTwo

(

    userid nvarchar(20) not null primary key,

    userpwd nvarchar(30) not null

)

go

delete from UserInfoOne

delete from UserInfoTwo

go

insert into UserInfoOne(userid,userpwd) values ('mike','mike2122')

insert into UserInfoOne(userid,userpwd) values ('jie','jie2122')

insert into UserInfoOne(userid,userpwd) values ('hong','hong2122')

go

insert into UserInfoTwo(userid,userpwd) values ('mike','mike2122')

insert into UserInfoTwo(userid,userpwd) values ('xiao','xiao2122')

insert into UserInfoTwo(userid,userpwd) values ('yun','yun2122')

go

select * from UserInfoOne

select* from UserInfoTwo

go

--假設操作目标:userinfotwo->userinfoone

--使用遊标分行處理

begin

--聲明遊标

declare MoveUserInfoTwo cursor

for

select userid,userpwd from UserInfoTwo

--打開遊标,準備開始讀取操作

open MoveUserInfoTwo

--執行讀取

declare @userid varchar(20) ,@userpwd nvarchar(30)

fetch next from MoveUseRInfoTwo into @userid,@userpwd

while(@@fetch_status=0)

    begin

    insert into   UserInfoOne(userid,userpwd) values(@userid,@userpwd)

    fetch next from MoveUserInfoTwo into @userid,@userpwd

    end

--完成遊标操作,關閉遊标

close MoveUserInfoTwo

--釋放遊标

deallocate MoveUserInfoTwo

end

go

--遊标結合事務操作

begin transaction MoveUserInfoTrans

begin

declare @errorcount int

set @errorcount=0

--聲明遊标

declare MoveUserInfoTwo cursor

for

select userid, userpwd from UserInfoTwo

--打開遊标

open MoveUserInfoTwo

--執行讀取

declare @userid nvarchar(20),@userpwd nvarchar(30)

fetch next from MoveUserInfoTwo into @userid,@userpwd

while(@@fetch_status=0)

begin

insert into UserInfoOne(userid,userpwd) values(@userid,@userpwd)

if(@@error!=0)

begin

set @errorco[email protected]+1

break

end

fetch next from MoveUserInfoTwo into @userid,@userpwd

end

--完成遊标操作關閉遊标

close MoveUserInfoTwo

--釋放遊标

deallocate MoveUserInfoTwo

--驗證本次事務的操作過程

if(@errorcount=0)

    begin

    commit transaction MoveUserInfoTrans

    print'事務送出成功'

    end

else

    begin

    rollback transaction MoveUserInfoTrans

    print'執行過程有誤,事務已復原'

    end

end

go

群:212099235

繼續閱讀