SQL Server 觸發器

觸發器是一種特殊類型的存儲過程,它不一樣於以前的咱們介紹的存儲過程。觸發器主要是經過事件進行觸發被自動調用執行的。而存儲過程能夠經過存儲過程的名稱被調用。html

Ø 什麼是觸發器數據庫

    觸發器對錶進行插入、更新、刪除的時候會自動執行的特殊存儲過程。觸發器通常用在check約束更加複雜的約束上面。觸發器和普通的存儲過程的區別是:觸發器是當對某一個表進行操做。諸如:update、insert、delete這些操做的時候,系統會自動調用執行該表上對應的觸發器。SQL Server 2005中觸發器能夠分爲兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。測試

 

    DML觸發器分爲:加密

    一、 after觸發器(以後觸發)spa

        a、 insert觸發器日誌

        b、 update觸發器code

        c、 delete觸發器htm

 

    二、 instead of 觸發器 (以前觸發)blog

 

    其中after觸發器要求只有執行某一操做insert、update、delete以後觸發器才被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己。既能夠在表上定義instead of觸發器,也能夠在視圖上定義。事件

 

    觸發器有兩個特殊的表:插入表(inserted表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在內存中建立者兩張表,不會存儲在數據庫中。並且兩張表的都是隻讀的,只能讀取數據而不能修改數據。這兩張表的結果老是與被改觸發器應用的表的結構相同。當觸發器完成工做後,這兩張表就會被刪除。Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。

 

對錶的操做

Inserted邏輯表

Deleted邏輯表

增長記錄(insert)

存放增長的記錄

刪除記錄(delete)

存放被刪除的記錄

修改記錄(update)

存放更新後的記錄

存放更新前的記錄

    Update數據的時候就是先刪除表記錄,而後增長一條記錄。這樣在inserted和deleted表就都有update後的數據記錄了。注意的是:觸發器自己就是一個事務,因此在觸發器裏面能夠對修改數據進行一些特殊的檢查。若是不知足能夠利用事務回滾,撤銷操做。

 

Ø 建立觸發器

    語法

  tgr_name
 table_name
 encrypion –加密觸發器
     ...

    Transact-SQL


    # 建立insert類型觸發器

--建立insert插入類型觸發器
 (object_id(, )   )
      tgr_classes_insert

  tgr_classes_insert
 classes
     insert --插入觸發

    --定義變量
     @id , @name (20), @temp ;
    --在inserted表中查詢已經插入記錄信息
     @id = id, @name = name  inserted;
     @name = @name + (, @id);
     @temp = @id / 2;    
    insert  student (@name, 18 + @id, @temp, @id);
     ;

--插入數據
insert  classes (, getDate());
--查詢數據
 *  classes;
 *  student   id;

     insert觸發器,會在inserted表中添加一條剛插入的記錄。

 

    # 建立delete類型觸發器

--delete刪除類型觸發器
 (object_id(, )   )
      tgr_classes_delete

  tgr_classes_delete
 classes
      --刪除觸發

     ;    
     (object_id(, )   )
        --存在classesBackup,直接插入數據
        insert  classesBackup  name, createDate  deleted;
    
        --不存在classesBackup建立再插入
         *  classesBackup  deleted;
     ;



-- nocount ;
 classes  name = ;
--查詢數據
 *  classes;
 *  classesBackup;

   delete觸發器會在刪除數據的時候,將剛纔刪除的數據保存在deleted表中。

 

    # 建立update類型觸發器

--update更新類型觸發器
 (object_id(, )   )
      tgr_classes_update

  tgr_classes_update
 classes
     

     @oldName (20), @newName (20);
    --更新前的數據
     @oldName = name  deleted;
     ( ( *  student  name  + @oldName + ))
        
            --更新後的數據
             @newName = name  inserted;
             student  name = replace(name, @oldName, @newName)  name  + @oldName + ;
             ;
        
    
         ;

--查詢數據
 *  student   id;
 *  classes;
 classes  name =   name = ;

     update觸發器會在更新數據後,將更新前的數據保存在deleted表中,更新後的數據保存在inserted表中。

 

    # update更新列級觸發器

 (object_id(, )   )
      tgr_classes_update_column

  tgr_classes_update_column
 classes
     

    --列級觸發器:是否更新了班級建立時間
     ((createDate))
    
        (, 16, 11);
         ;
    

--測試
 *  student   id;
 *  classes;
 classes  createDate = getDate()  id = 3;
 classes  name =   id = 7;

     更新列級觸發器能夠用update是否判斷更新列記錄;

 

    # instead of類型觸發器

       instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己的內容。

       建立語法

  tgr_name
 table_name
 encryption
    instead  ...

    T-SQL

   

      # 建立instead of觸發器

 (object_id(, )   )
      tgr_classes_inteadOf

  tgr_classes_inteadOf
 classes
    instead  

     @id , @name (20);
    --查詢被刪除的信息,病賦值
     @id = id, @name = name  deleted;
      + (, @id) +  + @name;
    --先刪除student的信息
     student  cid = @id;
    --再刪除classes的信息
     classes  id = @id;
      + (, @id) +  + @name + ;

--test
 *  student   id;
 *  classes;
 classes  id = 7;

   

      # 顯示自定義消息raiserror

 (object_id(, )   )
      tgr_message

  tgr_message
 student
     insert, 
 (, 16, 10);

--test
insert  student (, 22, 1, 7);
 student  sex = 0  name = ;
 *  student   id;


    # 修改觸發器

  tgr_message
 student
 
 (, 16, 10);

--test
  student  name = ;


    # 啓用、禁用觸發器

--禁用觸發器
disable  tgr_message  student;
--啓用觸發器
enable  tgr_message  student;


    # 查詢建立的觸發器信息

--查詢已存在的觸發器
 *  sys.triggers;
 *  sys.objects  type = ;

--查看觸發器觸發事件
 te.*  sys.trigger_events te  sys.triggers t
 t.object_id = te.object_id
 t.parent_class = 0  t.name = ;

--查看建立觸發器語句
 sp_helptext ;


    # 示例,驗證插入數據

 ((object_id(, )   ))
      tgr_valid_data

  tgr_valid_data
 student
 insert

     @age ,
            @name (20);
     @name = s.name, @age = s.age  inserted s;
     (@age < 18)
    
        (, 16, 1);
         ;
    

--test
insert  student (, 2, 0, 7);
insert  student (, 22, 0, 7);
 *  student   id;


    # 示例,操做日誌

 (object_id(, )   )
      log

  log(
    id  (1, 1)  ,
     (20),
    createDate datetime  getDate()
)

 ( ( *  sys.objects  name = ))
      tgr_student_log

  tgr_student_log
 student
 insert, , 

     (( ( 1  inserted))  ( ( 1  deleted)))
    
        insert  log() ();
    
      ( ( 1  inserted)    ( 1  deleted))
    
        insert  log() ();
    
      (  ( 1  inserted)   ( 1  deleted))
    
        insert  log() ();
    

--test
insert  student (, 22, 1, 7);
 student  sex = 0  name = ;
 student  name = ;
 *  log;
 *  student   id;



版權全部,轉載請註明出處 本文出自: http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html

相關文章
相關標籤/搜索