日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sqlserver触发器Tigger使用及示例

發布時間:2023/12/14 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlserver触发器Tigger使用及示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:觸發器的優點
1.觸發器是自動的。當對表中的數據做了任何修改之后立即被激活。
2.觸發器可以通過數據庫中的相關表進行層疊修改。
3.觸發器可以強制限制。這些限制比用CHECK約束所定義的更復雜。與CHECK約束不同的是,觸發器可以引用其他表中的列。
二:觸發器的作用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜參照完整性和數據的一致性,它能夠對數據庫中的相關表進行級聯修改,提高比CHECK約束更復雜的的數據完整性,并自定義錯誤消息。觸發器的主要作用主要有以下接個方面:
1. 強制數據庫間的引用完整性
2. 級聯修改數據庫中所有相關的表,自動觸發其它與之相關的操作
3. 跟蹤變化,撤銷或回滾違法操作,防止非法修改數據
4. 返回自定義的錯誤消息,約束無法返回信息,而觸發器可以
5. 觸發器可以調用更多的存儲過程

三:觸發器的分類
SqlServer包括三種常規類型的觸發器:DML觸發器、DDL觸發器和登錄觸發器。
1.DML(數據操作語言,Data Manipulation Language)觸發器
DML觸發器是一些附加在特定表或視圖上的操作代碼,當數據庫服務器中發生數據操作語言事件時執行這些操作。SqlServer中的DML觸發器有三種:
1. insert觸發器:向表中插入數據時被觸發;
2. delete觸發器:從表中刪除數據時被觸發;
3. update觸發器:修改表中數據時被觸發。
當遇到下列情形時,應考慮使用DML觸發器:
1. 通過數據庫中的相關表實現級聯更改
2. 防止惡意或者錯誤的insert、update和delete操作,并強制執行check約束定義的限制更為復雜的其他限制。
3. 評估數據修改前后表的狀態,并根據該差異才去措施。
2.DDL(數據定義語言,Data Definition Language)觸發器
DDL觸發器是當服務器或者數據庫中發生數據定義語言(主要是以create,drop,alter開頭的語句)事件時被激活使用,使用DDL觸發器可以防止對數據架構進行的某些更改或記錄數據中的更改或事件操作。
3.登錄觸發器
登錄觸發器將為響應 LOGIN 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之后且用戶會話實際建立之前激發。因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日志。如果身份驗證失敗,將不激發登錄觸發器。

create trigger trig_insert on student after insert as beginif object_id(N'student_sum',N'U') is null--判斷student_sum表是否存在create table student_sum(stuCount int default(0));--創建存儲學生人數的student_sum表declare @stuNumber int;select @stuNumber = count(*)from student;if not exists (select * from student_sum)--判斷表中是否有記錄insert into student_sum values(0);update student_sum set stuCount =@stuNumber; --把更新后總的學生數插入到student_sum表中 endcreate trigger insert_forbidden on student_sum after insert as beginRAISERROR('禁止直接向該表中插入記錄,操作被禁止',1,1)--raiserror 是用于拋出一個錯誤 rollback transaction end create trigger trig_delete on student after delete as beginselect stu_id as 已刪除的學生編號,stu_name stu_gender,stu_agefrom deleted end;

觸發器種類


下面介紹一個較為奇葩的出發器運用示例:
需要如下圖,需求要求以XS為首字母,時間日期YYYYMMDD為中間序號,結尾xxx為流水號,原程序中的流水號是按照前面的綜合去判定的,也就是XS20190223相同時,同一天建立兩張單據則設置后面流水為001和002,現要求流水號已年的形式排序,則之前的控件無法達到效果,下面用觸發器嘗試后發現可以

ALTER trigger [dbo].[cghtspbh] on [dbo].[采購合同審批表] after insert as begindeclare @number char(3);declare @String char(17);declare @String2 char(20);select @number=(select case when count(*)<10 then '00'+convert(varchar(30),count(*)) when count(*)>10 and count(*)<100 then '0'+convert(varchar(30),count(*)) when count(*)>100 then convert(varchar(30),count(*)) end as 數量 from 采購合同審批表 where substring(合同編號,3,4)=YEAR(getdate())); select @String=substring(合同編號,0,11) from inserted; select @String2=合同編號 from inserted;update 采購合同審批表 set 合同編號 = rtrim(ltrim(rtrim(ltrim(@String))+rtrim(ltrim(@number)))) where 合同編號=@String2 end

通過拆分原程序自動生成的流水號(不考慮后3位的形式)在通過查詢當前表格中以2019年份開頭的數據(與當前時間對比獲取年份)的個數,憑借生成流水號,在自動接上之前生成的固定格式+時間作為新的完整流水號

總結

以上是生活随笔為你收集整理的sqlserver触发器Tigger使用及示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。