qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          SQL Server數(shù)據(jù)庫程序設(shè)計(jì)知識(shí)總結(jié)

            SQL Server是由Microsoft開發(fā)和推廣的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同開發(fā)的,并于1988年推出了第一個(gè)OS/2版本。它只是眾多關(guān)系數(shù)據(jù)庫管理系統(tǒng)的一種,其它的關(guān)系數(shù)據(jù)庫管理系統(tǒng)還有Server,Oracle,DB/2,Sybase,Informix;關(guān)系數(shù)據(jù)庫:Access,F(xiàn)oxPro,Dbase等。如今,數(shù)據(jù)庫已經(jīng)變成學(xué)習(xí)軟件開發(fā)的核心課程之一,幾乎絕大部分軟件都涉及到數(shù)據(jù)庫,很多數(shù)據(jù)必須存在數(shù)據(jù)庫中。所以為了更好的掌握和操作數(shù)據(jù)庫,對(duì)數(shù)據(jù)庫知識(shí)的封裝就顯得尤為重要。

            ● 關(guān)系和非關(guān)系數(shù)據(jù)庫

             關(guān)系數(shù)據(jù)庫是創(chuàng)建在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,由一個(gè)或多個(gè)二維關(guān)系數(shù)據(jù)表組成,通過建立表之間的關(guān)系來定義數(shù)據(jù)庫的結(jié)構(gòu)。在關(guān)系數(shù)據(jù)庫中最重要的是數(shù)據(jù) 表,數(shù)據(jù)表把相關(guān)聯(lián)的數(shù)據(jù)按行和列排列到一起來描述一個(gè)實(shí)物。一個(gè)二維表稱為一個(gè)關(guān)系,每一個(gè)關(guān)系又可以包含多個(gè)屬性。

            和關(guān)系型數(shù)據(jù)庫相比,非關(guān)系型數(shù)據(jù)庫特別適合以SNS為代表web 2.0應(yīng)用,這些應(yīng)用需要極高速的并發(fā)讀寫操作,而對(duì)數(shù)值一致性要求卻不甚高。關(guān)系數(shù)據(jù)庫為了維護(hù)事務(wù)的一致性付出了重大代價(jià)導(dǎo)致了其讀寫能力下降,隨著 現(xiàn)在網(wǎng)絡(luò)SNS的應(yīng)用對(duì)并發(fā)讀寫能力要求極高,關(guān)系型數(shù)據(jù)庫已經(jīng)無法應(yīng)付,因此,必須用新的一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)來來代替關(guān)系數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫的另一個(gè)特 點(diǎn)就是其具有固定的表結(jié)構(gòu),因此,其擴(kuò)展性極差,而在SNS中,系統(tǒng)的升級(jí),功能的增加,往往意味著數(shù)據(jù)結(jié)構(gòu)巨大改動(dòng),這一點(diǎn)關(guān)系型數(shù)據(jù)庫也難以應(yīng)付,需 要新的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。于是,非關(guān)系數(shù)據(jù)庫(NoSQL)應(yīng)運(yùn)而生。非關(guān)系數(shù)據(jù)庫通常沒有固定的表結(jié)構(gòu),嚴(yán)格上說不是一種數(shù)據(jù)庫,應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存 儲(chǔ)方法的集合。

            ● SQL Server數(shù)據(jù)庫基礎(chǔ)

            首先我們從圖中看他們之間的聯(lián)系。

            一、T-SQL和SQL的比較

            SQL全稱為Structured Query Language,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,它主要包括三種語言:  數(shù)據(jù)定義語言、數(shù)據(jù)操縱語言、數(shù)據(jù)控制語言。T-SQL是SQL語言的增強(qiáng)版。

             也就是說,SQL三種語言適用于所有關(guān)系型數(shù)據(jù)庫,但是它本身具有局限性,因?yàn)樗惶峁┝藢?duì)數(shù)據(jù)庫數(shù)據(jù)基本的增刪改查等命令,在開發(fā)擁有復(fù)雜結(jié)構(gòu)的數(shù)據(jù) 庫程序時(shí),只有SQL語言是遠(yuǎn)遠(yuǎn)不夠的,于是各大公司在SQL基礎(chǔ)上對(duì)它進(jìn)行了增強(qiáng)。T-SQL是MS和Sybase在 SQL的DDL和 DML基礎(chǔ)上,增加了延伸的函數(shù)、系統(tǒng)預(yù)存程序以及程式設(shè)計(jì)結(jié)構(gòu)(例如 IF和 WHILE)讓程式設(shè)計(jì)更有彈性。和T-SQL類似的增強(qiáng)版的SQL語言還有Oracle對(duì)SQL的擴(kuò)展PL/SQL。

            二、數(shù)據(jù)庫對(duì)象

            數(shù)據(jù)庫對(duì)象定義了數(shù)據(jù)庫內(nèi)容的結(jié)構(gòu)。它們包含在數(shù)據(jù)庫項(xiàng)目中,數(shù)據(jù)庫項(xiàng)目還可以包含數(shù)據(jù)生成計(jì)劃和腳本。 在學(xué)習(xí)SQL Server時(shí),最快的方法是先學(xué)習(xí)數(shù)據(jù)庫對(duì)象。在研究了它們之間的異同點(diǎn)后,我把數(shù)據(jù)庫對(duì)象分為三類。





           這三類數(shù)據(jù)庫對(duì)象在功能上可能有重疊。

            1、基于表的對(duì)象

            表,數(shù)據(jù)保存在表中。

            基于表的對(duì)象我把它分為三類:

            視圖,用來篩選出用戶想要的信息,它是虛擬表,只封裝語句,一定程度上保證表中數(shù)據(jù)的安全;

            索引,對(duì)數(shù)據(jù)庫表中一個(gè)或多個(gè)列的值進(jìn)行排序的結(jié)構(gòu),提供指針以指向存儲(chǔ)在表中指定列的數(shù)據(jù)值,然后根據(jù)指定的排序次序排列這些指針。數(shù)據(jù)庫使用索引的方式與使用書的目錄很相似;

            約束、默認(rèn)值、規(guī)則、觸發(fā)器確保了數(shù)據(jù)完整性。

            2、數(shù)據(jù)庫安全性:用戶、角色、權(quán)限與數(shù)據(jù)庫安全性中的登陸聯(lián)合應(yīng)用可以限制登陸者可進(jìn)行的操作來保證數(shù)據(jù)庫的安全性。

            3、塊:存儲(chǔ)過程和函數(shù)有點(diǎn)相似,但是存儲(chǔ)過程可以返回Recordset;觸發(fā)器是一種特殊的存儲(chǔ)過程。

            三、DTS數(shù)據(jù)轉(zhuǎn)換服務(wù)

            DTS的主要作用:1、導(dǎo)入與導(dǎo)出數(shù)據(jù)

            2、轉(zhuǎn)換數(shù)據(jù)(檢驗(yàn)、凈化、重整數(shù)據(jù))

            3、轉(zhuǎn)換數(shù)據(jù)庫對(duì)象

            四、管理和維護(hù)

            在這部分中主要是對(duì)數(shù)據(jù)庫文件的保護(hù)和管理。

            1、數(shù)據(jù)庫文件

            數(shù)據(jù)庫文件是存放數(shù)據(jù)庫數(shù)據(jù)和數(shù)據(jù)庫對(duì)象的文件。一個(gè)數(shù)據(jù)庫可以有一個(gè)或多個(gè)數(shù)據(jù)庫文件,一個(gè)數(shù)據(jù)庫文件只屬于一個(gè) 數(shù)據(jù)庫。當(dāng)有多個(gè)數(shù)據(jù)庫文件時(shí),有一個(gè)文件被定義為主數(shù)據(jù)庫文件,擴(kuò)展名為.mdf,它用來存儲(chǔ)數(shù)據(jù)庫的啟動(dòng)信息和部分或全部數(shù)據(jù)。一個(gè)數(shù)據(jù)庫只能有一個(gè) 主數(shù)據(jù)庫文件,其它數(shù)據(jù)庫文件被稱為次要數(shù)據(jù)庫文件,擴(kuò)展名為.ndf,用來存儲(chǔ)主文件沒存儲(chǔ)的其它數(shù)據(jù)。

            多個(gè)數(shù)據(jù)庫文件組合到一塊就成為文件組。主文件組是由主文件組合成,此文件組是由此文件組合成,但是事務(wù)日志文件不屬于任何一個(gè)文件組。

            2、事務(wù)和鎖

            事務(wù)

            事務(wù)(Transaction)是并發(fā)控制的單位,是用戶定義的一個(gè)操作序列。這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。通過事務(wù),SQL Server能將邏輯相關(guān)的一組操作綁定在一起,以便服務(wù)器保持?jǐn)?shù)據(jù)的完整性。

            事務(wù)通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結(jié)束。

            COMMIT表示提交,即提交事務(wù)的所有操作。具體地說就是將事務(wù)中所有對(duì)數(shù)據(jù)庫的更新寫回到磁盤上的物理數(shù)據(jù)庫中去,事務(wù)正常結(jié)束。

            ROLLBACK表示回滾,即在事務(wù)運(yùn)行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進(jìn)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫的所有以完成的操作全部撤消,回滾到事務(wù)開始的狀態(tài)。

            鎖

            數(shù)據(jù)庫就是通過鎖機(jī)制來解決并發(fā)問題的。。主要就是兩種鎖,共享鎖和排他鎖(也叫獨(dú)占鎖)。

            從程序員的角度看鎖分為以下兩種類型:

            樂觀鎖(Optimistic Lock):樂觀鎖假定在處理數(shù)據(jù)時(shí),不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠數(shù)據(jù)庫來管理鎖的工作。一般情況下,當(dāng)執(zhí)行事務(wù)處理時(shí)SQL Server會(huì)自動(dòng)對(duì)事務(wù)處理范圍內(nèi)更新到的表做鎖定。

            悲觀鎖(Pessimistic Lock):悲觀鎖對(duì)數(shù)據(jù)庫系統(tǒng)的自動(dòng)管理不感冒,需要程序員直接管理數(shù)據(jù)或?qū)ο笊系募渔i處理,并負(fù)責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。


            ● 應(yīng)用實(shí)例

          /*--下面我們新建一個(gè)名為company的數(shù)據(jù)庫,創(chuàng)建三個(gè)表priduct、project、tblsales,并在其中創(chuàng)建默認(rèn)值、規(guī)則、觸發(fā)器、存儲(chǔ)過程,并利用用戶、角色、權(quán)限等確保數(shù)據(jù)庫安全。*/
          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_priduct_project]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
          ALTER TABLE [dbo].[priduct] DROP CONSTRAINT FK_priduct_project
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getavgpbiaodi]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
          drop procedure [dbo].[getavgpbiaodi]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pinfo5000]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
          drop procedure [dbo].[pinfo5000]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
          drop procedure [dbo].[pro]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sysconstraints]') and OBJECTPROPERTY(id, N'IsView') = 1)
          drop view [dbo].[sysconstraints]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[priduct]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
          drop table [dbo].[priduct]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[project]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
          drop table [dbo].[project]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblsales]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
          drop table [dbo].[tblsales]
          GO

          if exists (select * from dbo.systypes where name = N'tele')
          exec sp_droptype N'tele'
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[rule_position]') and OBJECTPROPERTY(id, N'IsRule') = 1)
          drop rule [dbo].[rule_position]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[@position]') and OBJECTPROPERTY(id, N'IsDefault') = 1)
          drop default [dbo].[@position]
          GO

          create default [@position] as '其它'
          GO
          create rule [rule_position] as @postion in('項(xiàng)目經(jīng)理','秘書','會(huì)計(jì)','職員','其它')
          GO
          setuser
          GO

          EXEC sp_addtype N'tele', N'smallint', N'not null'
          GO

          setuser
          GO

          CREATE TABLE [dbo].[priduct] (
           [產(chǎn)品ID] [int] NULL ,
           [產(chǎn)品名稱] [char] (20) COLLATE Chinese_PRC_CI_AS NULL
          ) ON [PRIMARY]
          GO

          CREATE TABLE [dbo].[project] (
           [項(xiàng)目編號(hào)] [int] NOT NULL ,
           [項(xiàng)目名稱] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
           [開始日期] [datetime] NULL ,
           [預(yù)計(jì)日期] [int] NULL ,
           [客戶編號(hào)] [int] NULL ,
           [負(fù)責(zé)人編號(hào)] [int] NULL ,
           [項(xiàng)目標(biāo)的] [int] NULL
          ) ON [PRIMARY]
          GO

          CREATE TABLE [dbo].[tblsales] (
           [number] [int] NOT NULL ,
           [name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
           [sex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
           [birthday] [datetime] NULL ,
           [salary] [money] NULL
          ) ON [PRIMARY]
          GO

          setuser
          GO

          EXEC sp_bindefault N'[dbo].[@position]', N'[project].[項(xiàng)目標(biāo)的]'
          GO

          EXEC sp_bindrule N'[dbo].[rule_position]', N'[project].[項(xiàng)目名稱]'
          GO

          setuser
          GO

          SET QUOTED_IDENTIFIER ON
          GO
          SET ANSI_NULLS ON
          GO

          --/****** Encrypted object is not transferable, and script can not be generated. ******/

          GO
          SET QUOTED_IDENTIFIER OFF
          GO
          SET ANSI_NULLS ON
          GO

          SET QUOTED_IDENTIFIER ON
          GO
          SET ANSI_NULLS ON
          GO

          create procedure getavgpbiaodi
          @name varchar(10),@avgpbiaodi int output
          as
          declare @errorsave int
          set @errorsave=0
          select @avgpbiaodi=avg(項(xiàng)目標(biāo)的)
          from project as p inner join pmanager as pm on p.負(fù)責(zé)人ID=pm.負(fù)責(zé)人ID
          where pm.姓名=@name
          if(@@error<>0)
           set @errorsave=@@error
           return @errorsave

          GO
          SET QUOTED_IDENTIFIER OFF
          GO
          SET ANSI_NULLS ON
          GO

          SET QUOTED_IDENTIFIER ON
          GO
          SET ANSI_NULLS ON
          GO

          create procedure pinfo5000
          as select * from project where 項(xiàng)目標(biāo)的>=5000
          order by 項(xiàng)目標(biāo)的 desc

          GO
          SET QUOTED_IDENTIFIER OFF
          GO
          SET ANSI_NULLS ON
          GO

          SET QUOTED_IDENTIFIER ON
          GO
          SET ANSI_NULLS ON
          GO

          create procedure pro
          @n1 int,@n2 int,@n3 int,@avreage int output
          as select
          @avreage=(@n1+@n2+@n3)/3
          declare @avgscore int
          exec pro1 1,2,3,@avgscore output
          select 'The score is:',@avgscore

          GO
          SET QUOTED_IDENTIFIER OFF
          GO
          SET ANSI_NULLS ON
          GO

            SQL Server的基礎(chǔ)框架知識(shí),我現(xiàn)在只能總結(jié)這么多,更多的總結(jié)還是在以后一點(diǎn)一滴的學(xué)習(xí)中。


          posted on 2012-09-03 10:12 順其自然EVO 閱讀(279) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 青州市| 阳谷县| 昌邑市| 怀柔区| 息烽县| 云浮市| 山东省| 南丰县| 静乐县| 仪征市| 手机| 天气| 西城区| 容城县| 白沙| 启东市| 沈丘县| 涟水县| 广灵县| 临洮县| 楚雄市| 大新县| 枝江市| 古交市| 南雄市| 肇东市| 化州市| 维西| 洪雅县| 昭苏县| 遂平县| 湟源县| 浦江县| 尉氏县| 嘉义市| 黄冈市| 石门县| 礼泉县| 子洲县| 尖扎县| 岚皋县|