熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server觸發器創建、刪除、修改、查看

2022-06-13   來源: SQL Server 

  觸發器是一種特殊的存儲過程它不能被顯式地調用而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活所以觸發器可以用來實現對表實施復雜的完整性約束

  SQL Server為每個觸發器都創建了兩個專用表Inserted表和Deleted表這兩個表由系統來維護它們存在於內存中而不是在數據庫中這兩個表的結構總是與被該觸發器作用的表的結構相同觸發器執行 完成後與該觸發器相關的這兩個表也被刪除

  Deleted表存放由於執行Delete或Update語句而要從表中刪除的所有行

  Inserted表存放由於執行Insert或Update語句而要向表中插入的所有行

  Instead of 和 After觸發器

  SQL Server提供了兩種觸發器Instead of 和After 觸發器這兩種觸發器的差別在於他們被激活的同

  Instead of觸發器用於替代引起觸發器執行的TSQL語句除表之外Instead of 觸發器也可以用於視圖用來擴展視圖可以支持的更新操作

  After觸發器在一個InsertUpdate或Deleted語句之後執行進行約束檢查等動作都在After觸發器被激活之前發生After觸發器只能用於表

  一個表或視圖的每一個修改動作(insertupdate和delete)都可以有一個instead of 觸發器一個表的每個修改動作都可以有多個After觸發器

  觸發器的執行過程

  如果一個Insert﹑update或者delete語句違反了約束那幺After觸發器不會執行因為對約束的檢查是在After觸發器被激動之前發生的所以After觸發器不能超越約束

  Instead of 觸發器可以取代激發它的操作來執行它在Inserted表和Deleted表剛剛建立其它任何操作還沒有發生時被執行因為Instead of 觸發器在約束之前執行所以它可以對約束進行一些預處理

  使用TSQL語句來創建觸發器

  基本語句如下

  create trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert updatedelete ]

  as

  sql_statement

  刪除觸發器

  基本語句如下

  drop trigger trigger_name

  查看數據庫中已有觸發器

   查看數據庫已有觸發器

  use jxcSoftware

  go

  select * from sysobjects where xtype=TR

   查看單個觸發器

  exec sp_helptext 觸發器名

  修改觸發器

  基本語句如下

  alter trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert updatedelete ]

  as

  sql_statement

  相關示例

  在Orders表中建立觸發器當向Orders表中插入一條訂單記錄時檢查goods表的貨品狀態status是否為(正在整理)則不能往Orders表加入該訂單

  create trigger orderinsert

  on orders

  after insert

  as

  if (select status from goodsinserted

  where goodsname=insertedgoodsname)=

  begin

  print the goods is being processed

  print the order cannot be committed

  rollback transaction 回滾避免加入

  end

  在Orders表建立一個插入觸發器在添加一條訂單時減少Goods表相應的貨品記錄中的庫存

  create trigger orderinsert

  on orders

  after insert

  as

  update goods set storage=storageinsertedquantity

  from goodsinserted

  where

  goodsname=insertedgoodsname

  在Goods表建立刪除觸發器實現Goods表和Orders表的級聯刪除

  create trigger goodsdelete

  on goods

  after delete

  as

  delete from orders

  where goodsname in

  (select name from deleted)

  在Orders表建立一個更新觸發器監視Orders表的訂單日期(OrderDate)列使其不能手工修改

  create trigger orderdateupdate

  on orders

  after update

  as

  if update(orderdate)

  begin

  raiserror( orderdate cannot be modified)

  rollback transaction

  end

  在Orders表建立一個插入觸發器保證向Orders表插入的貨品名必須要在Goods表中一定存在

  create trigger orderinsert

  on orders

  after insert

  as

  if (select count(*) from goodsinserted where goodsname=insertedgoodsname)=

  begin

  print no entry in goods for this order

  rollback transaction

  end

  Orders表建立一個插入觸發器保證向Orders表插入的貨品信息要在Order表中添加

  alter trigger addOrder

  on Orders

  for insert

  as

  insert into Order

  select insertedId insertedgoodNameinsertedNumber from inserted


From:http://tw.wingwit.com/Article/program/SQLServer/201311/22002.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.