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

2022-04-04 12:51:27 字數 1228 閱讀 1467

近期第一次用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觸發,則在資料插入時也會執行這條觸發語句。

sqlserver觸發器複習

create table a a1 int,a2 int create table b b1 int,b2 int insert into a values 1,0 insert into b values 1,0 create trigger tri update a2 a on a for up...

SQL server 之 觸發器

今天對觸發器研究了一下,之前的學習感覺挺朦朧的,今天鼓搗了一天,算是有了一點點了解,把學習的體會記錄了下來。常見的觸發器 觸發器的作用 自動化操作,減少了手動操作以及出錯的機率 現實工作中用的比較少,因為想讓他執行起來效率高很難 一 dml觸發器 insert delete update 不支援se...

SQLSERVER的觸發器

觸發器的定義 觸發器是一種特殊型別的儲存過程,他不同於前面介紹過的一般的儲存過程 在sql內部把觸發器看做是儲存過程但是不能傳遞引數 一般的儲存過程通過儲存過程名稱被直接呼叫,而觸發器主要是通過事件進行觸發而被執行.總的來說,觸發器是一種功能強大的工具,在表中資料發生變化時自動強制執行,觸發器還可以...