日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MOSS/Sharepoint RBS概念以及运用

發(fā)布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MOSS/Sharepoint RBS概念以及运用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

注:原文作者不知道是誰,先收藏了這篇(若有侵權(quán),請留言,刪除)

EBS -> External Blob Storage 外部大二進制對象存儲
RBS -> Remote Blob Storage 遠(yuǎn)程大二進制對象存儲

這倆概念據(jù)我所知,SharePoint領(lǐng)域應(yīng)用比較廣泛,如果你對SharePoint存儲結(jié)構(gòu)比較熟悉的話,應(yīng)該比較好理解,簡單的說SharePoint算是一種Web應(yīng)用程序,我們能夠通過網(wǎng)頁,上傳或者管理數(shù)據(jù),比如文檔,照片,視頻,音頻等,這些文件的實際載體是數(shù)據(jù)庫,一般就是微軟的SQL Server,在數(shù)據(jù)庫表中,這些文件以二進制對象(文件流一樣的東西)存儲在某一個字段中。隨著數(shù)據(jù)量增大,數(shù)據(jù)庫體積會越來越龐大,最后影響數(shù)據(jù)庫的性能和運營成本,所以人們開始試圖將數(shù)據(jù)庫中的文件流取出來存儲到文件系統(tǒng)(例如本地磁盤)上,在SharePoint 2007的時候,EBS誕生了,SharePoint提供了類似于一個接口供開發(fā)人員實現(xiàn),可以讓SharePoint能夠識別存儲到其他位置的數(shù)據(jù)(非SQL Server)。到了SharePoint?2010的時代,數(shù)據(jù)庫版本已經(jīng)更新了很多,貌似是從SQL Server 08 SP2版本開始的,具體版本記不清了,數(shù)據(jù)庫本身支持了一種文件的外部存儲技術(shù),本質(zhì)上RBS是SQL Server 2008的API,并且使用了SQL Server 2008中的新的FILESTREAM功能。相當(dāng)于數(shù)據(jù)庫的接口。所以區(qū)別也就比較明顯了。可能說的不太對,大體上是這么個意思。

MOSS -》RBS? API?-》FileStream (API FileStream均由sql server 實現(xiàn)??)

如果使用SharePoint 2007作為文檔管理平臺,它很讓人詬病的一點就是,SharePoint 2007是將文件本身直接存儲在SQL Server數(shù)據(jù)庫(WSS_CONTENT.alldoc/doctostream.docstream)之中。雖然Windows SharePoint Services 3.0 SP1增加了一個External BLOB Storage(EBS)接口,但是微軟并沒有提供實現(xiàn),而是需要開發(fā)人員自己來實現(xiàn)它。?

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

SQL RBS是一組API,通過RBS,一個SQL Server 2008數(shù)據(jù)庫就不再需要將大二進制數(shù)據(jù)(BLOB)存儲在數(shù)據(jù)庫內(nèi)部,而是可以存儲到外面的某個地方,在數(shù)據(jù)庫里面可能只會存儲一個對外部BLOB數(shù)據(jù)的引用。SQL Server 2008和SQL Server 2008 R2都支持RBS。?

聽起來RBS實在是一個很好的東東。但是(總是有但是),RBS僅僅是一組API,換句話說,RBS可以讓開發(fā)人員利用這組API,開發(fā)出一個RBS Provider,真正實現(xiàn)對BLOB數(shù)據(jù)的存取。如果沒有RBS Provider,RBS自己可不會自動的將BLOB存儲到某個指定的地方去。不同的RBS Provider,可以讓我們將BLOB存儲到文件系統(tǒng)、磁盤存儲設(shè)備、文件服務(wù)器等等各種地方,反正不繼續(xù)放到SQL Server數(shù)據(jù)庫里面就對了。?
??

在你對RBS有了初步認(rèn)識之后,我們接著介紹SQL Server 2008里面的另外一個新特性:FILESTREAM。下面這句話摘自SQL Server 2008聯(lián)機叢書:“通過將 varbinary(max) 二進制大型對象 (BLOB) 數(shù)據(jù)以文件形式存儲在文件系統(tǒng)上,FILESTREAM 使 SQL Server 數(shù)據(jù)庫引擎和 NTFS 文件系統(tǒng)成為了一個整體。”所以,FILESTREAM可以讓管理員選擇將SQL Server數(shù)據(jù)庫里面的varbinary(max)類型BLOB數(shù)據(jù),存儲到本地NTFS文件系統(tǒng)上。在通過FILESTREAM對BLOB數(shù)據(jù)進行存取的時候,還能順便能夠享受到數(shù)據(jù)庫事務(wù)處理的好處。?

聽起來,FILESTREAM和RBS很相似,是不是?但其實,RBS和FILESTREAM是兩個不同的東東,它們互不依賴RBS是一組API接口,通過這組API,應(yīng)用程序就能將BLOB數(shù)據(jù)存儲到數(shù)據(jù)庫之外的某個地方,具體實現(xiàn)由開發(fā)人員創(chuàng)建的RBS Provider來完成FILESTREAM是SQL Server 2008內(nèi)置的一個特性,它能將原本存儲在數(shù)據(jù)庫里面的BLOB數(shù)據(jù),存儲到服務(wù)器本地的NTFS文件系統(tǒng)上。?

SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。所以,如果沒有一個RBS Provider,我們并不能馬上就將SharePoint 2010里面存儲的文件,存儲到數(shù)據(jù)庫之外的某個地方去。但是,既然FILESTREAM特性已經(jīng)擁有了現(xiàn)成的將數(shù)據(jù)庫中的BLOB數(shù)據(jù)存儲到NTFS文件系統(tǒng)上的能力,為什么不能直接使用FILESTREAM,做一個RBS FILESTREAM Provider,也就是利用FILESTREAM的功能實現(xiàn)的一個RBS Provider呢?這樣,豈不是就能將SharePoint 2010中的文件,都存儲到NTFS文件系統(tǒng)上了嗎??

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

1、確定SQL Server 2008已經(jīng)啟用了FILESTREAM?

在安裝SQL Server 2008時,會有一個步驟提示是否安裝FILESTREAM。如果你不確定是否安裝了此特性,從SQL Server 2008服務(wù)器上打開SQL Server配置管理器,從左邊選中"SQL Server 服務(wù)",然后從右邊的窗格中用鼠標(biāo)右鍵點擊運行的SQL Server實例,選擇"屬性"菜單項。?
??

在打開的屬性窗口中,選擇"FILESTREAM"選項卡,然后選中啟用FILESTREAM的選擇框,點擊"確定"按鈕。?
??

打開SQL Server Management Studio,選中左側(cè)的SQL Server實例,然后點擊工具欄區(qū)域的"新建查詢",打開一個查詢界面,然后在里面輸入下面的SQL語句并執(zhí)行。?

EXEC sp_configure filestream_access_level, 2?
RECONFIGURE?
?

2、確定要應(yīng)用RBS FILESTREAM Provider的內(nèi)容數(shù)據(jù)庫?

由于RBS是基于數(shù)據(jù)庫為單元來啟用的,所以你可以選擇在哪些SharePoint內(nèi)容數(shù)據(jù)庫上啟用RBS。這意味著,對于SharePoint服務(wù)器場里面那些存儲文件數(shù)量并不多的內(nèi)容數(shù)據(jù)庫,可能并沒有必要為它啟用RBS,而那些可能會存儲大量文件的內(nèi)容數(shù)據(jù)庫,則可以啟用RBS,有效的優(yōu)化它們。?

SharePoint 2010系統(tǒng)中,內(nèi)容數(shù)據(jù)庫與網(wǎng)站的關(guān)系是:?

● 一個Web應(yīng)用程序可以使用一個或多個內(nèi)容數(shù)據(jù)庫;?
● 在新建Web應(yīng)用程序時,會為其自動創(chuàng)建一個內(nèi)容數(shù)據(jù)庫,管理員可以稍后為此Web應(yīng)用程序創(chuàng)建更多的內(nèi)容數(shù)據(jù)庫;?
● 在Web應(yīng)用程序中創(chuàng)建一個網(wǎng)站集時,這個網(wǎng)站集會被存儲到Web應(yīng)用程序的某個內(nèi)容數(shù)據(jù)庫中;?
● 一個網(wǎng)站集(包括其所包含的首要網(wǎng)站和所有子網(wǎng)站),只能被存儲在一個內(nèi)容數(shù)據(jù)庫中,而不能被分拆存儲到多個內(nèi)容數(shù)據(jù)庫中。?

管理員可以打開SharePoint 2010管理中心的內(nèi)容數(shù)據(jù)庫管理界面,查看每個Web應(yīng)用程序所使用的內(nèi)容數(shù)據(jù)庫,或是為某個Web應(yīng)用程序添加新的內(nèi)容數(shù)據(jù)庫。?
?

在下面的示范操作中,我們就為上圖中所示的這個名為"WSS_Content"的內(nèi)容數(shù)據(jù)庫,啟用RBS。?

3、配置內(nèi)容數(shù)據(jù)庫?

在確定了要啟用RBS的內(nèi)容數(shù)據(jù)庫之后,打開SQL Server 2008 Management Studio,找到這個內(nèi)容數(shù)據(jù)庫,用鼠標(biāo)右鍵點擊并選擇"新建查詢"菜單項。?
??

在打開的查詢窗口中,輸入下面這些SQL語句并執(zhí)行。?

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指令中,標(biāo)記為藍(lán)色的,是你在復(fù)制了這些指令后,需要按照你的環(huán)境中的實際情況,需要修改的部分。"WSS_Content"需要修改為你要啟用RBS的內(nèi)容數(shù)據(jù)庫的實際名稱。"c:\blobstore"要修改成你希望用來存放BLOB文件的文件夾路徑。從實踐角度出發(fā),你需要選擇一個位于非系統(tǒng)分區(qū)、剩余空間大、速度快、穩(wěn)定可靠的文件夾。注意,這個文件夾只能是一個本地路徑,而不能是網(wǎng)絡(luò)路徑,因為FILESTREAM不支持遠(yuǎn)程NTFS文件夾,也就是說,這個文件夾是處于 數(shù)據(jù)庫 所在的服務(wù)器上的。另外,這個文件夾也不要事先建立好,上面的SQL指令會自動幫你將這個文件夾創(chuàng)建出來。?
??

上述SQL語句執(zhí)行完畢之后,可以打開資源管理器,確認(rèn)在SQL Server服務(wù)器上,相應(yīng)的文件夾已經(jīng)創(chuàng)建成功。?

4、安裝RBS FILESTREAM Provider?

將下載到的RBS_x64.msi文件復(fù)制到SharePoint服務(wù)器場中的每一臺服務(wù)器上,所有的SQL Server數(shù)據(jù)庫服務(wù)器和SharePoint服務(wù)器上都必須安裝此RBS Provider。?

先在SQL Server數(shù)據(jù)庫上和SharePoint服務(wù)器上(如果服務(wù)器場中有多臺SharePoint服務(wù)器,則在一臺Web前端服務(wù)器上),安裝RBS FILESTREAM Provider,安裝步驟如下。?

以管理員身份運行命令提示符。?
??

在命令提示符窗口中,使用"cd"指令將當(dāng)前路徑設(shè)置為"RBS_x64.msi"所在的文件夾,然后輸入下面這行指令并執(zhí)行:?

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?

上面指令中用藍(lán)色標(biāo)注的部分,是需要按照你的環(huán)境中的實際情況進行修改的部分。"WSS_Content"需要修改為需要啟用RBS的內(nèi)容數(shù)據(jù)庫,"sp2010"需要修改為實際的SQL Server 2008實例名稱(如果在安裝SQL Server 2008時,你沒有使用默認(rèn)實例名稱,那么它的值可能類似"sp2010\express"這樣的格式)。對每個內(nèi)容數(shù)據(jù)庫,都只應(yīng)該使用msiexec.exe執(zhí)行一次這條指令。?
??

在你敲入了上面這行很長的指令并敲下回車之后,命令提示符窗口看起來會立即執(zhí)行完成,但實際上,后臺會繼續(xù)執(zhí)行RBS Provider的安裝程序。你可以打開Windows任務(wù)管理器,應(yīng)該會看到有好幾個msiexec.exe進程在執(zhí)行中。過上一會兒,任務(wù)管理器中就不會再顯示有幾個msiexec.exe在運行(在我的環(huán)境中仍會剩下一個另外的msiexec.exe進程),這表明RBS Provider安裝過程已經(jīng)完成。?
?

在RBS Provider安裝過程中,它會將log信息寫入與"RBS_x64.msi"安裝文件同目錄的"rbs_install_log.exe"文件。從資源管理器中打開這個log文件,搜索其中是否有如下"Installation completed successfully"之類的信息,這些信息表示"RBS_x64.msi"的安裝是成功的。?
??

如果在你的SharePoint服務(wù)器場中,只有一臺SharePoint服務(wù)器,那么按照上面的描述,在它上面安裝完RBS FILESTRREAM Provider就完事了。但是如果服務(wù)器場中存在多臺SharePoint服務(wù)器,那么就需要繼續(xù)在其他的Web前端服務(wù)器和應(yīng)用服務(wù)器上,安裝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安裝到所有服務(wù)器上之后,打開SQL Server 2008 Management Studio,刷新內(nèi)容數(shù)據(jù)庫的Table列表,應(yīng)該會看到多出來許多名稱以"mssqlrbs"開頭的,與RBS有關(guān)的Table。如果在查詢窗口中執(zhí)行下面的SQL語句,也應(yīng)該能查詢出一些結(jié)果。?

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

如果在內(nèi)容數(shù)據(jù)庫中并沒有上面這些Table,運行上面的SQL語句也查詢不出任何結(jié)果,那么表明RBS Provider并沒有正確安裝到內(nèi)容數(shù)據(jù)庫上。如果真是這樣,在每臺服務(wù)器上,打開資源管理器,雙擊"RBS_x64.msi",然后在出現(xiàn)的安裝界面中,使用"卸載"選項先將RBS Provider卸載掉,然后再按照上面的步驟,重新在命令提示符窗口中嘗試安裝它。?

5、為內(nèi)容數(shù)據(jù)庫啟用RBS FILESTREAM Provider?

終于到了最后一個步驟。在SharePoint服務(wù)器上,打開SharePoint 2010 Management Shell,這是一個基于Windows Powershell的命令行管理工具。?
??

在SharePoint 2010 Management Shell中,依次執(zhí)行下面的指令:?

(1)?$cdb = Get-SPContentDatabase "WSS_Content"?
獲取到指定的內(nèi)容數(shù)據(jù)庫(SPContentDatabase)對象實例,綠色所標(biāo)注的"WSS_Content"需要更換成在你的環(huán)境中,實際的內(nèi)容數(shù)據(jù)庫名稱。?

(2)?$rbss = $cdb.RemoteBlobStorageSettings?
獲取內(nèi)容數(shù)據(jù)庫的RBS設(shè)置(SPRemoteBlobStorageSettings)對象實例。?

(3)?$rbss.Installed()?
檢查在內(nèi)容數(shù)據(jù)庫上是否安裝了RBS,如果需要,更新相應(yīng)的屬性值。?

(4)?$rbss.Enable()?
在內(nèi)容數(shù)據(jù)庫上啟用RBS。?

(5)?$pvdName = $rbss.GetProviderNames()[0]?
獲取第一個注冊到內(nèi)容數(shù)據(jù)庫上的RBS Provider的名稱。?

(6)?$rbss.SetActiveProviderName($pvdName)?
為內(nèi)容數(shù)據(jù)庫設(shè)置要激活的RBS Provider。?
??

然后,你可以執(zhí)行"$rbss"來查看它的一些屬性值,如果設(shè)置正確,它輸出的內(nèi)容應(yīng)該如上圖所示。?

如果你啟用RBS FILESTREAM Provider的內(nèi)容數(shù)據(jù)庫中,已經(jīng)存儲了一個網(wǎng)站集,那么在你啟用了RBS Provider之后,網(wǎng)站集里面的文檔,并不會自動的馬上通過FILESTREAM,轉(zhuǎn)存到NTFS文件系統(tǒng)上。只有新增的文檔才會被存儲到NTFS文件系統(tǒng)上,網(wǎng)站集里面之前上載的文檔,仍然會保存在內(nèi)容數(shù)據(jù)庫里面。如果你希望現(xiàn)在將那些舊的文檔,統(tǒng)統(tǒng)轉(zhuǎn)存到我們所指定的NTFS文件系統(tǒng)中,那么可以繼續(xù)在SharePoint 2010 Management Shell中執(zhí)行下面這個指令:?

(7)?$rbss.Migrate()?

如果你希望設(shè)置一個文檔大小閾值,只有大小超過此閾值的文檔,才通過RBS FILESTREAM Provider存儲到NTFS文件系統(tǒng)上,而小于此閾值的文檔,仍然存儲在內(nèi)容數(shù)據(jù)庫中,那么可以在SharePoint 2010 Management Shell中繼續(xù)執(zhí)行下面的指令(假設(shè)閾值是1048000字節(jié),也就是1M):?

(8)?$rbss.MinimumBlobStorageSize = 1048000?
(9)?$rbss.Update()?

上面的這些指令,都是針對一個內(nèi)容數(shù)據(jù)庫的。如果你有多個內(nèi)容數(shù)據(jù)庫要啟用RBS,那么就對每個內(nèi)容數(shù)據(jù)庫都執(zhí)行一遍上述指令。?

6、檢查最終效果?

在完成了上述所有操作步驟之后,在SharePoint網(wǎng)站中上載一些文檔,然后檢查你所設(shè)定的NTFS文件夾,里面應(yīng)該會包含有一些子文件夾,存儲著這些文檔。

?

WSS和MOSS的區(qū)別

Microsoft Office SharePoint Service 2007 是微軟最新的企業(yè)協(xié)作應(yīng)用和開發(fā)平臺。簡稱MOSS,MOSS基于Window SharePonit Service 3.0開發(fā),簡稱WSS。MOSS是收費的,WSS是免費的,只要擁有了Window Server2003的許可,就可以免費安裝WSS。

WSS擁有站點,列表,文檔庫,文檔管理,web part,集群部署,站點內(nèi)搜索,基于WF的工作流等功能。MOSS擴展實現(xiàn)了增強的文檔管理,企業(yè)搜索,擴展了工作流,引入了web內(nèi)容管理,Form Service , Excel Service,個人站點等。

?(以下章節(jié)若沒有特別強調(diào),則所有內(nèi)容都適合WSS和MOSS的。所有適合WSS的內(nèi)容也一定適合MOSS,反之則不然)

WSS對IIS的擴展

?? ? ? ? WSS基于標(biāo)準(zhǔn)的asp.net 2.0開發(fā) ,這是WSS開發(fā)中要始終記住的一點. 要精通WSS開發(fā),一定要精通asp.net。

?? ? ? ? 每次新建一個WSS站點,IIS中會同樣新建一個網(wǎng)站,我們稱這個網(wǎng)站是被WSS擴展后的網(wǎng)站。那么擴展后,發(fā)生了什么呢?

?? ? ? ? 首先,IIS站點的所有文件的處理都被影射為需要asp.net運行引擎處理,而標(biāo)準(zhǔn)的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的一個擴展機制,通過實現(xiàn)一個HttpHandler,可以來直接針對較低層的Request,Response編程,WSS通過實現(xiàn)自己的HttpHandler實現(xiàn)對客戶端所有請求文件的處理,并且,通過擴展Http請求(擴展OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY等動作),實現(xiàn)文檔的在線編輯,在線編輯的實現(xiàn)原理可參考這篇文章:http://www.cnblogs.com/jianyi0115/archive/2007/07/15/818566.html

?? ? ? ? 注意httpModules節(jié)點下的這項配置:

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

?? ? ? ? HttpModule也是asp.net的擴展機制,通過實現(xiàn)一個HttpModule,可以切入Http請求的某個階段做出相應(yīng)的處理,如身份校驗,初始化一些通用模塊等。

?? ? ? ? WSS通過實現(xiàn)SPRequestModule,切入Http請求,進行一些需要的處理。最重要的是,WSS通過SPRequestModule引入了SPVirtualPathProvider。SPRequestModule的OnInit方法中有這個關(guān)鍵的一句:

?? ?SPVirtualPathProvider provider2 = new SPVirtualPathProvider();

HostingEnvironment.RegisterVirtualPathProvider(provider2);

VirtualPathProvider也是asp.net的擴展機制,通過實現(xiàn)VirtualPathProvider可以控制asp.net頁面的提供機制,默認(rèn)的VirtualPathProvider的實現(xiàn)直接訪問服務(wù)器硬盤上的文件。WSS通過SPVirtualPathProvider實現(xiàn)了自己的頁面Provider機制—WSS站點的頁面是由文件系統(tǒng)和數(shù)據(jù)庫聯(lián)合存儲的。

新建一個WSS站點后,它的所有的文件都是放在硬盤上,我們通過SharePonit Designer打開一個WSS站點,可以看到完整的目錄結(jié)構(gòu),這些文件實際上全部都影射到文件系統(tǒng)上的某個文件,這個功能叫做ghost。當(dāng)我們通過SPD修改了某個文件之后,WSS會把這個修改的文件保存到數(shù)據(jù)庫,這個文件跟原始的文件系統(tǒng)上的文件就脫離關(guān)聯(lián)了,這叫做unghost.通過ghost,WSS做到了是不同的站點可以共享相同的文件,通過unghost,WSS又實現(xiàn)了一個站點對頁面的修改不會影響到其他站點.

WSS的一些概念

1) ? ? ? Farm -- 服務(wù)器場

?? ? 服務(wù)器場是WSS最大的一個概念,整個WSS的所有服務(wù)器,包括前端服務(wù)器,數(shù)據(jù)服務(wù)器,組成了服務(wù)器場,一個服務(wù)器場有一個配置數(shù)據(jù)庫,多個內(nèi)容數(shù)據(jù)庫,多個應(yīng)用程序..

2) ? ? ? Application -- 應(yīng)用程序

應(yīng)用程序?qū)?yīng)IIS的一個站點,它是一個安全和程序文件的獨立主體。即一個應(yīng)用程序可以有自己的用戶身份認(rèn)證機制,有自己獨立的一套運行程序文件,一個應(yīng)用程序會映射到硬盤上的一個獨立的目錄,一般為C:"Inetpub"wwwroot"wss"VirtualDirectories"里面的某個目錄.一個應(yīng)用程序下可以有多個站點集.

3) ? ? ? Site Collection -- 站點集

?? ? 站點集是一個虛擬的單元,在內(nèi)容,用戶和權(quán)限上是獨立的. 一個站點集可以有多個子站點.

4) ? ? ? Web -- 站點

?? ? 站點內(nèi)容和權(quán)限的組織單元.一個站點可以有多個子站點,多個列表,文檔庫,多個頁面.站點可以有獨立的權(quán)限.站點可以有子站點,站點和子站點組成樹型關(guān)系.子站點的權(quán)限默認(rèn)集成于父站點.

5) ? ? ? List-列表和文檔庫

?? ? 列表可以理解成一個數(shù)據(jù)庫表,用來存儲一些業(yè)務(wù)數(shù)據(jù)。一個列表有很多字段。

?? ? ?WSS3.0的列表可以存放多個內(nèi)容類型。

6) ? ? ? ConentType--內(nèi)容類型

?? ? ? ?內(nèi)容類型可以理解成數(shù)據(jù)實體,如用戶,聯(lián)系人,日程數(shù)據(jù)等。一個內(nèi)容類型包含很多字段。

7) ? ? ? Field-字段

?? ? 可以理解成數(shù)據(jù)庫的字段,Field是WSS整個架構(gòu)的最底層元素。

WSS的對象模型 ? ? ??

?? ? ? ? WSS開發(fā)很大一部分工作是需要調(diào)用各種WSS中的對象來實現(xiàn)的.常用的對象都放在Microsoft.SharePont這個dll中.我們通常的開發(fā)都要從站點集對象開始.

Using(SPSite site = new SPSite(“http://site-name/”))

{

} ? ? ? ? ? ? ? ?

?? ? ? ? SPSite和SPWeb對象都是需要釋放資源的,如果我們自己構(gòu)造這兩個對象,一定要在代碼執(zhí)行完畢時調(diào)用Dispose方法,來釋放資源.

?? ? ? ? 如果我們的代碼處于WSS的運行環(huán)境之下,即代碼直接運行在WSS的頁面上,那么我們可以直接從WSS的上下文中獲取到相關(guān)對象.

SPSIte site = SPContext.Current.Site;

SPWeb web = SPContext.Current.Web; ?

SPUser user = SPContext.Current.Web.CurrentUser; ? ?

?? ? ? ?上下文對象提供了更好的性能(不需要重復(fù)創(chuàng)建對象),并且直接跟當(dāng)前用戶的身份掛鉤.上下文對象由運行環(huán)境進行資源管理,不需要我們用代碼來Dispose.

MOSS2007構(gòu)建與WSS V3之上,并在其之上加了很多的企業(yè)級應(yīng)用,其關(guān)系如下圖所示:

原文摘自: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數(shù)據(jù)庫總結(jié)

/*

/*

數(shù)據(jù)庫總結(jié):

--查詢,是操作中的重點及精華部分,由于業(yè)務(wù)的多樣性,導(dǎo)致查詢方案的多樣性,但是已有的關(guān)系必須通過各種手段在查詢中予以表達(dá)

--常見查詢手段

/*

1.普通查詢

??? select 結(jié)果集列表表達(dá)式

??? from 值域范圍

??? where 結(jié)果集篩選表達(dá)式

??? group by 統(tǒng)計結(jié)果集分組條件表達(dá)式

??? order by 結(jié)果集排序條件表達(dá)式

2.子查詢(在查詢內(nèi)部嵌套其它輔助查詢的定義,例如:其它查詢作為計算列、值域、條件等)

3.聯(lián)合查詢(表聯(lián)接join table)

??? inner join內(nèi)聯(lián)接----重點,后續(xù)的外聯(lián)接只在特殊數(shù)據(jù)情況下使用

??? left outer join左外聯(lián)接

??? right outer join右外聯(lián)接

??? full outer join全外聯(lián)接

4.SQL編程查詢,通過編寫具有執(zhí)行邏輯的多行代碼來獲取希望得到的查詢結(jié)果或操作結(jié)果

??? 4.1---View視圖

??? 4.2---UDF(User Defined Function)用戶定義函數(shù)

??? 4.3---SP(Stored Procedure)存儲過程

??? 4.4---Trigger觸發(fā)器

??? 4.5---Cursor游標(biāo)

??? 4.6---Transaction事務(wù)

*/

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

常見的基本語句:

select 字段 from 表名 where 條件

insert into 表名(字段) values(內(nèi)容)

update 表名? set 字段=新內(nèi)容 where 條件

drop from 表名

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

--我們通常通過主鍵來刪除內(nèi)容

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

對表格進行處理:

1.創(chuàng)建表格

create table 表名

create table ProdutPriceAndStock--表與表之間的1對1關(guān)系

(

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

??? --產(chǎn)品標(biāo)示號,既當(dāng)主鍵有當(dāng)外鍵體現(xiàn)了一對一的關(guān)系

??? price money not null,

??? productcount? int not null--產(chǎn)品當(dāng)前庫存數(shù)量

?

)

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 列名

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

程序段編程

--程序三要素:定義數(shù)據(jù)容器、賦值、使用

begin--程序段的開始

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

--declare @局部變量名稱 數(shù)據(jù)類型

--特殊定義 --表數(shù)據(jù)類型

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'--同時對多個數(shù)據(jù)容器賦值,往往針對表中不同字段來賦值

--針對表類型的變量,必須使用操作表數(shù)據(jù)的語句來賦值

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

--在服務(wù)器端的控制臺中輸出,笑話ijiyunxing是無人可以看到作為重要的調(diào)試手段

?

?

?

--通過簡單程序來完成運算及簡單的業(yè)務(wù)邏輯

--大兔3元每只,小兔一元三只,百元買白兔

begin

declare @bigcount int,@smallcount int

declare @infotable table

?????? (

?????? ?? 大兔數(shù)量 int,

?????? ?? 小兔數(shù)量 int

?????? )

set @bigcount=1

set @smallcount=100-@bigcount

while(@bigcount<=100)

??? begin

?????? if((@bigcount*3+@smallcount/3)=100)

?????????? begin

????????????? print '祝賀你找到答案了'

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

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

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

????????????? break--跳出循環(huán)

?????????? end

?????? else

?????????? begin

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

?????????? end

?????? set @bigcount=@bigcount+1

?????? set @smallcount=100-@bigcount

??? end

?

select * from @infotable

end

go

?

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

建立視圖

目的:創(chuàng)建視圖其主要目的是為了查詢使用

create view? 視圖名

as

select .........

單表視圖

多表視圖---主要考查表的鏈接

??? inner join內(nèi)聯(lián)接----重點,后續(xù)的外聯(lián)接只在特殊數(shù)據(jù)情況下使用

??? left outer join左外聯(lián)接

??? right outer join右外聯(lián)接

??? full outer join全外聯(lián)接

?

--交叉聯(lián)接

select * from Category as c cross join Product as p

go

--內(nèi)連接inner join----on,尋找有效地數(shù)據(jù)對應(yīng)項

select * from Category as c, Product as p

where c.categoryid=p.p_c_id

go

--

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

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全外聯(lián)接

--left outer左

--right outer右

?join Product as p

?on c.categoryid=p.p_c_id

go

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

?

--UDF user defined function 用戶自定義函數(shù)

--UDF--標(biāo)量函數(shù),內(nèi)嵌表值函數(shù),多語句標(biāo)志函數(shù)

--可以接受參數(shù),完成各種常見的查詢?nèi)蝿?wù),根據(jù)任務(wù)結(jié)果的不同性質(zhì)來合理選用不同的函數(shù)方式

--標(biāo)量函數(shù):查詢結(jié)果為獨立的標(biāo)量值,例如:數(shù)字。文字

--我們希望了解任何一個商品分類的目前產(chǎn)品數(shù)量

--可變量:產(chǎn)品分類名稱

--查詢目標(biāo):產(chǎn)品數(shù)量---int--標(biāo)量------------------FN

create function QueryProductCountByCategory---函數(shù)名

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

returns int-----返回值

with encryption---加密

as

begin

??? declare @count int --返回變量值

??? declare @categoryid nvarchar(15)

??? set @categoryid=(select categoryid from Category where categoryname=@categoryname)

??? if(@categoryid is null)????

?????? begin

?????? set @count=-1--利用無效的返回值來表示參數(shù)有誤

?????? end

??? else

?????? begin

?????? set @count=(select count(productid)from Product where p_c_id=@categoryid)

--得到大于等于0的有效結(jié)果值

?????? end

??? return @count

end

go

?

-如果我們查詢的目標(biāo)是一個可以直接得到的結(jié)果集表格

--內(nèi)嵌表值函數(shù)------------------------------------IN

?

--我們希望了解任何一個產(chǎn)品分類的所有產(chǎn)品信息,何解

create function QueryProductInfoByCategory---函數(shù)名

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

returns table

with encryption

as

return

(select * from ProductInfoView where 分類名=@categoryname)

go

--如果我們發(fā)現(xiàn)有時候要得到的結(jié)果不方便進行直接查詢得到,我們可以將查詢過程分散,

使用多于具有標(biāo)志函數(shù)來完成全過程

--使用多語句表值函數(shù)------------------------------TF

--Multistatement Table_valued Functions

--我們想要知道目前的有效用戶數(shù)量,何解

create function QueryAccountInfoByEnable()

returns @infotable table

(數(shù)量分類 nvarchar(20),本類數(shù)量 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(數(shù)量分類,本類數(shù)量)

??? values('有效用戶',@enablecount)

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

??? values('無效用戶',@disablecount)

??? return

end

go

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

?

--創(chuàng)建存儲過程,接受參數(shù),完成合理的執(zhí)行過程,執(zhí)行過程默認(rèn)可以不提供返回值,默認(rèn)等效于void方法

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

?

create procedure RegAccountInfo

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

with encryption

as

begin

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

end

go

execute SP名 (形參)

go

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

--觸發(fā)器:一種特殊的存儲過程,滿足某些對數(shù)據(jù)的發(fā)生變化的操作條件時會自動執(zhí)行,

--觸發(fā)器的設(shè)計者需要編寫合理的完整代碼以表示自動執(zhí)行的邏輯達(dá)到維護數(shù)據(jù)完整性的要求

1.觸發(fā)器是綁定在一個表中的

2.觸發(fā)器的執(zhí)行條件為:所綁定的表中數(shù)據(jù)發(fā)生了變化,而不是查詢

3.常見的觸發(fā)器的執(zhí)行時機為:改變的代碼在緩存中產(chǎn)生執(zhí)行效果之后觸發(fā)

4.觸發(fā)過程中有兩個內(nèi)部輔助表:inserted與deleted,分別表示本次操作將會加入的新數(shù)據(jù)及操作中

可能被刪除的就數(shù)據(jù),任何一次update操作都會同時導(dǎo)致inserted,delected發(fā)生改變,著兩個表格

的格式與本表完全一致

create trigger AddSaleScoreTrigger

on SaleLog --on后面要寫的是綁定表,綁定表的變化導(dǎo)致觸發(fā)的執(zhí)行

for insert --描述觸發(fā)的前提

as

begin

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

declare @oldscore money,@newscore money

select @buycount=salecount,

?????? @buyprice=saleprice,

?????? @buyaccount=accountid

from inserted --從最新變化的內(nèi)部數(shù)據(jù)表中獲取關(guān)鍵數(shù)據(jù)

set @oldscore=(select buyscore from AccountInfo where accountid=@buyaccount)

set @newscore=@oldscore+@buycount*@buyprice

update AccountInfo set buyscore=@newscore

where accountid=@buyaccount

end

go

?

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

/*

游標(biāo):針對指定的數(shù)據(jù)范圍,可以進行分行的依次操作,操作次數(shù)取決于范圍的容量

fetch--取得某行的操作權(quán)

fetch next--取得下一行的操作權(quán)

fetch_status--取得操作權(quán)的結(jié)果之狀態(tài)返回值,0表示成功,非0表示失敗,

例如達(dá)到了數(shù)據(jù)范圍的結(jié)尾等均會導(dǎo)致失敗

事務(wù):一系列操作的集合,具有整體全部成功或全部失敗的特點。必須同時具備ACID四大基本屬性

A原子性(Atomicity)本系列操作的目標(biāo)是完成獨立的任務(wù),所有操作內(nèi)容為了本任務(wù),不可以分割--復(fù)制文件中途取消

C一致性(Consistentency)在操作目標(biāo)中,而偶們得到的結(jié)果與操作描述的結(jié)果必須保持一致,數(shù)據(jù)處理過程中不得有丟失或扭曲

I隔離性(Isolation)在多線程環(huán)境中,事務(wù)執(zhí)行過程與其他事務(wù)執(zhí)行過程相互分離的

D持久性(Durability)事務(wù)操作完畢之后,如果提交成功,則其產(chǎn)生的影響必須持久保持

?

隱形事務(wù):常見的所有SQL語句均會導(dǎo)致自動生成隱形事務(wù),以保證某一條語句的執(zhí)行效果完整性。例如:insert into''''

顯示事務(wù):通過明確的關(guān)鍵語句代碼,指定事務(wù)執(zhí)行范圍,在范圍之內(nèi)的一列寫執(zhí)行代碼受到自定義事務(wù)的控制,

可以明確的對本事務(wù)的執(zhí)行開始、保存、回滾、提交、驗證等操作

begin transaction--啟動事務(wù),顯示事務(wù)開始控制

rollback transaction--回滾事務(wù),整個事務(wù)會抹除

commit transation --提交事務(wù),確認(rèn)本事務(wù)有效,并嘗試保證其持久性

@@error--針對事務(wù)過程中的任何一條執(zhí)行,監(jiān)測器執(zhí)行過程是否有誤

?

*/

use MyDB

GO

?

--假設(shè)有兩個由于歷史原因造成的用戶數(shù)據(jù)表需要歸并,

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

?

/*

在存儲過程或觸發(fā)器中使用 Transact-SQL 游標(biāo)的典型過程為:

?

聲明 Transact-SQL 變量包含游標(biāo)返回的數(shù)據(jù)。為每個結(jié)果集列聲明一個變量。聲明足夠大的變量來保存列返回的值,并聲明變量的類型為可從列數(shù)據(jù)類型隱式轉(zhuǎn)換得到的數(shù)據(jù)類型。

?

?

使用 DECLARE CURSOR 語句將 Transact-SQL 游標(biāo)與 SELECT 語句相關(guān)聯(lián)。另外,DECLARE CURSOR 語句還定義游標(biāo)的特性,例如游標(biāo)名稱以及游標(biāo)是只讀還是只進。

?

?

使用 OPEN 語句執(zhí)行 SELECT 語句并填充游標(biāo)。

?

?

使用 FETCH INTO 語句提取單個行,并將每列中的數(shù)據(jù)移至指定的變量中。然后,其他 Transact-SQL 語句可以引用那些變量來訪問提取的數(shù)據(jù)值。Transact-SQL 游標(biāo)不支持提取行塊。

?

?

使用 CLOSE 語句結(jié)束游標(biāo)的使用。關(guān)閉游標(biāo)可以釋放某些資源,例如游標(biāo)結(jié)果集及其對當(dāng)前行的鎖定,但如果重新發(fā)出一個 OPEN 語句,則該游標(biāo)結(jié)構(gòu)仍可用于處理。由于游標(biāo)仍然存在,此時還不能重新使用該游標(biāo)的名稱。DEALLOCATE 語句則完全釋放分配給游標(biāo)的資源,包括游標(biāo)名稱。釋放游標(biāo)后,必須使用 DECLARE 語句來重新生成游標(biāo)。

*/

?

--假設(shè)操作目標(biāo):userinfotwo->userinfoone

--使用游標(biāo)分行處理

begin

--聲明游標(biāo)

declare MoveUserInfoTwo cursor

for

select userid,userpwd from UserInfoTwo

--打開游標(biāo),準(zhǔn)備開始讀取操作

open MoveUserInfoTwo

--執(zhí)行讀取

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

--完成游標(biāo)操作,關(guān)閉游標(biāo)

close MoveUserInfoTwo

--釋放游標(biāo)

deallocate MoveUserInfoTwo

end

go

?

--游標(biāo)結(jié)合事務(wù)操作

begin transaction MoveUserInfoTrans

begin

declare @errorcount int

set @errorcount=0

--聲明游標(biāo)

declare MoveUserInfoTwo cursor

for

select userid, userpwd from UserInfoTwo

--打開游標(biāo)

open MoveUserInfoTwo

--執(zhí)行讀取

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 @errorcount=@errorcount+1

break

end

fetch next from MoveUserInfoTwo into @userid,@userpwd

end

--完成游標(biāo)操作關(guān)閉游標(biāo)

close MoveUserInfoTwo

--釋放游標(biāo)

deallocate MoveUserInfoTwo

--驗證本次事務(wù)的操作過程

if(@errorcount=0)

??? begin

??? commit transaction MoveUserInfoTrans

??? print'事務(wù)提交成功'

??? end

else

??? begin

??? rollback transaction MoveUserInfoTrans

??? print'執(zhí)行過程有誤,事務(wù)已回滾'

??? end

end

go

總結(jié)

以上是生活随笔為你收集整理的MOSS/Sharepoint RBS概念以及运用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。