日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁西西教程數(shù)據(jù)庫教程 → SQl 2008 觸發(fā)器創(chuàng)建使用代碼分享

      SQl 2008 觸發(fā)器創(chuàng)建使用代碼分享

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/1/11 8:50:42字體大。A-A+

      作者:然嗄點(diǎn)擊:0次評(píng)論:0次標(biāo)簽: SQl2008

      • 類型:翻譯工具大。4.4M語言:多國語言[中文] 評(píng)分:8.1
      • 標(biāo)簽:
      立即下載

      當(dāng)我們想更新一張動(dòng)態(tài)表的時(shí)候(即:表中的數(shù)據(jù)不斷的添加),也許我們會(huì)用數(shù)據(jù)庫代理,通過寫作業(yè),然后讓他定時(shí)查詢動(dòng)態(tài)表中最新添加的數(shù)據(jù),然后更新數(shù)據(jù)。這樣時(shí)能實(shí)現(xiàn)更新數(shù)據(jù)的要求,但是數(shù)據(jù)卻不能實(shí)時(shí)同步更新。
      這個(gè)時(shí)候,觸發(fā)器就是我們想要的神器了。我們可以在那張動(dòng)態(tài)表上新建觸發(fā)器。觸發(fā)器的實(shí)質(zhì)就是個(gè)存儲(chǔ)過程,只不過他調(diào)用的時(shí)間是根據(jù)所建的動(dòng)態(tài)表發(fā)生該表而執(zhí)行(即:Insert新數(shù)據(jù),Update或者Delete數(shù)據(jù))。
      具體怎么使用觸發(fā)器,今天我這里就不介紹了,園子里資料多的很。那么我今天要介紹的是什么呢?
      前幾天在寫sql代碼的時(shí)候無意間發(fā)現(xiàn)了這么個(gè)問題:就是我一直以為每當(dāng)動(dòng)態(tài)表中插入一條數(shù)據(jù),觸發(fā)器就執(zhí)行一次,但是我這樣理解的話,當(dāng)批量插入數(shù)據(jù)的時(shí)候,觸發(fā)器執(zhí)行的次數(shù)和插入的行數(shù)相同,但是事實(shí)不是這樣。乘著今天有點(diǎn)時(shí)間,就想寫出來和大家分享下,講的不對(duì)請大家斧正!
        下面,我就寫了個(gè)簡單的例子供大家參考。

      --我們要建觸發(fā)器的動(dòng)態(tài)表
      Create table Table_a
      (
      ID int identity(1,1),--自增ID
      Content nvarchar(50),
      UpdateIDForTrigger int
      )
      

      然后我們在該表上創(chuàng)建一個(gè)觸發(fā)器

      Create TRIGGER [dbo].[Table_a_Ins]
      ON [dbo].[Table_a]
      AFTER INSERT
      AS
          BEGIN
              declare @ID int
              set @ID=(select ID from inserted)
              --更新Table_a表中的UpdateIDForTrigger字段的值,為了能更明顯的看出實(shí)時(shí)執(zhí)行的效果
              UPDATE Table_a
              SET UpdateIDForTrigger = (@ID+10)--為了能看出不同,就直接將比ID大10的值作為變量賦值
              WHERE ID = @ID;
          END

      接下來,我們按照普通一條條的插入結(jié)果測試下:

      --給信息表添加數(shù)據(jù)
      insert into Table_a(Content) values('信息一');
      insert into Table_a(Content) values('信息二');

      然后查詢下現(xiàn)在動(dòng)態(tài)表中的數(shù)據(jù)情況

      select * from Table_a

      查詢結(jié)果如圖:

       

      我們可以看到觸發(fā)器執(zhí)行了。在每條數(shù)據(jù)插入的時(shí)候觸發(fā)器同時(shí)執(zhí)行了Update功能。
      然后,我們要批量插入數(shù)據(jù),為了方便我們插入,我們這里建立一張臨時(shí)的基本信息表:

      --基本信息表
      Create table Table_Info
      (
          ID int identity(1,1), 
          Content nvarchar(50)
      )

      然后插入數(shù)據(jù)

      insert into Table_Info(Content) values('信息三');
      insert into Table_Info(Content) values('信息四');
      insert into Table_Info(Content) values('信息五');
      insert into Table_Info(Content) values('信息六');
      insert into Table_Info(Content) values('信息七');
      insert into Table_Info(Content) values('信息八');
      insert into Table_Info(Content) values('信息九');
      insert into Table_Info(Content) values('信息十');

      然后我們就可以批量插入數(shù)據(jù)到動(dòng)態(tài)表中了

      insert into Table_a(Content)
      select Content from Table_Info

      這次重點(diǎn)來了,我們在執(zhí)行這個(gè)sql語句的時(shí)候消息框中會(huì)出現(xiàn)錯(cuò)誤提示:

      有經(jīng)驗(yàn)的朋友會(huì)知道,這個(gè)錯(cuò)誤是由于多個(gè)結(jié)果用“=”賦值給一個(gè)變量導(dǎo)致的。
      即:set @變量=(select 多行結(jié)果 from Table)
      這個(gè)時(shí)候,我就疑惑了,問題出在哪里了呢?不是觸發(fā)器在每插一條數(shù)據(jù)的時(shí)候執(zhí)行一次么?
      于是,我將觸發(fā)器改了下:

      Alter TRIGGER [dbo].[Table_a_Ins]
      ON [dbo].[Table_a]
      AFTER INSERT
      AS
          BEGIN
              select ID from inserted;
          END

      然后再執(zhí)行上面的批量插入試試看,看看他inserted表中到底存的是什么值:
      果然不出所料,inserted表中的結(jié)果并不是一條數(shù)據(jù):


      知道錯(cuò)誤的原因,我們操作起來就簡單了,我們可以給inserted表建游標(biāo),然后通過游標(biāo)來對(duì)批量插入的每行數(shù)據(jù)進(jìn)行編輯。下面是我們修改后的觸發(fā)器代碼:

      Alter TRIGGER [dbo].[Table_a_Ins]
      ON [dbo].[Table_a]
          AFTER INSERT
          AS
              BEGIN
                  declare @ID int
                  declare cur_Insert cursor 
                  for 
                      select ID from inserted
                  open cur_Insert
                  fetch next from cur_Insert into @ID
                  while @@fetch_status=0
                      begin
                          UPDATE Table_a
                          SET UpdateIDForTrigger = (@ID+10)--為了能看出不同,就直接將比ID大10的值作為變量賦值
                          WHERE ID = @ID;
                          fetch next from cur_Insert into @ID
                      end
                  close cur_Insert
                  deallocate cur_Insert
              END

      然后,我們再按照上面的批量插入數(shù)據(jù),然后查詢下動(dòng)態(tài)表中的結(jié)果:

      insert into Table_a(Content)
      select Content from Table_Info;
      
      select * from Table_a;

      此時(shí)運(yùn)行沒有錯(cuò)誤提示了,運(yùn)行結(jié)果如下:

      這樣,批量插入插入數(shù)據(jù)時(shí)觸發(fā)器也能用了。
      總結(jié)下:觸發(fā)器運(yùn)行是每次執(zhí)行一次Insert操作或者是Update,Delete等操作的時(shí)候才執(zhí)行的。它的對(duì)象不是針對(duì)于修改的行數(shù)(即:每行修改的時(shí)候執(zhí)行)。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)