qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          SQL Server數據庫程序設計知識總結

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

            ● 關系和非關系數據庫

             關系數據庫是創建在關系模型基礎上的數據庫,由一個或多個二維關系數據表組成,通過建立表之間的關系來定義數據庫的結構。在關系數據庫中最重要的是數據 表,數據表把相關聯的數據按行和列排列到一起來描述一個實物。一個二維表稱為一個關系,每一個關系又可以包含多個屬性。

            和關系型數據庫相比,非關系型數據庫特別適合以SNS為代表web 2.0應用,這些應用需要極高速的并發讀寫操作,而對數值一致性要求卻不甚高。關系數據庫為了維護事務的一致性付出了重大代價導致了其讀寫能力下降,隨著 現在網絡SNS的應用對并發讀寫能力要求極高,關系型數據庫已經無法應付,因此,必須用新的一種數據結構化存儲來來代替關系數據庫。關系數據庫的另一個特 點就是其具有固定的表結構,因此,其擴展性極差,而在SNS中,系統的升級,功能的增加,往往意味著數據結構巨大改動,這一點關系型數據庫也難以應付,需 要新的結構化數據存儲。于是,非關系數據庫(NoSQL)應運而生。非關系數據庫通常沒有固定的表結構,嚴格上說不是一種數據庫,應該是一種數據結構化存 儲方法的集合。

            ● SQL Server數據庫基礎

            首先我們從圖中看他們之間的聯系。

            一、T-SQL和SQL的比較

            SQL全稱為Structured Query Language,是關系數據庫的標準語言,它主要包括三種語言:  數據定義語言、數據操縱語言、數據控制語言。T-SQL是SQL語言的增強版。

             也就是說,SQL三種語言適用于所有關系型數據庫,但是它本身具有局限性,因為它只提供了對數據庫數據基本的增刪改查等命令,在開發擁有復雜結構的數據 庫程序時,只有SQL語言是遠遠不夠的,于是各大公司在SQL基礎上對它進行了增強。T-SQL是MS和Sybase在 SQL的DDL和 DML基礎上,增加了延伸的函數、系統預存程序以及程式設計結構(例如 IF和 WHILE)讓程式設計更有彈性。和T-SQL類似的增強版的SQL語言還有Oracle對SQL的擴展PL/SQL。

            二、數據庫對象

            數據庫對象定義了數據庫內容的結構。它們包含在數據庫項目中,數據庫項目還可以包含數據生成計劃和腳本。 在學習SQL Server時,最快的方法是先學習數據庫對象。在研究了它們之間的異同點后,我把數據庫對象分為三類。





           這三類數據庫對象在功能上可能有重疊。

            1、基于表的對象

            表,數據保存在表中。

            基于表的對象我把它分為三類:

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

            索引,對數據庫表中一個或多個列的值進行排序的結構,提供指針以指向存儲在表中指定列的數據值,然后根據指定的排序次序排列這些指針。數據庫使用索引的方式與使用書的目錄很相似;

            約束、默認值、規則、觸發器確保了數據完整性。

            2、數據庫安全性:用戶、角色、權限與數據庫安全性中的登陸聯合應用可以限制登陸者可進行的操作來保證數據庫的安全性。

            3、塊:存儲過程和函數有點相似,但是存儲過程可以返回Recordset;觸發器是一種特殊的存儲過程。

            三、DTS數據轉換服務

            DTS的主要作用:1、導入與導出數據

            2、轉換數據(檢驗、凈化、重整數據)

            3、轉換數據庫對象

            四、管理和維護

            在這部分中主要是對數據庫文件的保護和管理。

            1、數據庫文件

            數據庫文件是存放數據庫數據和數據庫對象的文件。一個數據庫可以有一個或多個數據庫文件,一個數據庫文件只屬于一個 數據庫。當有多個數據庫文件時,有一個文件被定義為主數據庫文件,擴展名為.mdf,它用來存儲數據庫的啟動信息和部分或全部數據。一個數據庫只能有一個 主數據庫文件,其它數據庫文件被稱為次要數據庫文件,擴展名為.ndf,用來存儲主文件沒存儲的其它數據。

            多個數據庫文件組合到一塊就成為文件組。主文件組是由主文件組合成,此文件組是由此文件組合成,但是事務日志文件不屬于任何一個文件組。

            2、事務和鎖

            事務

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

            事務通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。

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

            ROLLBACK表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的所有以完成的操作全部撤消,回滾到事務開始的狀態。

            鎖

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

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

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

            悲觀鎖(Pessimistic Lock):悲觀鎖對數據庫系統的自動管理不感冒,需要程序員直接管理數據或對象上的加鎖處理,并負責獲取、共享和放棄正在使用的數據上的任何鎖。


            ● 應用實例

          /*--下面我們新建一個名為company的數據庫,創建三個表priduct、project、tblsales,并在其中創建默認值、規則、觸發器、存儲過程,并利用用戶、角色、權限等確保數據庫安全。*/
          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('項目經理','秘書','會計','職員','其它')
          GO
          setuser
          GO

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

          setuser
          GO

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

          CREATE TABLE [dbo].[project] (
           [項目編號] [int] NOT NULL ,
           [項目名稱] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
           [開始日期] [datetime] NULL ,
           [預計日期] [int] NULL ,
           [客戶編號] [int] NULL ,
           [負責人編號] [int] NULL ,
           [項目標的] [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].[項目標的]'
          GO

          EXEC sp_bindrule N'[dbo].[rule_position]', N'[project].[項目名稱]'
          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(項目標的)
          from project as p inner join pmanager as pm on p.負責人ID=pm.負責人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 項目標的>=5000
          order by 項目標的 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的基礎框架知識,我現在只能總結這么多,更多的總結還是在以后一點一滴的學習中。


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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 柳河县| 浦东新区| 平凉市| 青海省| 威宁| 武宁县| 错那县| 花莲市| 钟山县| 肃北| 磐石市| 中牟县| 错那县| 宁强县| 出国| 南投县| 延安市| 抚宁县| 新宾| 青川县| 桃源县| 曲水县| 武城县| 巴东县| 介休市| 贺兰县| 即墨市| 莲花县| 格尔木市| 色达县| 海林市| 安龙县| 鞍山市| 海口市| 天镇县| 崇阳县| 澄迈县| 平罗县| 道真| 阿克苏市| 祁阳县|