SQL SERVER 觸發器-改成成行級觸發功能

來源:互聯網
上載者:User

標籤:

       近期第一次用SQL SERVER寫觸發器,發現SQL與ORACLE的觸發器還是有區別的,最大區別:

       (1)SQL只有語句級觸發,沒有行級觸發;

       (2)ORACLE有語句級觸發和行級觸發;

 

       由於SQL沒有行級觸發,因此單獨使用語句級來編寫觸發器會出現問題。為通俗易懂,舉個例子:用SQL編寫一個update觸發器,在update資料時觸發,若用以下語句

 SET @OldMes = ( SELECT  rhtype FROM  deleted )                       SET @UpdateMes = ( SELECT  rhtype  FROM  INSERTED)                                  

      在單獨一條一條資料進行更新時不會報錯,但在批次更新時就會報錯,因為SQL執行資料庫觸發器是按語句級來執行,上述SQL語句就相當於把一張表賦值給一個變數,若是單條資料更新,則表裡只有一條資料,是不會報錯的,但在多條時就會報錯。

     因此,如何在只有語句級觸發的SQL中實現行級觸發?我使用的方法是整張表觸發,即在update時無論是多條資料更新,還是單條資料更新,都將更新的資料放在一張表裡,然後將表裡的資料依次放在一個變數裡,如:

 IF UPDATE(address)                         SELECT  @Mesg = ‘‘ + @Mesg + ‘居住地址:‘                                + LTRIM(ISNULL(b.ADDRESS, ‘‘)) + ‘,更新後:‘                                + LTRIM(ISNULL(a.address, ‘‘)) + ‘;‘                        FROM    INSERTED a                                INNER JOIN DELETED b ON a.healthno = b.healthno                        WHERE   ISNULL(a.address, ‘‘) <> ISNULL(b.address, ‘‘)--@Mesg是聲明的變數

     但是,要注意:

      (1)上述SQL中ISNULL一定要有,因為SQL查詢中若遇到null,則select出來的是空的,什麼都沒有,加上ISNULL(a.address, ‘‘)意思就是若a.address是null,則取後面的‘‘,否則則取a.address的值:;

    (2) IF UPDATE(address)這條語句一定要有,不然的話若加了insert觸發,則在資料插入時也會執行這條觸發語句。

SQL SERVER 觸發器-改成成行級觸發功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.