前段時間需要用觸發器做個實現資料插入表時自動編號的功能,於是再學習下觸發器,硬體備份共享於此,以供討論,以免遺忘。
總結常用基本點如下:
1、觸發器有兩種型別:資料定義語言觸發器(ddl觸發器)和資料操縱語言觸發器(dml觸發器)。
ddl觸發器:在使用者對資料庫執行資料定義(create、alter、drop或相似的語句)對資料庫結構進行修改時啟用而做出響應。
dml觸發器:在使用者對資料庫執行資料操作時發生,觸發器中的**會被自動呼叫。
2、dml觸發器分類:insert觸發器、delete觸發器、update觸發器、上面任意型別混合。
3、觸發器建立語法:
createtrigger
<
trigger name>
on<
table
orview
>
<
[insert][
,][update
],[delete
]>}|instean of}as
4、觸發器必須附加到表或檢視上,觸發器不能單獨存在。after或for觸發器不支援檢視,instead of支援表或檢視。
5、insert觸發器中,sql server 會建立乙個插入行的副本,並把該副本插入到乙個特殊表insert表中,該錶只在觸發器作用域內存在。
6、delete觸發器中,sql server 會建立乙個刪除行的副本,並把該副本插入到乙個特殊表delete表中,該錶只在觸發器作用域內存在。
7、update觸發器中,sql server認為更新的記錄是刪除了現有的記錄,插入更新後的新紀錄,所以update觸發器中包含insert和delete兩個特殊表,也是只存在觸發器作用域內,這兩個表的行數完全一樣。
8、觸發器盡可能簡短,因為觸發器和觸發器內的語句被一同處理,即直到語句執行完成才算是觸發器完成。如果**很長那觸發器執行時間就會很長。
下面是個實現自動編號功能的例子:
--有兩張表,客戶表和專案表,要求:新建專案時自動生成專案編號,每個不同的客戶的專案的編號從1開始
--專案編號格式為pj+"-"+"客戶編號"+"-"+"日期"+"-"+"流水號"
--如專案編號:pj-abcd-120805-0001
create
table testaccount --
建立測試客戶表
( taccname
nvarchar(100), --
客戶姓名
taccid nvarchar(32) --
客戶編號
)create
table testproject --
建立測試專案表
( tproname
nvarchar(100), --
專案名稱
tproid nvarchar(32), --
專案編號
tidacc nvarchar(100), --
客戶編號
tproguid nvarchar(64) --
guid)go
create
trigger
t_autonumber
ontestproject
after
insert
asbegin
declare
@one
nvarchar(8), --
編號第一部分,pj
@two
nvarchar(32), --
編號第二部分,客戶編號
@three
nvarchar(8), --
編號第三部分,日期
@four
int, --
編號第四部分,流水號
@guid
nvarchar(64) --
guid
set@one='
pj'set@three
=convert( varchar(8),getdate(),112
)
--從inserted副本表裡獲取當前插入資料的客戶編碼和guid
select
@two
=tidacc,@guid
=tproguid from
inserted
--獲取編號最後四位
select
@four
=max(cast(right(tproid,4)as
int))
from
testproject
where tidacc=
@two
--對每乙個新客戶的流水號都是從1開始,已存在客戶為最大流水號加1
if@four
isnull
set@four=0
else
set@four
=cast(@four
asint
)
set@four
=@four+1
update testproject set tproid=
@one+'
-'+@two+'
-'+@three+'
-'+right('
0000'+
cast(@four
asvarchar),4) where tproguid=
@guid
endgo
--生成測試表資料
insert
into testaccount values ('
小小鴨****
','xxygs')
insert
into testaccount values ('
醜小鴨****
','cxy')
insert
into testproject (tproname,tidacc,tproguid)values ('
小鴨成長專案
','xxygs
',newid
())insert
into testproject (tproname,tidacc,tproguid)values ('
小鴨學游泳專案
','xxygs
',newid
())insert
into testproject (tproname,tidacc,tproguid)values ('
醜小鴨成長專案
','cxy
',newid
())select
*from
testproject
drop
table
testaccount
drop
table testproject
9.除錯觸發器:新建查詢視窗,輸入下來**,按下f11即可逐語句執行下列指令碼,進入到觸發器中。也可在觸發器裡設定斷點,然後按f11逐語句執行。
begintran
insert
into testproject (tproname,tidacc,tproguid)values ('
小鴨成長專案
','xxygs
',newid
())
insert
into testproject (tproname,tidacc,tproguid)values ('
小鴨學游泳專案
','xxygs
',newid
())
insert
into testproject (tproname,tidacc,tproguid)values ('
醜小鴨成長專案
','cxy
',newid
())
if@@trancount
>
0rollback
tran
利用觸發器生成編號
原貼 http munity.csdn.expert topic 4294 4294910.xml?temp 3575403 有一表 id,product id,product name 其中id是自動編號,當向這錶新增資料時候,product id自動新增資料,格式是 wpbh max id 1,...
觸發器維護已經用編號 未用編號
table1為初始化資料,table2為已用票據 在table2上寫觸發器,table2每insert,update,or 批量delete時,實時體現tabel1的 已用票號 已用票數 結餘票號 結餘票數 的值.示例 示例資料 create table table1 序號 int,類別 varch...
觸發器 trigger 日期 流水 編號
create table tb colid int identity,status int,id nvarchar 14 gocreate trigger test on tb for insert,update asbegin if update status begin declare stat...