SQL Server 數據庫原理與應用

1. 數據庫概述

  1. 名詞解釋:sql

    • DB:數據庫
    • DBMS:數據庫管理系統
    • DBS:數據庫系統
    • DBA:數據庫管理員
    • DBAS:數據庫應用系統
  2. 數據管理的三個階段:人工管理文件系統階段數據庫系統階段
  3. 三級模式:數據庫

    • 外模式:也稱子模式或用戶模式,它是對數據庫用戶可以看見和使用的局部數據的邏輯結構和特徵的描述。一個數據庫能夠有多個外模式,但一個應用程序只能使用同一個外模式。外模式與視圖對應。
    • 模式:也稱概念模式或邏輯模式,是對數據庫中所有數據的邏輯結構和特徵的描述,是全部用戶的公共數據視圖。一個數據庫只有一個模式。模式與基本表對應。
    • 內模式:內模式也稱存儲模式或物理模式,是對數據物理結構和存儲方式的描述,是數據在數據庫內部的表示方式,一個數據庫只有一個內模式。內模式與索引對應。
  4. 兩級映像與數據獨立性的關係:編程

    • 外模式/模式映像:當模式改變時,由數據庫管理員對各個外模式/模式映像做相應改變,可使外模式保持不變。應用程序是依據數據的外模式編寫的,於是應用程序沒必要修改,保證數據與程序的邏輯獨立性
    • 模式/內模式映像:當數據庫的存儲結構改變了,由數據庫管理員對模式/內模式映像做相應改變,能夠保證模式保持小變,於是應用程序也沒必要改變。保證數據與程序的物理獨立性
  5. 概念模型三種聯繫的類型:安全

    • 一對一聯繫(1:1)
    • 一對多聯繫(1:M)
    • 多對多聯繫(M:N)
  6. 實體-聯繫(Entity-Relationship)模型通用表示方式:併發

    • 用矩形表示實體,在框內寫上實體名。
    • 用橢圓形表示實體的屬性,並用無向邊把實體和屬性鏈接起來。
    • 用菱形表示實體間的聯繫,在菱形框內寫上聯繫名,用無向邊分別把菱形框與有關實體鏈接起來,在無向邊旁註明聯繫的類型。聯繫能夠有屬性
    • 學生實體和班級實體的聯繫的 E-R 圖以下 :

      圖片描述

2. 關係數據庫

  1. 關係完整性是指關係模型數據正確性一致性
  2. 關係模型三類完整性規則:dom

    • 實體完整性:實體完整性要求關係的主碼具備惟一性且不能取空值。
    • 參照完整性:外鍵的取值只能等於空值或所參照的主鍵的取值。
    • 用戶自定義完整性:是由用戶根據實際狀況對數據庫中數據的內容進行的規定,也稱爲域完整性規則。
  3. 關係代數:是以關係爲運算對象的一組高級運算的集合。關係代數是一種抽象的查詢語句,是關係數據操縱語言的一種傳統表達方式,即代數方式的數據查詢過程。關係代數的運算對象是關係,運算結果也是關係。數據庫設計

    • 笛卡兒積函數

      • A×B={(x,y)|x∈A∧y∈B}
      • 例如,A={a,b}, B={0,1,2},則
      • A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

        B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}性能

    • 選擇運算測試

      • 在關係 R 中選擇知足給定條件的諸元組,記做: σF(R)={t | t∈R^ F(t)='真'}
      • 其中, F 表示選擇條件,它是一個邏輯表達式,取邏輯值「真」或「假」。
        圖片描述
    • 投影運算

      • 在關係 R 上從中選擇出若干屬性列組成新的關係。記做: πA(R)={t[A]|t∈R}
      • 其中,A 爲 R 中的屬性列。
        圖片描述
  4. 關係模式是一個五元組,能夠表示爲 R(U,D,dom,F)

    • R 是關係名
    • U 是該關係的屬性名集合
    • D 是屬性組 U 種屬性所來自的域
    • dom 是屬性向域的映像集合
    • F 是屬性間的數據依賴關係集合
    • 例如:學生狀況表的關係模式能夠描述爲學生狀況表(學號,姓名,性別,年齡,所在系)
  5. 關係模式中常見的問題:數據冗餘、更新異常、插入異常、刪除異常。
  6. 範式是符合某一種級別的關係模式的集合

    • 1NF:任何關係模式都是第一範式。

      • S(學號,姓名,性別,課程號,學分)
    • 2NF:不存在非主屬性部分函數依賴於碼

      • S(學號,姓名,性別,課程號,學分)存在對碼的部分函數依賴,須要先分解才能知足 2NF
      • 分解後:S1(學號,姓名,性別),S2(學號,課程號,學分)
    • 3NF:非主屬性既不部分也不傳遞函數依賴與碼

      • ST(學號、樓號、收費),學號→樓號,樓號→收費,存在傳遞函數依賴,須要先分解才能知足 3 NF
      • 分解後:ST1(學號,樓號),ST2(樓號,收費)

3. 數據庫設計

  1. 數據庫系統設計分爲 6 個階段:

    • 需求分析:調查用戶需求,數據流圖和數據字典
    • 概念結構設計:設計局部 E-R 模型,再將局部 E-R 模型集成
    • 邏輯結構設計:將 E-R 模型轉換爲關係數據模型,包括實體的轉換聯繫的轉換
    • 物理結構設計:肯定數據庫的物理結構、數據的存儲結構,誰數據的存取路徑和存放位置等。
    • 數據庫實施階段、運行和維護:創建實際的數據庫結構、數據的加載、試運行和評估等。
  2. E-R 模型轉換關係數據模型

    • 實體的轉換:

      • 實體集對應於一個關係
      • 關係名:與實體集同名
      • 屬性:實體集的全部屬性
      • 主碼:實體集的主碼
    • 聯繫的轉換:內容較多,建議參考書籍第 42 頁,題目參考 52 頁第 8 題

5. 數據庫的概念和操做

  1. SQL Server 中數據文件的類型

    • 主數據文件:有且只有一個 .mdf
    • 輔助數據文件:無關緊要 .ndf
    • 事務日誌文件:至少有一個 .ldf (事務日誌文件不分組管理,即不屬於任何文件組)
  2. 數據文件組:爲了便於管理和分配數據而將文件組織在一塊兒,一般能夠爲一個數據庫建立多個文件組(File Group),將多個數據庫文件分配在不一樣的文件組內分組管理。
  3. 邏輯數據庫:

    • master 數據庫:是最重要的系統數據庫,記錄系統中全部系統級信息。
    • model 數據庫:爲用戶新建立的數據庫提供模板,它包含了用戶數據庫中應該包含的全部系統表結構。
    • msdb 數據庫:記錄備份及還原的歷史信息、維護計劃信息、做業信息、異常信息以及操做者信息等。
    • tempdb 數據庫:tempdb 數據庫保存全部的臨時表和臨時存儲過程。

6. 表的操做

  1. 建立表格 / 修改表結構 / 刪除表格

    -- 建立表格
    CREATE TABLE student
    (
      cno char(4) PRIMARY KEY,
      cname nvarchar(20) NOT NULL,
      sex nvarchar(4),
      birthday date
    )
    -- 修改表格只須要將 CREATE 改成 ALTER
    -- 刪除表格 DROP TABLE [TABLE_NAME]
  2. 約束:約束是經過限制列中數據、行中數據和表之間數據來保證數據完整性的很是有效的方法。約束能夠確保把 有效數據 輸入到列中及維護表和表之間的特定關係

    -- 在建立表的同時建立約束
    CREATE TABLE student
    (
      cno char(4) PRIMARY KEY, /*Primary Key*/
      sex nvarchar(4) DEFAULT '男' CHECK(sex IN ('男','女')), /*Default+Check*/
      birthday date DEAFAULT date(getdate()), /*Default*/
      IDCardNUM char(18) UNIQUE, /*Unique 約束*/
      class char(10) Foreign KEY Reference classes(class_num)/*foreing key*/
      ……
    )
    -- 在建立表以後添加約束
    ALTER TALBE [表名]
    ADD CONSTRAINT [約束名] [約束類型] (列名)
    ALTER TALBE student
    ADD CONSTRAINT pk_st PRIMARY KEY (cno)
    ALTER TALBE student
    ADD CONSTRAINT cj_sex CHECK(sex in ('男', '女')) /*性別只能爲男或女*/

7. 數據庫查詢

  • 簡單查詢:
-- 單表查詢
SELECT * FROM 表名
-- 多表查詢
SELECT rdID, rdName FROM Reader;
-- DISTINCT 關鍵字
SELECT DISTINCT specialty FROM student; /*查詢學生表中的專業名稱,過濾重複行*/
-- AS 關鍵字
SELECT DISTINCT specialty AS 專業名稱 FROM student;/*將查詢結果中 specialty 取一個列別名*/
  • 選擇查詢:
-- 比較運算符 =、>、<、>=、<=、!=、<>、!>、!<
SELECT * FROM sc WHERE score >= 60
-- 邏輯表達式 AND、OR、NOT
SELECT * FROM student WHERE specialty = '計算機' AND ssex = '男'
-- 肯定範圍的關鍵字 BETWEEN AND、NOT BETWEEN AND
SELECT * FROM sc WHERE score BETWEEN 80 AND 90
-- 肯定集合的關鍵字 IN、NOT IN
SELECT * FROM student WHERE specialty IN ('計算機','通訊')
-- 字符匹配關鍵字 LIKE、NOT LIKE
SELECT * FROM student WHERE sname LIKE '張%' /*查找姓張的學生*/
SELECT * FROM student WHERE sname LIKE '張_' /*查找姓張且姓字爲兩個字的學生*/
-- 空值判斷關鍵字 IS NULL、IS NOT NULL
SELECT * FROM sc WHERE score IS NULL
-- 複合條件查詢
SELECT * FROM student WHERE sex = '女' AND (specialty = '計算機' OR specialty = '通訊')
  • 分組查詢
-- 簡單分組
SELECT * FROM student GROUP BY ssex
-- HAVING 關鍵字:選修了兩門及以上課程的學生
SELECT * FROM student GROUP BY ssex HAVING COUNT(cno) >= 2
-- 聚合函數
count()、sum()、avg()、min()、max()
  • 鏈接查詢
-------------------------------------------------
a表     id   name     b表     id   job   parent_id
        1    張三             1    23    1
        2    李四             2    34    2
        3    王武             3    34    4
a.id 同 parent_id 存在關係
--------------------------------------------------
-- 內鏈接
select a.*,b.* from a inner join b on a.id = b.parent_id
結果是:
1   張三       1     23     1
2   李四       2     34     2
-- 左外鏈接
select a.*,b.* from a left join b on a.id = b.parent_id
結果是:
1   張三       1     23     1
2   李四       2     34     2
3   王武       null
-- 右外鏈接
select a.*,b.* from a right join b on a.id=b.parent_id
結果是:
1   張三       1     23     1
2   李四       2     34     2
null           3     34     4
  • 子查詢
-- 查詢與連曉燕在同一個單位的讀者;
SELECT rdName FROM Reader WHERE rdDept = (SELECT rdDept FROM Reader 
  WHERE rdName = '連小燕');
  • 集合運算查詢
-- UNION(並集):查詢選修了課程 C001 和 課程 C004 的學生的姓名
SELECT sname FROM sc,student
WHERE cno = 'C001' AND sc.sno = student.sno
UNION
SELECT sname FROM sc,student
WHERE cno = 'C004' AND sc.sno = student.sno
-- EXCEPT(差集):查詢沒有選課的學生的學號
SELECT sno FROM student
EXCEPT
SELECT sno FROM sc
-- INTERSECT(交集):查詢即選修了課程 C001 又選修了課程 C004 的學生的姓名
SELECT sname FROM sc,student
WHERE cno = 'C001' AND sc.sno = student.sno
INTERSECT
SELECT sname FROM sc,student
WHERE cno = 'C004' AND sc.sno = student.sno
  • 對查詢結果進行排序
-- 默認升序 ASC
SELECT * FROM SC ORDER BY sname ASC
-- 降序排序 DESC(按成績降序,成績相同的話按學號升序排)
SELECT sno,score FROM SC ORDER BY score DESC,sno ASC

8. 視圖和索引

  1. 視圖並非以一組數據的形式存儲在數據庫中,數據庫中只存儲視圖的定義,不存儲視圖對應的數據,這些數據仍存儲在導出視圖的基本表中,視圖其實是一個查詢結果。

    -- 建立視圖
    CREATE VIEW view_name AS
    SELECT column_name(s)
    FROM table_name
    WHERE condition
    -- 查看視圖
    SELECT * FROM view_name
    -- 刪除視圖
    DROP VIEW view_name
  2. 索引概述:索引(Index)是對數據庫表中一個或多個列的值進行排序的結構,其主要目的是提升SQL Server系統的性能,加快數據的查詢速度和減小系統的響應時間。
  3. 索引的類型

    • 彙集索引:

      • 在表和視圖中只能有一個彙集索引。
      • 當創建主鍵約束時,若表中沒有彙集索引,會用主鍵列做爲彙集索引鍵。
      • 實際應用中通常爲定義成主鍵約束的列創建彙集索引。
      • 彙集索引會對錶和視圖進行物理排序,對查詢很是有效。
    • 非彙集索引:

      • 非彙集索引不對錶和視圖進行物理排序。
      • 若表中不存在彙集索引,則表是未排序的。
      • 在表或視圖中,最多能夠創建250個非彙集索引,或者249個非彙集索引和1個彙集索引。
    • 彙集索引和非彙集索引均可以是惟一的索引。所以,只要列中數據是惟一的,就可在同一個表上建立一個惟一的彙集索引。若是必須實施惟一性以確保數據的完整性,則應在列上建立UNIQUE或PRIMARY KEY約束,而不要建立惟一索引。
  4. 建立索引:CREATE INDEX index_name ON table_name(col_name)

9. T-SQL 編程

  1. 變量的聲明:DECLARE @var_name VARCHAR(20)DECLARE @MyCounter INT
  2. 變量的分類:「@」開頭爲局部變量,「@@」開頭爲全局變量。
  3. 變量的賦值:SET @var_name = GETDATA()SELECT COUNT(sno)=@MyCounter from student
  4. 顯示變量的值:PRINT @var_name,@MyCounter
  5. 批出理語句使用

    /* 多行註釋 */
    -- 單行註釋
    SELECT sno,sname FROM student
    GO -- 此處 GO 爲批處理語句
  6. 流程控制語句

    -- SET 語句
    DECLARE @myvar char(20);
    SET @myvar = 'This is a test';
    SELECT @myvar;
    GO
    
    -- BEGIN END 語句(用於將多個 SQL 語句合併爲一個語句塊)
    BEGIN
      { sql_statement|statement_block }
    END
    
    -- IF……ELSE 語句:
    -- 若是 C001 號課的平均成績高於 80 分,則顯示「平均成績還不錯」,不然顯示「平均成績通常」
    IF ( SELECT AVG(score) FROM sc WHERE cno = 'coo1') > 80
      PRINT 'C001 號課的平均成績還不錯'
    ELSE
      PRINT 'C001 號課的平均成績通常'
    
    -- CASE 語句:以搜索 CASE 格式查詢全部學生的考試等級,包括學號、課程號和成績級別
    SELECT sno,cno,
      CASE
        WHEN score >= 90 then 'a'
        WHEN score >= 80 then 'b'
        WHEN score >= 70 then 'c'
        WHEN score >= 60 then 'd'
        WHEN score < 60 then 'e'
      END AS score_level
    FROM sc
    
    -- WHILE 語句:求 1 到 100 的累加和,當和超過 1000 時中止累加,顯示累加和以及累加到的位置。
    -- 結果:a=1035,i=45
    DECLARE @i int,@a int
    SET @i = 1, @a = 0
    WHILE @i <= 100
      BEGIN
        SET @a = @a + @i
        IF @a >= 1000 BREAK
        SET @i = @i + 1
      END
    SELECT @a AS 'a',@i AS 'i'
  7. 函數

    -- 聚合函數
    ADD(),AVG(),SUM()……
    -- 日期函數
    GETDATE():返回系統當前的日期和時間
    DAY():返回日期表達式中的日
    MOUTH():返回日期表達式中的月
    YEAR():返回日期表達式中的年
    -- 自定義函數:求選課表中某門課的平均成績
    CREATE FUNCTION average(@cn char(4)) RETURNS float
    AS
      BEGIN
        DECLARE @aver float
        SELECT @aver = (SELECT avg(score) FROM sc WHERE cno = @cn)
        RETURN @aver
      END
  8. 遊標(定義、打開、讀取、關閉、釋放)

    -- 利用遊標將sc表中選課成績小於50分的成績提升30%,將大於等於50分的成績提升50%
    -- 定義遊標
    DECLARE SC_Cursor CURSOR
    DYNAMIC FOR SELECT Grade FROM SC FOR UPDATE OF Grade
    -- 打開遊標
    OPEN SC_Cursor
    -- 讀取遊標
    DECLARE @Grade INT
    FETCH NEXT FROM SC_Cursor INTO @Grade
    --假如檢索到了數據,才處理
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 填充數據
        IF @Grade < 50
            UPDATE SC SET Grade = @Grade * 1.3 WHERE CURRENT OF SC_Cursor
        ELSE
            UPDATE SC SET Grade = @Grade * 1.5 WHERE CURRENT OF SC_Cursor
        -- 填充下一條數據
        FETCH NEXT FROM SC_Cursor INTO @Grade
    END
    -- 關閉遊標
    CLOSE SC_Cursor
    -- 釋放遊標
    DEALLOCATE SC_Cursor
    GO

10. 存儲過程和觸發器

  1. 建立存儲過程(修改存儲過程只要將 CREATE 替換爲 ALTER)

    -- 不帶參數的存儲過程
    CREATE PROCEDURE students_avg
    AS
    SELECT sno,avg(score) AS 'avgscore' FROM sc
    GROUP BY sno
    GO
    -- 帶參數存儲過程
    CREATE PROCEDURE usp_rdName
        @rdID CHAR(9),
        @rdName VARCHAR(20) OUTPUT
    AS
    SELECT @rdName = rdName
    FROM Reader
    WHERE rdID = @rdID
    GO
    -- 存儲過程當中可使用 raiserror 拋出異常
  2. 調用存儲過程

    -- 執行不帶參數的存儲過程
    EXECUTE students_avg
    -- 執行帶參數的存儲過程
    DECLARE @Result VARCHAR(20)
    EXEC usp_rdName 'rd2017001',@Result OUTPUT
    PRINT @Result
  3. 刪除存儲過程

    DROP PROCEDURE students_avg
  4. 觸發器

    • DML 觸發器:當對錶或視圖進行修改、插入、刪除這些操做時,會自動執行觸發器所定義的 SQL 語句。
    • DDL 觸發器:當添加、修改、或刪除數據庫對象時,會自動執行觸發器所定義的 SQL 語句。
  5. 建立觸發器、激發觸發器、刪除觸發器(刪除觸發器所在的表,系統會自動刪除與該表相關的觸發器)。

    -- 建立 DML 觸發器:
    GO
    CREATE TRIGGER DML_Limited ON student
    FOR DELETE
    AS
      DECLARE @count varchar(50)
      SET @count = STR(@@ROWCOUNT)+'個學生被刪除'
      SELECT @count
    RETURN
    -- 執行 DML 觸發器(查詢結果爲:5個學生被刪除)
    DELETE FROM student WHERE specialty = '計算機'
    -- 刪除 DML 觸發器
    DROP TRIGGER DML_Limited
    -- 禁止在 student 表上的全部觸發器
    ALTER TABLE student
    DISABLE TRIGGER ALL
    
    -- 建立 DDL 觸發器:禁止用戶修改 BooksDB 數據庫中的表;
    GO
    CREATE TRIGGER DDL_Limited ON DATABASE
    FOR DROP_TABLE,ALTER_TABLE
    AS
      PRINT '名爲 DDL_Limited 的觸發器禁止您修改 BooksDB 數據庫中的表'
      ROLLBACK
    -- 執行 DDL 觸發器
    DROP TABLE Borrow
    -- 刪除 DDL 觸發器
    DROP TRIGGER DDL_Limited
    
    -- 測試 AFTER 觸發器,理解 INSERTED 表和 DELETED 表的做用;
    GO
    CREATE TRIGGER tri_InsDelOnReader ON Reader for INSERT, DELETE
    AS
    SELECT *
    FROM inserted
    SELECT *
    FROM deleted
    PRINT 'Reader 表上的 AFTER 觸發器已執行!'
    GO
    -- 激發觸發器執行
    INSERT INTO  Reader
    VALUES('rd2017008', 3, '孫星', '計算機科學學院', '66666666', 0);
    -- 激發觸發器執行
    DELETE FROM Reader WHERE rdID = 'rd2017008'

11. 事務與併發控制

  1. 事務要求處理時必須知足 4 個原則,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
  2. 根據運行模式分類,事務分爲 4 種類型:

    • 自動提交事務:每條單獨的 T-SQL 語句都是一個事務。若是沒有經過任何語句設置事務,一條 T-SQL 語句就是一個事務,語句執行完事務就結束。
    • 顯式事務:每一個事務均以 BEGIN TRANSACTION 語句、COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句明確的定義了何時開始、何時結束的事務。
    • 隱式事務:前一個事務完成時新事務隱式開始,但每一個事務仍以 COMMIT COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句顯示結束。
    • 批處理級事務:該事務只能應用於多個活動結果集(MARS),在 MARS 會話中啓動 T-SQL 顯式或隱式事務變爲批處理級事務。當批處理完成時,沒有回滾或提交的批處理級事務自動由 SQL Server 語句集合分組後造成單個的邏輯工做單元。
  3. 若是多個用戶同時訪問一個數據庫沒有加以控制,就可能發生問題,這些問題包括:

    • 丟失修改:事務 T1 和事務 T2 同時讀取一個數據,T1 修改了這個數據後,T2 也修改了這個數據,那麼 T1 的修改結果就丟失了,所以稱爲丟失修改。
    • 髒讀:當一個事務正在訪問數據而且對數據進行了修改,而修改尚未提交到數據庫,這時另外一個事務也訪問這個數據,而後使用了這個數據。由於這個數據時尚未提交的數據,那麼另外一個事務讀取到的數據就是髒數據。
    • 不可重複讀:在一個事務內屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,因爲第二個事務的修改,第一個事務兩次讀到數據多是不同的。這就發生了在一個事務內,兩次讀取的數據不同的狀況,所以稱爲不可重複讀。
    • 幻讀:一個事務對一個表中的數據進行了修改,這種修改涉及表中所有數據行。同時第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後操做第一個事務的用戶會發現表中還有沒有修改的數據行,就像發生了幻覺。
  4. 鎖的類型

    • 共享鎖(Shared Lock,簡稱 S 鎖):容許併發事務讀取一個資源。當資源上存在共享 S 鎖時,任何其餘事務都不能修改數據。一旦讀取成功,當即釋放資源上的共享 S 鎖。
    • 排它鎖(eXClusive Lock,簡稱 X 鎖):防止併發事務對資源進行訪問,其餘事務不能讀取或修改 X 鎖鎖定的數據。在執行數據更新命令(插入、修改、刪除)時,SQL Server 會自動上 X 鎖。
    • 更新鎖(Update Lock,簡稱 U 鎖):當 SQL Server 準備更新數據時,它首先對數據對象加更新鎖,鎖定的數據將不能被修改,但能夠讀取。當等到 SQL Server 肯定要進行更新數據操做時,它會自動將更新鎖換爲排它鎖,但當數據對象上有其餘更新鎖存在時沒法對其作更新鎖鎖定。
    • 意向鎖(Intent Lock,簡稱 I 鎖):則說明該資源的下層資源正在被加鎖(S 鎖或 X 鎖);在對任一資源加鎖時,必須先對它的上層資源加意向鎖。
    • 模式鎖(Schema Lock):保證當表或者索引被另一個會話參考時不能被刪除或者修改其結構模式。
    • 大容量更新鎖(Bulk Update Lock,簡稱 BU 鎖):容許進程將數據併發地大容量複製到同一表,同時防止其餘不進行大容量複製數據的進程訪問該表。
  • 自動提交事務:
INSERT INTO  Reader
VALUES('rd2017008', 3, '孫星', '計算機科學學院', '66666666', 0);
  • 顯式事務:
CREATE TABLE Account(
  cardID  CHAR(4) NOT NULL PRIMARY KEY,
  Name CHAR(6),
  Balance INT CHECK(Balance > = 1)        
) 
GO 
INSERT INTO Account VALUES('6666', '張三', 1000)
INSERT INTO Account VALUES('8888', '李四', 1) 
--使用事務實現轉帳:捕獲到異常就回滾
BEGIN TRAN
  BEGIN TRY    
    UPDATE account SET balance = balance + 1000 WHERE cardID = '8888'
    UPDATE account SET balance = balance - 1000 WHERE cardID = '6666'
    COMMIT
  END TRY
  BEGIN CATCH   
    ROLLBACK
  END CATCH
  • 隱式事務:
-- 執行如下代碼打開隱式事務:
SET IMPLICIT_TRANSACTIONS ON
-- 建立一個數據表,開始一個新的事務
CREATE TABLE T1 (i INT PRIMARY KEY)
GO
-- 查詢表(查詢成功)
SELECT *
FROM T1
-- 取消事務後再查詢表中的數據(因爲表不復存在,因此會獲得一個錯誤信息。)
ROLLBACK
SELECT *
FROM T1
-- 執行如下代碼關閉隱式事務:
SET IMPLICIT_TRANSACTIONS OFF;

12. 數據庫的安全管理

  1. SQL Server 身份驗證分爲 Windows 身份驗證模式混合驗證模式
  2. 權限管理基本語法 GRANT|REVOKE|DENY ALL ON 安全對象 TO 用戶
  3. 不推薦使用 ALL,僅保留此選項用於向後兼容,它不會授予全部可能的權限。
安全對象 ALL 對應的權限
數據庫 CREATE DATABASE, CREATE PROCEDURE, CREATE VIEW, CREATE TABLE, CREATE RULE 等
標量函數 EXECUTE, REFERENCES
表值函數 SELECT, DELETE, INSERT, UPDATE, REFERENCES
存儲過程 EXECUTE, SYNONYM
SELECT, DELETE, INSERT, UPDATE, REFERENCES
視圖 SELECT, DELETE, INSERT, UPDATE, REFERENCES
-- 建立登錄帳戶、建立數據庫帳戶、授予權限、拒絕權限實例
CREATE LOGIN wtq WITH PASSWORD = 'wtq888',DEFAULT_DATABASE = BooksDB
GO
CREATE LOGIN test WITH PASSWORD = 'test888',DEFAULT_DATABASE = BooksDB
GO
CREATE USER wtq FROM LOGIN wtq
GO
CREATE USER test FROM LOGIN test
GO
GRANT SELECT,INSERT ON ReaderType TO wtq
DENY DELETE,UPDATE ON ReaderType TO wtq
DENY DELETE,INSERT,REFERENCES,SELECT,UPDATE ON ReaderType TO test

13. 數據庫的備份和還原

-- teaching 的完整備份(差別備份只須要將 WITH 後面的 Format 改成 Differential )
BACKUP DATABASE teaching
TO DISK = 'F:\BACKUP\teaching.Bak'
WITH FORMAT
NAME = 'teaching 的完整備份'
-- teaching 的完整數據庫備份進行還原(差別還原使用 WITH RECOVERY)
RESTORE DATABASE teaching
TO DISK = 'F:\BACKUP\teaching.Bak'
WITH REPLACE,NORECOVERY

14. 基於 C# .NET 的數據庫系統開發

  1. 利用 Connection、Command、DataReader 對象訪問數據庫只能從數據庫讀取數據。只進行查詢,該方式更高效
  2. 利用 Connection、DataAdapter、DataSet 對象的方式比較靈活,增刪改查均可以。
  3. 利用 ADO.NET 訪問數據庫的基本步驟:
// 引入 數據命名空間 和 SQL 命名空間
using System.Data
using System.Data.SqlClient
// 建立鏈接對象並實例化,例如鏈接一個名爲 School 的 SQL Server 數據庫
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source = .\SQLEXPRESS; AttachDbFilename = E:\data\ school_Data.MDF;Integrated Security = True;Connect Timeout = 30;User Instance = True";
// 打開數據庫鏈接
con.Open();
// 讀取數據
SqlCommand cmd = con.CreateCommand();     // 建立命令對象並實例化
cmd.CommandText = "SELECT * FROM student";// SqlCommand 的屬性 CommandText 是一條 SQL 語句
SqlDataReader dr = cmd.ExecuteReader();   // 創建DataReader對象迅速獲取查詢結果
相關文章
相關標籤/搜索