MOSS/Sharepoint RBS概念以及运用
注:原文作者不知道是誰,先收藏了這篇(若有侵權,請留言,刪除)
EBS -> External Blob Storage 外部大二進制對象存儲
RBS -> Remote Blob Storage 遠程大二進制對象存儲
這倆概念據我所知,SharePoint領域應用比較廣泛,如果你對SharePoint存儲結構比較熟悉的話,應該比較好理解,簡單的說SharePoint算是一種Web應用程序,我們能夠通過網頁,上傳或者管理數據,比如文檔,照片,視頻,音頻等,這些文件的實際載體是數據庫,一般就是微軟的SQL Server,在數據庫表中,這些文件以二進制對象(文件流一樣的東西)存儲在某一個字段中。隨著數據量增大,數據庫體積會越來越龐大,最后影響數據庫的性能和運營成本,所以人們開始試圖將數據庫中的文件流取出來存儲到文件系統(例如本地磁盤)上,在SharePoint 2007的時候,EBS誕生了,SharePoint提供了類似于一個接口供開發人員實現,可以讓SharePoint能夠識別存儲到其他位置的數據(非SQL Server)。到了SharePoint?2010的時代,數據庫版本已經更新了很多,貌似是從SQL Server 08 SP2版本開始的,具體版本記不清了,數據庫本身支持了一種文件的外部存儲技術,本質上RBS是SQL Server 2008的API,并且使用了SQL Server 2008中的新的FILESTREAM功能。相當于數據庫的接口。所以區別也就比較明顯了。可能說的不太對,大體上是這么個意思。
MOSS -》RBS? API?-》FileStream (API FileStream均由sql server 實現??)
如果使用SharePoint 2007作為文檔管理平臺,它很讓人詬病的一點就是,SharePoint 2007是將文件本身直接存儲在SQL Server數據庫(WSS_CONTENT.alldoc/doctostream.docstream)之中。雖然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數據庫里面就對了。?
??
在你對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實例,選擇"屬性"菜單項。?
??
在打開的屬性窗口中,選擇"FILESTREAM"選項卡,然后選中啟用FILESTREAM的選擇框,點擊"確定"按鈕。?
??
打開SQL Server Management Studio,選中左側的SQL Server實例,然后點擊工具欄區域的"新建查詢",打開一個查詢界面,然后在里面輸入下面的SQL語句并執行。?
EXEC sp_configure filestream_access_level, 2?
RECONFIGURE?
?
2、確定要應用RBS FILESTREAM Provider的內容數據庫?
由于RBS是基于數據庫為單元來啟用的,所以你可以選擇在哪些SharePoint內容數據庫上啟用RBS。這意味著,對于SharePoint服務器場里面那些存儲文件數量并不多的內容數據庫,可能并沒有必要為它啟用RBS,而那些可能會存儲大量文件的內容數據庫,則可以啟用RBS,有效的優化它們。?
SharePoint 2010系統中,內容數據庫與網站的關系是:?
● 一個Web應用程序可以使用一個或多個內容數據庫;?
● 在新建Web應用程序時,會為其自動創建一個內容數據庫,管理員可以稍后為此Web應用程序創建更多的內容數據庫;?
● 在Web應用程序中創建一個網站集時,這個網站集會被存儲到Web應用程序的某個內容數據庫中;?
● 一個網站集(包括其所包含的首要網站和所有子網站),只能被存儲在一個內容數據庫中,而不能被分拆存儲到多個內容數據庫中。?
管理員可以打開SharePoint 2010管理中心的內容數據庫管理界面,查看每個Web應用程序所使用的內容數據庫,或是為某個Web應用程序添加新的內容數據庫。?
?
在下面的示范操作中,我們就為上圖中所示的這個名為"WSS_Content"的內容數據庫,啟用RBS。?
3、配置內容數據庫?
在確定了要啟用RBS的內容數據庫之后,打開SQL Server 2008 Management Studio,找到這個內容數據庫,用鼠標右鍵點擊并選擇"新建查詢"菜單項。?
??
在打開的查詢窗口中,輸入下面這些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指令會自動幫你將這個文件夾創建出來。?
??
上述SQL語句執行完畢之后,可以打開資源管理器,確認在SQL Server服務器上,相應的文件夾已經創建成功。?
4、安裝RBS FILESTREAM Provider?
將下載到的RBS_x64.msi文件復制到SharePoint服務器場中的每一臺服務器上,所有的SQL Server數據庫服務器和SharePoint服務器上都必須安裝此RBS Provider。?
先在SQL Server數據庫上和SharePoint服務器上(如果服務器場中有多臺SharePoint服務器,則在一臺Web前端服務器上),安裝RBS FILESTREAM Provider,安裝步驟如下。?
以管理員身份運行命令提示符。?
??
在命令提示符窗口中,使用"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執行一次這條指令。?
??
在你敲入了上面這行很長的指令并敲下回車之后,命令提示符窗口看起來會立即執行完成,但實際上,后臺會繼續執行RBS Provider的安裝程序。你可以打開Windows任務管理器,應該會看到有好幾個msiexec.exe進程在執行中。過上一會兒,任務管理器中就不會再顯示有幾個msiexec.exe在運行(在我的環境中仍會剩下一個另外的msiexec.exe進程),這表明RBS Provider安裝過程已經完成。?
?
在RBS Provider安裝過程中,它會將log信息寫入與"RBS_x64.msi"安裝文件同目錄的"rbs_install_log.exe"文件。從資源管理器中打開這個log文件,搜索其中是否有如下"Installation completed successfully"之類的信息,這些信息表示"RBS_x64.msi"的安裝是成功的。?
??
如果在你的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%'?
??
如果在內容數據庫中并沒有上面這些Table,運行上面的SQL語句也查詢不出任何結果,那么表明RBS Provider并沒有正確安裝到內容數據庫上。如果真是這樣,在每臺服務器上,打開資源管理器,雙擊"RBS_x64.msi",然后在出現的安裝界面中,使用"卸載"選項先將RBS Provider卸載掉,然后再按照上面的步驟,重新在命令提示符窗口中嘗試安裝它。?
5、為內容數據庫啟用RBS FILESTREAM Provider?
終于到了最后一個步驟。在SharePoint服務器上,打開SharePoint 2010 Management Shell,這是一個基于Windows Powershell的命令行管理工具。?
??
在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。?
??
然后,你可以執行"$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文件夾,里面應該會包含有一些子文件夾,存儲著這些文檔。
?
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 SPSite(“http://site-name/”))
{
…
} ? ? ? ? ? ? ? ?
?? ? ? ? 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之上,并在其之上加了很多的企業級應用,其關系如下圖所示:
原文摘自: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數據庫總結
/*
/*
數據庫總結:
--查詢,是操作中的重點及精華部分,由于業務的多樣性,導致查詢方案的多樣性,但是已有的關系必須通過各種手段在查詢中予以表達
--常見查詢手段
/*
1.普通查詢
??? select 結果集列表表達式
??? from 值域范圍
??? where 結果集篩選表達式
??? group by 統計結果集分組條件表達式
??? order by 結果集排序條件表達式
2.子查詢(在查詢內部嵌套其它輔助查詢的定義,例如:其它查詢作為計算列、值域、條件等)
3.聯合查詢(表聯接join table)
??? inner join內聯接----重點,后續的外聯接只在特殊數據情況下使用
??? left outer join左外聯接
??? right outer join右外聯接
??? full outer join全外聯接
4.SQL編程查詢,通過編寫具有執行邏輯的多行代碼來獲取希望得到的查詢結果或操作結果
??? 4.1---View視圖
??? 4.2---UDF(User Defined Function)用戶定義函數
??? 4.3---SP(Stored Procedure)存儲過程
??? 4.4---Trigger觸發器
??? 4.5---Cursor游標
??? 4.6---Transaction事務
*/
---------------------------------------------------------------------
常見的基本語句:
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 @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(大兔數量,小兔數量) values(@bigcount,@smallcount)
????????????? break--跳出循環
?????????? end
?????? else
?????????? begin
????????????? print 'bigcount='+Convert(nvarchar(20),@bigcount)+',非答案'
?????????? end
?????? set @bigcount=@bigcount+1
?????? set @smallcount=100-@bigcount
??? 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 categoryname=@categoryname)
??? if(@categoryid is null)????
?????? begin
?????? set @count=-1--利用無效的返回值來表示參數有誤
?????? end
??? else
?????? begin
?????? set @count=(select count(productid)from Product where p_c_id=@categoryid)
--得到大于等于0的有效結果值
?????? end
??? return @count
end
go
?
-如果我們查詢的目標是一個可以直接得到的結果集表格
--內嵌表值函數------------------------------------IN
?
--我們希望了解任何一個產品分類的所有產品信息,何解
create function QueryProductInfoByCategory---函數名
(@categoryname nvarchar(10))---形參字段
returns table
with encryption
as
return
(select * from ProductInfoView where 分類名=@categoryname)
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 accountid=@buyaccount)
set @newscore=@oldscore+@buycount*@buyprice
update AccountInfo set buyscore=@newscore
where accountid=@buyaccount
end
go
?
---------------------------------------------------------------------------------------
/*
游標:針對指定的數據范圍,可以進行分行的依次操作,操作次數取決于范圍的容量
fetch--取得某行的操作權
fetch next--取得下一行的操作權
fetch_status--取得操作權的結果之狀態返回值,0表示成功,非0表示失敗,
例如達到了數據范圍的結尾等均會導致失敗
事務:一系列操作的集合,具有整體全部成功或全部失敗的特點。必須同時具備ACID四大基本屬性
A原子性(Atomicity)本系列操作的目標是完成獨立的任務,所有操作內容為了本任務,不可以分割--復制文件中途取消
C一致性(Consistentency)在操作目標中,而偶們得到的結果與操作描述的結果必須保持一致,數據處理過程中不得有丟失或扭曲
I隔離性(Isolation)在多線程環境中,事務執行過程與其他事務執行過程相互分離的
D持久性(Durability)事務操作完畢之后,如果提交成功,則其產生的影響必須持久保持
?
隱形事務:常見的所有SQL語句均會導致自動生成隱形事務,以保證某一條語句的執行效果完整性。例如:insert into''''
顯示事務:通過明確的關鍵語句代碼,指定事務執行范圍,在范圍之內的一列寫執行代碼受到自定義事務的控制,
可以明確的對本事務的執行開始、保存、回滾、提交、驗證等操作
begin transaction--啟動事務,顯示事務開始控制
rollback transaction--回滾事務,整個事務會抹除
commit transation --提交事務,確認本事務有效,并嘗試保證其持久性
@@error--針對事務過程中的任何一條執行,監測器執行過程是否有誤
?
*/
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
?
/*
在存儲過程或觸發器中使用 Transact-SQL 游標的典型過程為:
?
聲明 Transact-SQL 變量包含游標返回的數據。為每個結果集列聲明一個變量。聲明足夠大的變量來保存列返回的值,并聲明變量的類型為可從列數據類型隱式轉換得到的數據類型。
?
?
使用 DECLARE CURSOR 語句將 Transact-SQL 游標與 SELECT 語句相關聯。另外,DECLARE CURSOR 語句還定義游標的特性,例如游標名稱以及游標是只讀還是只進。
?
?
使用 OPEN 語句執行 SELECT 語句并填充游標。
?
?
使用 FETCH INTO 語句提取單個行,并將每列中的數據移至指定的變量中。然后,其他 Transact-SQL 語句可以引用那些變量來訪問提取的數據值。Transact-SQL 游標不支持提取行塊。
?
?
使用 CLOSE 語句結束游標的使用。關閉游標可以釋放某些資源,例如游標結果集及其對當前行的鎖定,但如果重新發出一個 OPEN 語句,則該游標結構仍可用于處理。由于游標仍然存在,此時還不能重新使用該游標的名稱。DEALLOCATE 語句則完全釋放分配給游標的資源,包括游標名稱。釋放游標后,必須使用 DECLARE 語句來重新生成游標。
*/
?
--假設操作目標: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 @errorcount=@errorcount+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
總結
以上是生活随笔為你收集整理的MOSS/Sharepoint RBS概念以及运用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 该怎么选轻薄本看这篇就够了!2022年上
- 下一篇: c语言删除文件remove_Python