好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > SQL Server:觸發(fā)器實例詳解

SQL Server:觸發(fā)器實例詳解

熱門標簽:電話機器人怎么代理商 400電話辦理泰安 電銷需要外呼系統(tǒng)嗎 千呼電話機器人可以試用嗎 安卡拉地圖標注app 零成本地圖標注賺錢 家庭農(nóng)場地圖標注名稱怎樣起名 我要地圖標注數(shù)量有限制嗎 互聯(lián)網(wǎng)電話外呼系統(tǒng)

1. 概述

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

2. 觸發(fā)器的分類

SQL Server2000提供了兩種觸發(fā)器:“Instead of” 和“After” 觸發(fā)器。

一個表或視圖的每一個修改動作(Insert、Update和Delete)都可以有一個“Instead of” 觸發(fā)器,一個表的每個修改動作都可以有多個“After”觸發(fā)器。

2.1 “Instead of”觸發(fā)器

  • “Instead of”觸發(fā)器在執(zhí)行真正“插入”之前被執(zhí)行。除表之外,“Instead of” 觸發(fā)器也可以用于視圖,用來擴展視圖可以支持的更新操作。
  • “Instead of”觸發(fā)器會替代所要執(zhí)行的SQL語句,言下之意就是所要執(zhí)行SQL并不會“真正執(zhí)行”
alter trigger trigger_學生_Delete

on 學生

instead of Delete

as

begin

  select 學號, 姓名 from deleted

end

delete from 學生 where 學號 = 4 

上例中定義了“trigger學生_Delete”觸發(fā)器,該觸發(fā)器從“delete”表中打印出所要刪除的學生.在執(zhí)行“delete”操作后,會發(fā)現(xiàn)“學號 = 4”的學生并未被刪除, 原因在于“trigger學生Delete”替代了所要執(zhí)行的“delete from 學生 where 學號 = 4”語句,而在“trigger學生_Delete”中并未真正刪除學生。

2.2 “After”觸發(fā)器

  • “After”觸發(fā)器在Insert、Update或Deleted語句執(zhí)行之后被觸發(fā)。“After”觸發(fā)器只能用于表。
  • “After”觸發(fā)器主要用于表在修改后(insert、update或delete操作之后),來修改其他表

3. Inserted和Deleted表

SQL Server為每個觸發(fā)器都創(chuàng)建了兩個專用表:Inserted表和Deleted表。

  • 這兩個表由系統(tǒng)來維護,它們存在于內(nèi)存中而不是在數(shù)據(jù)庫中,可以理解為一個虛擬的表。
  • 這兩個表的結(jié)構(gòu)總是與被該觸發(fā)器作用的表的結(jié)構(gòu)相同。
  • 觸發(fā)器執(zhí)行完成后,與該觸發(fā)器相關(guān)的這兩個表也被刪除。
  • Deleted表存放由于執(zhí)行Delete或Update語句而要從表中刪除的所有行。
  • Inserted表存放由于執(zhí)行Insert或Update語句而要向表中插入的所有行。

對表的操作 Inserted邏輯表 Deleted邏輯表
增加記錄(insert) 存放增加的記錄
刪除記錄(delete) 存放被刪除的記錄
修改記錄(update) 存放更新后的記錄 存放更新前的記錄

4. 觸發(fā)器的執(zhí)行過程

  • 如果一個Insert﹑update或者delete語句違反了約束,那么這條SQL語句就沒有執(zhí)行成功,因此“After”觸發(fā)器也不會被激活。
  • “Instead of” 觸發(fā)器可以取代激發(fā)它的操作來執(zhí)行。它在Inserted表和Deleted表剛剛建立,其它任何操作還沒有發(fā)生時被執(zhí)行。因為“Instead of” 觸發(fā)器在約束之前執(zhí)行,所以它可以對約束進行一些預處理。

5. 創(chuàng)建觸發(fā)器

create trigger trigger_name

on {table_name|view_name}

{After|Instead of} {insert|update|delete}

as 相應(yīng)T-SQL語句

6. 修改觸發(fā)器:

alter trigger trigger_name

on {table_name|view_name}

{After|Instead of} {insert|update|delete}

as 相應(yīng)T-SQL語句

7. 刪除觸發(fā)器:

drop trigger trigger_name

8. 查看數(shù)據(jù)庫中已有觸發(fā)器:

8.1 查看數(shù)據(jù)庫中所有觸發(fā)器

select * from sysobjects where xtype='TR'

8.2 查看單個觸發(fā)器

exec sp_helptext '觸發(fā)器名'

9. “Instead of”相關(guān)示例:

兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)

實現(xiàn)功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除

alter trigger trigger_學生_Delete

on 學生

instead of Delete

as

begin

  if not exists(select * from 借書記錄, deleted where 借書記錄.學號 = deleted.學號)

    delete from 學生 where 學生.學號 in (select 學號 from deleted)

end

10. “After”觸發(fā)器

10.1 在“訂單”表中建立觸發(fā)器,當向“訂單”表中插入一條訂單記錄時,檢查“商品”表的貨品狀態(tài)“狀態(tài)”是否為1(正在整理),則不能往“訂單”表加入該訂單。

create trigger trigger_訂單_insert

on 訂單

after insert

as

  if (select 狀態(tài) from 商品, inserted where 商品.pid = inserted.pid)=1

  begin

    print 'the goods is being processed'

    print 'the order cannot be committed'

    rollback transaction --回滾,避免加入

  end

  • 該示例中“pid”為商品編碼
  • 該示例的if判斷嚴格來講是不準確的,因為“訂單”表如果每次插入一條記錄,該判斷沒有問題;如果一次插入多條記錄,則“select 狀態(tài)”返回的是多行。

10.2 在“訂單”表建立一個插入觸發(fā)器,在添加一條訂單時,減少“商品”表相應(yīng)的貨品記錄中的庫存。

create trigger trigger_訂單_insert2

on 訂單

after insert

as

  update 商品 set 數(shù)量 = 數(shù)量 - inserted.數(shù)量

  from 商品, inserted

  where 商品.pid = inserted.pid

10.3 在“商品”表建立刪除觸發(fā)器,實現(xiàn)“商品”表和“訂單”表的級聯(lián)刪除。

create trigger goodsdelete trigger_商品_delete

on 商品

after delete

as

  delete from 訂單 where 訂單.pid in (select pid from deleted)

10.4 在“訂單”表建立一個更新觸發(fā)器,監(jiān)視“訂單”表的“訂單日期”列,使其不能被“update”.

create trigger trigger_訂單_update

on 訂單

after update

as

  if update(訂單日期)

  begin

    raiserror('訂單日期不能手動修改',10,1)

    rollback transaction

  end

10.5 在“訂單”表建立一個插入觸發(fā)器,保證向“訂單”表插入的貨品必須要在“商品”表中一定存在。

create trigger trigger_訂單_insert3

on 訂單

after insert

as

  if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0

  begin

    print '商品不存在'

    rollback transaction

  end

10.6 “訂單”表建立一個插入觸發(fā)器,保證向“訂單”表插入的貨品信息要在“訂單日志”表中添加

alter trigger trigger_訂單_insert

on 訂單

for insert

as

insert into 訂單日志 select inserted.Id, inserted.pid,inserted.數(shù)量 from inserted 

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 關(guān)于喜憂參半的SQL Server觸發(fā)器詳解
  • 利用SQL Server觸發(fā)器實現(xiàn)表的歷史修改痕跡記錄
  • SQLSERVER對加密的存儲過程、視圖、觸發(fā)器進行解密(推薦)
  • SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件步驟詳解
  • SQL Server實現(xiàn)用觸發(fā)器捕獲DML操作的會話信息【實例】
  • SqlServer觸發(fā)器詳解
  • SqlServer實現(xiàn)類似Oracle的before觸發(fā)器示例
  • SQL SERVER中各類觸發(fā)器的完整語法及參數(shù)說明
  • SQL SERVER 觸發(fā)器介紹
  • SQL Server誤區(qū)30日談 第4天 DDL觸發(fā)器就是INSTEAD OF觸發(fā)器
  • SQL Server 觸發(fā)器詳情

標簽:池州 大同 黃山 濱州 文山 新鄉(xiāng) 東營 來賓

巨人網(wǎng)絡(luò)通訊聲明:本文標題《SQL Server:觸發(fā)器實例詳解》,本文關(guān)鍵詞  SQL,Server,觸發(fā)器,實例,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server:觸發(fā)器實例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL Server:觸發(fā)器實例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 曰皮全部过程免费视频| 绝对浪荡电影| 揉捏穆桂英双乳三级潘金莲| 十大色情禁片未删减版百度云| 无码国产伦一区二区三区视频| 毛片在线看免费版| 性开放A片免费看| 免费永久看黄在线观看app| 国产一级做a爰大片免费久久| 中字无码亚洲电影| 几个男人狂躁一个女人| 一级毛片a| 欧美成人精品手机在线观看| 亚洲欧美成人久久一区| 艳mu之乱婬荡合集小说在线阅读| 天天5G天天5g爽入口网址| 第九色激情| 日批app| 中国丰满女人特级A片| 国产在线视频区| 日韩在线三级| 含羞草免费观看电视剧的背景故事 | 国产精品人人做人人爽人人添| 天天狂躁夜夜躁av天天爽色欲小说 | 在线播放亚洲精品富二代91| 影音中文av久久人妻一区| 野花免费在线播放| 中文字幕日韩欧美| 男男play| 日本AAAA片毛片免费观蜜桃| 男女差差| Sao虎在线视频免费观看 | 国产91精品一区二区| 大胸无遮挡| 成人无码18??在线观看| 大蕉久久伊人中文字幕| 放荡老师好紧| 含着闺蜜的花蒂啃咬高潮| 国色精品VA在线观看免费视频| 欧美顶级黃色大片免费| 裙子里面是野兽hd免费看|