(筆記)第7章 SQL Server 2012高級應用

第七章 SQL Server 2012高級應用(T-SQL)

本人所發此係列皆爲不收費的個人筆記,若讀者在別的地方發現有同樣的文章進行斂財收費的行爲,勿信

7.1 Transact-SQL程序設計

T-SQL的主要用途是設計服務器端能夠在後臺執行的程序塊,如存儲過程、觸發器等

7.1.1 變量

  1. 全局變量

    • 全局變量格式:以@@開頭

    • 特點:全局變量不由用戶的程序定義的,而是由系統定義和維護的,且是隻讀的

      全局變量名稱 功能
      @@connections 服務器啓動以來已經創建的連接數
      @@ERROR 最後一個T-SQL錯誤的錯誤號
      @@IDENITY 最後一次插入的標識符
      @@SERVERNAME 本機服務器名稱
      @@ROWCOUNT 上一個執行SQL語句映像的行數
  2. 局部變量

    • 聲明方式:DECLARE @變量名 變量類型[, @變量名 變量類型…]
    • 作用域:僅在聲明的批處理、存儲過程和觸發器中
    • 賦值方式:
      • select @變量名1=變量值1,@變量名2=變量值2…
      • set @變量名=變量值,set @變量名2=變量值
      • 注意要對多個變量賦值時兩種方式的區別,select出現一次即可,而set需要出現多次
  3. 註釋符:-- 單行註釋;/**/多行註釋;

7.1.2 運算符

  1. 算術運算符

    運算符 含 義
    +
    -
    *
    /
    % 求餘數
  2. 賦值運算符:等號(=)是唯一的Transact-SQL賦值運算符

  3. 字符串連接運算符:加號(+)

  4. 比較運算符

    運算符 含 義
    = 等於
    > 大於
    < 小於
    >= 大於或等於
    <= 小於或等於
    <> 不等於
    != 不等於(非SQL-92標準)
    !< 不小於(非SQL-92標準)
    !> 不大於(非SQL-92標準)
  5. 邏輯運算符

    運算符 含 義
    ALL 如果一組比較中都爲TRUE,運算結果就爲TRUE
    AND 如果兩個表達式都爲TRUE,運算結果就爲TRUE
    ANY 如果一組的比較中任何一個爲TRUE,運算結果就爲TRUE
    BETWEEN 如果操作數在某個範圍內,運算結果就爲TRUE
    EXISTS 如果子查詢包含一些行,運算結果就爲TRUE
    IN 如果操作數等於表達式列表中的一個,運算結果就爲TRUE
    LIKE 如果操作數與一種模式相匹配,運算結果就爲TRUE
    NOT 對邏輯值取反,即如果操作數的值爲TRUE,運算結果就爲FALSE,否則爲TRUE
    OR 如果兩個布爾表達式的一個爲TRUE,運算結果就爲TRUE
    SOME 如果一系列操作數中有些值爲TRUE,運算結果就爲TRUE
  6. 按位運算符

    運算符 含 義 運算規則
    & 按位與 兩個數對應的二進制位上都爲1時,該位上的運算結果爲1,否則爲0
    | 按位或 兩個數對應的二進制位上有一個爲1是,該位上的運算結果爲1,否則爲0
    ^ 按位異或 兩個數對應的二進制位上不同時,該位上的運算結果爲1,否則爲0
  7. 一元運算符

    運算符 含 義
    + 正號,數值爲正
    - 負號,數值爲負
    ~ 按位取反
  8. 運算符優先級和結合性

    優先級
    (從高到低)
    運算符 說明
    1 () 小括號
    2 +、-、~ 正、負、按位取反
    3 *、/、% 乘、除、求餘數
    4 +、-、+ 加、減、字符串連接
    5 =、>、<、>=、<=、<>、!=、!>、!< 各種比較運算符
    6 ^、&、| 位運算符
    7 NOT 邏輯非
    8 AND 邏輯與
    9 ALL、ANY、BETWEEN、IN、LIKE、OR、SOME 邏輯運算符
    10 = 賦值運算符

7.1.3 批處理

  1. 批處理:是包含一個或多個T-SQL語句的組,批處理的所有語句被整合成一個執行計劃。所有語句要麼一起通過解析,要麼沒有一句能夠執行
  2. 格式:Go … GO;兩個GO之間的SQL語句就是一個批處理單元

7.1.4 流程控制語句

  1. BEGIN……END:類似一個函數的大括號,意思是設定一個程序塊,將在BEGIN……END內的所有程序視爲一個單元執行

  2. IF……ELSE

    IF <條件表達式>
       <命令行或程序塊>
    [ELSE
       <命令行或程序塊>]
    
    • 如果不使用程序塊,IF和ELSE只能執行一條語句
    • 在T-SQL中IF…ELSE最多嵌套32層
  3. IF [NOT] EXISTS

    IF [NOT] EXISTS (SELECT 子查詢)
       <命令行或程序塊>
    [ELSE
       <命令行或程序塊>]
    
    • IF EXISTS語句用來檢測數據(子查詢內結果)是否存在
  4. CASE

    格式1:
    CASE <表達式>
       WHEN <表達式> THEN <表達式>
       ……
       WHEN <表達式> THEN <表達式>
       [ELSE <表達式>]
    END
    
    例:
    GO
    SELECT SNo,
        SEX=
        CASE SEX
           WHEN '男' THEN 'M'
           WHEN '女' THEN 'F'
        END
    FROM S
    GO
    
    格式2:
    CASE
       WHEN <表達式> THEN <表達式>
       ……
       WHEN <表達式> THEN <表達式>
       [ELSE <表達式>]
    END
    
    例:
    GO
    SELECT SNo,CNo,Score=
        CASE
           WHEN Score IS NULL THEN '未考'
           WHEN Score < 60 THEN '不及格'
        END
    FROM S
    GO
    
    
    • 當CASE語句中不包含ELSE子句時,如果所有比較都失敗,CASE將返回NULL
    • CASE命令可以嵌套到SQL命令中
  5. WHILE…CONTINUE…BREAK

       WHILE <條件表達式>
       BEGIN
          <命令行或程序塊>
          [BREAK]
          [CONTINUE]
          [命令行或程序塊]
       END
    
    • 標準的循環結構,與程序設計語言規則一樣
  6. WAITFOR

    WAITFOR {DELAY <'時間'> | TIME <'時間'> | ERROREXIT | PROCESSEXIT | MIRROREXIT}
    
    • WAITFOR命令用來暫時停止程序執行,直到所設定的等待時間已過或所設定的時間已到才繼續往下執行。其中“時間”必須爲DATETIME類型的數據,但不能包括日期
    • DELAY:設定等待時間,最多24小時
    • TIME:設定等待結束的時間點
    • ERROREXIT:直到處理非正常終端
    • PROCESSEXIT:直到處理正常或非正常中斷
    • MIRROREXIT:知道鏡像設備失敗
  7. GOTO

    GOTO 標識符
    
    例:
    DECLARE @s SMALLINT,@i SMALLINT
    SET @i=1
    SET @s=0
    BEG:
    IF (@i<=10)
    BEGIN
       SET @s=@s+@i
       Set @i=@i+1
       GOTO BEG      /*使程序跳轉到標號爲BEG的地方執行*/
    END
    PRINT @s
    
  8. RETURN

    RETURN ([整數值])
    
    • RETURN語句用於使程序從一個查詢、存儲過程或批處理中無條件返回,其後面的語句不在執行。若括號內沒有指定整數值,默認返回0
    返回值 含義
    0 程序執行成功
    -1 找不到對象
    -2 數據類型錯誤
    -3 死鎖錯誤
    -4 違反權限原則
    -5 語法錯誤
    -6 用戶造成的一般錯誤
    -7 資源錯誤
    -8 非致命的內部錯誤
    -9 達到系統配置參數極限
    -10 內部一致性致命錯誤
    -11 內部一致性致命錯誤
    -12 表或索引崩壞
    -13 數據庫破壞
    -14 硬件錯誤

7.1.5 常用命令

  1. BACKUP:將數據庫內容和事務處理日誌備份到存儲介質上

  2. CHECKPOINT:用於將當前工作的數據庫中被更改過的數據頁或日誌頁從緩衝區中強制寫入硬盤。格式如CHECKPOINT [checkpoint_duration]

    • checkpoint_duration是個int類型整數且必須大於0,單位是秒,若省略該參數,將自動調整檢查點持續時間
  3. DBCC:(Database Consistency Checker)數據庫一致性檢查程序,用於驗證數據庫完整性、查找錯誤、分析系統使用情況等

  4. DECLARE:用於聲明局部變量、遊標變量或表變量

    • 格式:DECLARE {{ @local_variable data_type } | { @cursor_variable_name CURSOR } | { table_type_definition } }[, …n]
    • 在用DECLARE聲明之後,所有變量都被賦予NULL
    • 不能聲明TEXT、NTEXT、IMAGE類型
    • 如果變量爲字符型,應該指明其最大長度,否則系統默認長度爲1
  5. EXECUTE:用來執行存儲過程,可用縮寫EXEC

  6. KILL:終止某一過程的執行

  7. PRINT:向客戶端返回一個用戶自定義的信息,如字符串、局部變量、全局變量等

    • 格式:PRINT ‘any ASCII text’ | @local_variable | @@FUNCTION | string_expression
    • 如果變量值不是字符串的話,必須向用數據轉換類型轉換函數CONVERT()將其轉換爲字符串
    • 表達式長度可以超過8000個字符,但超過8000的字符將不會顯示
  8. RAISERROR:在SQL Server系統返回錯誤信息是,同時返回用戶指定的信息

  9. RESTORE:將數據庫或其事務處理日誌備份文件由存儲介質存儲到SQL Server系統中

  10. SELECT:給局部變量賦值

    • 格式:SELECT {@local_variable = expression } [, …n]
    • SELECT 命令可以給多個局部變量賦值。
    • 如果expression爲列名,變量中保存的是其返回的最後一個值
    • 如果SELECT沒有返回值,則變量名仍爲原來的值
    • 如果expression是一個子查詢,如果子查詢沒有返回值,則變量被設爲NULL
  11. SET

    用法一:用於給局部變量賦值
    SET { { @local_variable cursor_name } | { @cursor_variable =
       { @cursor_variable1 cursor_name | 
          { CURSOR [FORWARD_ONLY |SCROLL]
             [STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
             [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
             [TYPE_WARNING]
             FOR select_statement
             [FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
          }
       }
    } }
    
    用法二:用於用戶執行SQL命令時,SQL Server處理選項的設定
    SET:選項ON
    SET:選項OFF
    SET:選項值
    
    • 與SELECT不同,SET只能給一個變量賦值
  12. SHUTDOWN:用於停止SQL Server的執行

    • 當使用NOWAIT參數時,使用SHUTDOWN命令立即停止SQL Server,並終止所有用戶過程並對每一個現行的事務發生一個回滾後,退出SQL Server
  13. USE:指定當前使用的數據庫

7.1.6 常用函數

  1. 統計函數

    1. STDEV(expression):返回表達式中所有數據的標準差。
      • 表達式通常爲表中某一數據類型爲NUMERIC的列,或近似NUMERIC類型的列,如MONEY類型,但BIT除外。表達式中NULL值江北忽略,其返回值爲FLOAT類型
    2. STDEVP(expression):返回表達式中所有數據的總體標準差。返回值爲FLOAT類型
    3. VAR(expression):返回表達式中所有數據的統計變異數。返回值爲FLOAT類型
    4. VARP(expression):返回表達式中所有數據的總體變異數。返回值爲FLOAT類型
  2. 算術函數

    函數類別 函數名 功能 示例
    三角函數 SIN(表達式)
    COS(表達式)
    TAN(表達式)
    COT(表達式)
    返回以弧度表示的表達式的正弦
    返回以弧度表示的表達式的餘弦
    返回以弧度表示的表達式的正切
    返回以弧度表示的表達式的餘弦
    SIN(0)的值爲0
    COS(0)的值爲1
    TAN(3.14159/4)的值爲0.999998
    SELECT COT(1) 的值爲0.642092
    反三角函數 ASIN(表達式)
    ACOS(表達式)
    ATAN(表達式)
    返回以表達式的值爲正弦值的角(弧度)
    返回以表達式的值爲餘弦值的角(弧度)
    返回以表達式的值爲正切值的角(弧度)
    ASIN(0)的值爲0
    ACON(1)的值爲0
    ATAN(0)的值爲0
    角度弧度轉換 DEGREES(表達式)
    RADIANS(表達式)
    把弧度轉換爲角度
    把角度轉換爲弧度
    DEGREES(1)的值爲57
    RADIANS(90.0)的值爲1.570796
    指數函數 EXP(表達式) 返回以e爲底、以表達式爲指數的冪值 EXP(1)的值爲2.718282
    對數函數 LOG(表達式)
    LOG10(表達式)
    返回表達式的以e爲底的自然對數值
    返回表達式的以10爲底的自然對數值
    LOG(1)的值爲0
    LOG10(10)的值爲1
    平方根函數 SQRT(表達式) 返回表達式的平方根 SQRT(1)的值爲1
    取近似值函數 CEILING(表達式)
    FLOOR(表達式)
    ROUND(表達式,n)
    返回大於等於表達式的最小整數
    返回小於等於表達式的最大整數
    將表達式四捨五入爲指定的精度n
    CEILING(-5.6)的值爲-5
    FLOOR(-5.2)的值爲-6
    ROUND(5.6782,2)的值爲5.6800
    符號函數 ABS(表達式)
    SIGN(表達式)
    返回表達式的絕對值
    測試表達式的正負號,返回0、1、-1
    ABS(-3.4)的值爲3.4
    SIGN(-3.4)的值爲-1
    其他函數 PI()
    RAND
    返回值爲π
    返回0~1之間的隨機浮點數
  3. 字符串函數

    1. 字符串轉換函數
      • ASCII(character_expression):返回字符表達式最左端的ASCII碼值
      • CHAR(integer_expression):將ASCII碼轉換爲對應的字符,弱超出0~255的整數值則返回NULL
      • LOWER(character_expression):把字符串轉換爲小寫,非字母的保持不變
      • UPPER(characrer_expression):把字符串轉換爲大寫,非字母的保持不變
      • STR(float_expression [, length[ , ] ] ):把數值型數據轉換爲字符型數據,默認length值爲10,decimal值爲0 。如果小數點錢的位數超過了指定長度,則返回指定長度的’*’
    2. 去空格函數
      • LTRIM(character_expression):把字符串頭部的空格去掉
      • RTRIM(charater_expression):把字符串尾部的空格去掉
    3. 取子串函數
      • LEFT(character_expression , integer_expression):返回部分字符串,從字符串最左邊到底integer_expression個字符的部分。若integer_expression爲負值,返回NULL
      • RIGHT(character_expression, integer_expression):函數返回部分字符串,從字符串右邊第integer_expression個字符到最後一個字符的部分
      • SUBSTRING(expression, starting_position, length):返回部分字符串,從字符串左邊第starting_position個字符到length個字符的部分。表達式可爲字符串或二進制串貨含字段名的表達式。SUBSTRING函數不能用於TEXT和IMAGE數據類型
    4. 字符串比較函數
      • CHARINDEX(substring_expression, expression):返回字符串中某個指定的子串出現的開始位置,若沒發現子串返回0。此函數不能用於TEXT和IMAGE數據類型
      • PATINDEX(’%substring_expression%’, expression):返回字符串中某個指定子串出現的開始位置,子串前後必須有百分號,否則返回0。與CHARINDEX函數不同的是PATINDEX函數的子串可以使用通配符,且詞函數可用於CHAR、VARCHAR和TEXT數據類型
    5. 字符串操作函數
      • QUOTENAME(character_expression [, quote_character]):返回被特定字符括起來的字符串,如“ ’ ”、“ 、 ”、“ ( ”、“ [ ”等,默認值爲“ [ ”。
      • REPLICATE(character_expression, integer_expression):返回一個重複指定次數的由character_expression指定的字符串。如果integer_expression爲負數,則返回NULL值
      • REVERSE(character_expression):指定的字符串的字符排列順序顛倒。
      • REPLACE(string_expression1, string_expression2,string_expression3):用3替換1中的子串2。
      • SPACE(integer_expression):返回一個由參數integer_expression所指定長度的空格字符串。若參數爲負值,則返回NULL串
      • STUFF(character_expression1, start_position, length, character_expression2):用另一個子串替換字符串中指定位置長度的子串。1爲源串,start爲替換的起始位置,length爲被替換的字符串長度,2爲目標字符串。
  4. 數據類型轉換函數

    1. CAST( AS <data_type>[ length ]):將表達式轉換類型
    2. CONVERT(<data_type>[ (length)], [, style]):data_type爲系統定義的數據類型,length指定數據長度,默認爲30;style將DATATIME和SMALLDATETIME數據轉換爲字符串時所選用的格式。
  5. 日期函數

    1. DAY(<date_expression>):返回表達式中的日期值
    2. MONTH(<date_expression>):返回表達式中的月份值
    3. YEAR(<date_expression>):返回表達式中的年份值
    4. DATEADD(, , ):返回指定日期date加上指定額外日期間隔number產生的新日期。
    5. DATEDIFF(, , ):返回兩個指定日期在datepart方面的差距值。
    6. DATENAME(, ):以字符串形式返回日期的指定部分。
    7. DATEPART(, ):以整數值返回日期的指定部分
    8. GETDATE():以DATETIME的默認格式返回系統當前的日期和時間,常作爲其他函數的參數或命令的參數使用
  6. 用戶自定義函數

使用T-SQL命令來操作自定義函數:創建(CREATE FUNCTION)、修改(ALTER FUNCTION)和刪除(DROP FUNCTION)。根據返回值類型分爲標量值函數(數值函數)和表值函數(內聯表值函數和多語句表值函數)。數值函數返回單個數據值,表值函數返回結果集(table數據類型)

  1. 創建標量值函數
CREATE FUNCTION function_name
([ { @parameter_name [AS] parameter_data_type [= default] [ READONLY ] }
 [ ,...n]
])
RETURNS return_data_type
[ WITH ENCRYPTION ]
[ AS ]
BEGIN
function_body
Return scalar_expression
END

例:判斷一個素是否爲素數
CREATE FUNCTION dbo.Fun1(@n AS INT)
RETURNS INT
AS
BEGIN
   DECLARE @i INT
   DECLARE @sign INT
   SET @sign=1
   SET @i=2
   WHILE @i<=SQRT(@n)
      BEGIN
         IF @n % @i=0
            BEGIN
               SET @sign=0
               BREAK
            END
         SET @i=@i+1
      END
   RETURN @sign
END
可以執行命令SELECT dbo.FUN1(13)調用函數

7.2 存儲過程

7.2.1 存儲過程的概念、優點及分類

  1. 存儲過程的產生原因(造成T-SQL語句執行效率低下的原因):
    1. 應用程序中存儲T-SQL語句,SQL server服務器被動執行T-SQL語句,每次都進行編譯,然後執行
    2. 應用程序執行T-SQL語句只能是逐句執行,有較複雜的T-SQL程序時網絡上會產生大量的流量
  2. 存儲過程的概念:存儲過程(Stored Procedure),是村粗在SQL Server數據庫中的一種編譯對象。它是一組SQL語句集,經編譯後存儲在數據庫中
  3. 存儲過程的優點:
    1. 模塊化的程序設計
    2. 高效率的執行
    3. 減少網絡流量
    4. 可以作爲安全機制使用
  4. 存儲過程的分類
    1. 系統存儲過程:主要存儲在master數據庫並以sp_爲命名前綴
    2. 用戶自定義存儲過程
    3. 擴展存儲過程:主要以xp_爲命名前綴

7.2.2 創建存儲過程

創建存儲過程需要確定三個組成部分

(1)所有輸入參數、傳給調用者的輸出參數

(2)被執行的針對數據庫的操作語句,包括調用其他存儲過程的語句

(3)返回的狀態值、指明調用成功還是失敗

  1. 用CREATE PROCEDURE命令創建存儲過程

    注意以下幾個問題!

    (1)在一個批處理中,CREATE PROCEDURE語句不能和其他SQL語句合併在一起

    (2)數據庫所有者具有默認的創建存儲過程的權限,他可以把權限傳遞給其他用戶

    (3)存儲過程作爲數據庫對象,命名需符合標識符命名規則

    (4)只能在當前數據庫中創建屬於當前數據庫的存儲過程

CREATE PROCEDURE procedure_name [ ; number]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [, ...n]
[ WITH 
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [, ...n]

參數含義:
procedure_name:是要創建的存儲過程的名字
@parameter:是存儲過程的參數
data_type:是參數的數據類型
VARYING:指定由OUTPUT參數支持的結果集,僅應用於遊標型參數
default:參數的默認值
OUTPUT:表面該參數是一個返回參數
RECOMPILE:指明SQL Server並不保存該存儲過程的執行計劃,該存儲過程每執行一次偶要重新編譯
ENCRYPTION:表面SQL Server加密了syscomments表。使用該關鍵字無法通過查看syscomments表來查看存儲過程內容
FOR REPLICATION:指明爲複製創建的存儲過程不能再訂閱服務器上執行,只有在創建過濾存儲過程時,
                才使用該選項。與WITH RECOMPILE選項互不兼容
AS:指明該存儲過程將要執行的動作

一個存儲過程的最大尺寸爲128MB,用戶定義的存儲過程必須創建在當前數據庫中

例子1,沒有參數的存儲過程:
GO
CREATE PROCEDURE MyProc AS 
SELECT * FROM S WHERE Sex='男'

例子2,有參數的存儲過程:
GO
CREATE PROCEDURE InsertRecord
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10),
  @sex NCHAR(1),
  @age INT,
  @dept NVARCHAR(20)
)
AS
INSERT INTO S VALUES(@sno,@sn,@sex,@age,@dept)

例子3,具有參數默認值的存儲過程:
GO
CREATE PROCEDURE InsertRecordDefa
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10),
  @sex NCHAR(1),
  @age INT,
  @dept NVARCHAR(20)='無'
)
AS
INSERT INTO S VALUES(@sno,@sn,@sex,@age,@dept)

例子4:定義能夠返回值的存儲過程:
GO
CREATE PROCEDURE QueryTeach
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10) OUTPUT,
  @dept NVARCHAR(20) OUTPUT
)
AS
SELECT @Sn=SN,@dept=Dept FROM S WHERE SNo=@sno

7.2.3 查看存儲過程

  1. 利用系統存儲過程sp_helptext查看存儲過程
EXEC sp_helptext 存儲過程名稱

7.2.5 刪除存儲過程

  1. 利用DROP PROCEDURE命令刪除存儲過程
DROP PROCEDURE 存儲過程名1,存儲過程名2...

7.2.6 執行存儲過程

EXECUTE {
    [@return_status=]
    {procedure_name[;number] | @produre_name_var}
    [[@parameter=] {value | @variable [OUTPUT} | [DEFAULT]}][,...n]
    [WITH RECOMPILE]
}

@return_status是可選的整型變量,用來保存存儲過程向調用者返回的值。
@procedure_name_var是一變量名,用來代表存儲過程的名字

7.2.7 修改存儲過程

  1. 利用ALTER PROCEDURE命令修改存儲過程
/*與創建存儲過程一樣,只需把CREATE改成ALTER即可*/
ALTER PROCEDURE procedure_name [ ; number]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [, ...n]
[ WITH 
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [, ...n]

7.3 觸發器

7.3.1 觸發器概述

  1. 觸發器概念:觸發器是特殊的存儲過程,它與存儲過程的區別是,能夠自動執行並且不含有參數
  2. 優點:
    1. 觸發器是在某個事件發生後自動激活而執行的。
    2. 觸發器可以實現比約束更爲複雜的完整性要求。
    3. 觸發器可以防止惡意的或錯誤的INSERT、UPDATE和DELETE操作
  3. 觸發器種類
    1. DML觸發器:對增刪改事件而激活自動執行的觸發器
      • After觸發器:事件執行後觸發
      • Instead of觸發器:事件執行前觸發
    2. DDL觸發器:各種DDL數據定義語言事件執行的存儲過程
    3. 登陸觸發器:登陸事件觸發

7.3.2 觸發器工作原理

  1. SQL Server爲每個觸發器創建了兩個特殊的表:插入表(Inserted表)和刪除表(Deleted表)
    • 這兩個表示系統在線生成的、動態駐留在內存中的臨時表,觸發器工作完成後系統自動刪除這兩個表
    • 是由系統管理的邏輯表,不允許用戶直接對其修改
    • 這兩個表的結構總是與被該觸發器作用的表的結構相同
對錶的操作 Inserted表 Deleted表
增加記錄(INSERT) 存放增加的記錄
刪除記錄(DELETE) 存放被刪除的記錄
修改記錄(UPDATE) 存放更新後的記錄 存放更新前的記錄
  1. INSERT觸發器的工作原理
graph TD
A[監視INSERT]-->B[將數據插入表中]
B-->C[生成Inserted表]
C-->D[執行觸發器中語句]
  1. DELETE觸發器的工作原理
graph TD
A[監視DELETE]-->B[刪除表中的內容]
B-->C[生成Deleted表]
C-->D[執行觸發器中語句]
  1. INSERT觸發器的工作原理
graph TD
A[監視UPDATE]-->B[刪除表中內容]
B-->C[生成Deleted表]
C-->D[向表中插入內容]
D-->E[生成Inserted表]
E-->F[執行觸發器中語句]

7.3.3 創建觸發器

  1. 創建DML觸發器
使用CREATE TRIGGER創建DML觸發器

CREATE TRIGGER trigger_name
ON {table | view}
[With Encryption]
{For | After | Instead OF}
{ [INSERT] [,] [UPDATE] [,] [DELETE] }
AS sql_statement [;]

參數說明
trigger_name:觸發器名稱,不能以#或##開頭,要符合命名規則
table | view:對其執行觸發器的表或視圖,
   視圖上不能定義FOR和AFTER觸發器,只能定義INSTEAD OF觸發器
WITH ENCRYPTION:指定對觸發器進行加密處理
FOR | AFTER:指定觸發器中在對應的DML操作成功執行後才觸發
Instead Of:指定執行DML觸發器而不是INSERT、UPDATE、DELETE語句。
   在使用了With Check Option語句的視圖上不能定義Instead of觸發器
[INSERT][,][UPDATE][,][DELETE]:指定能夠激活觸發器的操作
   必須至少指定一個操作
sql_statement:觸發器代碼,根據數據修改或定義語句來檢查或更改數據,
   通常包含流程控制語句,一般不應嚮應用程序返回結果
  1. 創建DDL觸發器
CREATE TRIGGER trigger_name
ON {ALL Server | Database}
[With Encryption]
{For | After} {event_type | enent_group} [,...n]
AS sql_statement [;]

參數說明
trigger_name:觸發器名稱,要符合命名規則
ALL Server:指定DDL觸發器的作用域爲當前服務器。
   指定此參數,只要服務器中任何位置出現event_type或event_group
   就會激活觸發器
DATABASE:指定DDL觸發器的作用域爲當前數據庫。
WITH ENCRYPTION:指定對觸發器進行加密處理
FOR | AFTER:指定DDL觸發器僅在觸發SQL語句中指定的所有操作
   都已成功執行時才被觸發
event_type:將激活DDL觸發器的T-SQL語言事件的名稱,
   這些事件由SQL Server定義
event_group:預定義的T-SQL語言事件分組的名稱。
   執行任何屬於event_group的T-SQL語言事件後都將激活DDL觸發器
sql_statement:觸發器代碼

7.3.4 查看觸發器

  1. 查看錶中觸發器
EXEC sp_helptrigger 'table'[,'type']

table:是觸發器所在表名
type:指定列出某一操作類型的觸發器,如INSERT、DELETE、UPDATE,
   若不指定,則列出所有觸發器
  1. 查看觸發器定義文本
EXEC sp_helptext 'trigger_name'
  1. 查看觸發器的所有者和創建時間
EXEC sp_help 'trigger_name'

7.3.5 修改觸發器

  1. 使用ALTER Trigger語句修改觸發器
(1)修改DML觸發器的ALTER TRIGGER語句
本質把CREATE改成ALTER即可
ALTER TRIGGER schema_name.trigger_name
ON {table | view}
[With Encryption]
{For | After | Instead OF}
{ [INSERT] [,] [UPDATE] [,] [DELETE] }
AS sql_statement [;]

(2)修改DDL觸發器的ALTER TRIGGER語句
本質把CREATE改成ALTER即可
ALTER TRIGGER trigger_name
ON {ALL Server | Database}
[With Encryption]
{For | After} {event_type | enent_group} [,...n]
AS sql_statement [;]

(3)使觸發器無效
DISABLE TRIGGER { [schema.] trigger_name [,...n] | ALL }
ON object_name

(4)使觸發器重新有效
ENABLE TRIGGER { [schema_name.] trigger_name [,...n] | ALL }
ON object_name

7.3.6 刪除觸發器

  1. 使用DROP TRIGGER 語句刪除觸發器
DROP TRIGGER trigger_name [,...n] [;]

7.4 備份和還原

數據庫的備份和還原是數據庫管理員維護數據庫安全性和完整性必不可少的操作

7.4.1 備份和還原概述

  1. 備份過程中不允許執行以下操作
    1. 創建或刪除數據庫文件
    2. 創建索引
    3. 執行非日誌操作
    4. 自動或手工縮小數據庫或數據庫文件的大小
  2. 數據庫備份的類型
    1. 數據庫完整備份:將數據庫內所有對象都進行備份,包括事務日誌
    2. 差異備份:只備份自從上次完整備份後數據庫變動的部分
    3. 事務日誌備份:值備份數據庫事務日誌的內容。
      • 與差異備份的區別:除了先要還原完整備份外,還要依次還原每個事務日誌備份,而不是置換預案最後一個事務日誌備份
    4. 文件及文件組備份:針對單一數據庫文件或者是文件組做備份,還原時可以僅僅針對受損的數據庫文件做還原
  3. 備份和還原策略
    1. 使用多個備份設備來同時進行備份處理。還原同理
    2. 綜合使用數據庫完整備份、差異備份或事務日誌備份來建設每次需要備份的數據量
    3. 使用文件或文件組備份和事務日誌備份
  4. 三種數據庫還原模式
    1. 簡單還原(Simple Recovery):指在進行數據庫還原是僅使用了完整數據庫完整備份和差異備份,而不涉及事務日誌完整備份
    2. 完全還原(Full Recovery):通過使用數據庫王錚備份和事務日誌備份,將數據庫還原到發生失敗的時刻。在此模式下數據庫幾乎不造成任何數據丟失
    3. 批日誌還原(Bulk-logged Recovery):性能上優於簡單還原和完全荒原模式,它能盡最大努力建設批操作所需要的存儲空間

7.4.2 創建備份設備

備份設備可採用物理設備名稱和邏輯設備名稱兩種方式

物理設備名稱:指操作系統文件名,就是路徑

邏輯設備名稱:爲物理備份設備指定的可選的邏輯別名

  1. 使用系統存儲過程sp_addumpdevice創建備份設備
sp_addumpdevice [@devtype = ] 'device_type' , 
[@logicalname = ] ' logical_name',
[@physicalname = ] 'physical_name'

參數說明
[@devtype = ] 'device_type':備份設備的類型,可以是disk或tape
[@logicalname = ] ' logical_name':備份設備的邏輯名稱
[@physicalname = ] 'physical_name':備份設備的物理名稱。
   物理名稱必須遵從操作系統文件名規則或網絡設備的通用命名規則,
   並且必須包含完整路徑
   
例1,創建一個磁盤備份設備:
GO
EXEC sp_addumpdevice 'disk','pubss','c:\backdev\backdevpubs.bak'

例2,創建遠程磁盤備份設備:
GO
EXEC sp_addumpdevice 'disk','networkdevice','\\servername\sharename\path\filename.ext'
  1. 使用sp_dropdevice刪除備份設備
sp_dropdevice [@logicalname = ] 'device' [, [@delfile = ] 'delfile']

@logicalname:表示備份設備邏輯名
@delfile:表示相對應的實體文件

當執行該存儲過程時,@delfile選項值必須給出,否則實體文件依舊存在

7.4.3 備份數據庫

  1. 使用T-SQL語句備份數據庫
    1. 完整備份和差異備份
    BACKUP DATABASE { database_name | @database_name_var }
    TO <backup_device> [,...n]
    [ WITH {Differential | <general_WITH_options> [,...n]}][;]
    
    1. 事務日誌備份
    BACKUP LOG { database_name | @database_name_var }
    TO <backup_device> [,...n]
    [ WITH <general_WITH_options> ][;]
    
    1. 文件和文件組備份
    BACKUP DATABASE { database_name | @database_name_var }
    <file_or_filegroup>[,...n]
    TO <backup_device> [,...n]
    [ WITH {Differential | <general_WITH_options> [,...n]}][;]
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章