日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

觸發(fā)器的工作原理及作用

jf_78858299 ? 來(lái)源:SQL數(shù)據(jù)庫(kù)開發(fā) ? 作者:丶平凡世界 雜貨鋪 ? 2023-03-23 16:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

觸發(fā)器的定義

觸發(fā)器(trigger)是SQL Server提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā),比如當(dāng)對(duì)一個(gè)表進(jìn)行操作( INSERT,DELETE, UPDATE)時(shí)就會(huì)激活它執(zhí)行。

觸發(fā)器的作用

觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜參照完整性和數(shù)據(jù)的一致性,它能夠?qū)?shù)據(jù)庫(kù)中的相關(guān)表進(jìn)行級(jí)聯(lián)修改,提高比CHECK約束更復(fù)雜的的數(shù)據(jù)完整性,并自定義錯(cuò)誤消息。

觸發(fā)器的主要作用主要有以下接個(gè)方面

  • 強(qiáng)制數(shù)據(jù)庫(kù)間的引用完整性
  • 級(jí)聯(lián)修改數(shù)據(jù)庫(kù)中所有相關(guān)的表,自動(dòng)觸發(fā)其它與之相關(guān)的操作
  • 跟蹤變化,撤銷或回滾違法操作,防止非法修改數(shù)據(jù)
  • 返回自定義的錯(cuò)誤消息,約束無(wú)法返回信息,而觸發(fā)器可以
  • 觸發(fā)器可以調(diào)用更多的存儲(chǔ)過(guò)程

觸發(fā)器的優(yōu)點(diǎn)

  • 觸發(fā)器是自動(dòng)的。當(dāng)對(duì)表中的數(shù)據(jù)做了任何修改之后立即被激活。
  • 觸發(fā)器可以通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表進(jìn)行層疊修改。
  • 觸發(fā)器可以強(qiáng)制限制。這些限制比用CHECK約束所定義的更復(fù)雜。與CHECK約束不同的是,觸發(fā)器可以引用其他表中的列。

觸發(fā)器的分類

?SQL Server包括三種常規(guī)類型的觸發(fā)器:DML觸發(fā)器、DDL觸發(fā)器和登錄觸發(fā)器。

DML(數(shù)據(jù)操作語(yǔ)言,Data Manipulation Language)觸發(fā)器

DML觸發(fā)器是一些附加在特定表或視圖上的操作代碼,當(dāng)數(shù)據(jù)庫(kù)服務(wù)器中發(fā)生數(shù)據(jù)操作語(yǔ)言事件時(shí)執(zhí)行這些操作。

SQL Server中的DML觸發(fā)器有三種:

  • INSERT觸發(fā)器:向表中插入數(shù)據(jù)時(shí)被觸發(fā);
  • DELETE觸發(fā)器:從表中刪除數(shù)據(jù)時(shí)被觸發(fā);
  • UPDATE觸發(fā)器:修改表中數(shù)據(jù)時(shí)被觸發(fā)。

當(dāng)遇到下列情形時(shí),應(yīng)考慮使用DML觸發(fā)器:

  • 通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改
  • 防止惡意或者錯(cuò)誤的INSERT、DELETE和UPDATE操作,并強(qiáng)制執(zhí)行CHECK約束定義的限制更為復(fù)雜的其他限制。
  • 評(píng)估數(shù)據(jù)修改前后表的狀態(tài),并根據(jù)該差異才去措施。

DDL(數(shù)據(jù)定義語(yǔ)言,Data Definition Language)觸發(fā)器

DDL觸發(fā)器是當(dāng)服務(wù)器或者數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語(yǔ)言(主要是CREATE,DROP,ALTER開頭的語(yǔ)句)事件時(shí)被激活使用,使用DDL觸發(fā)器可以防止對(duì)數(shù)據(jù)架構(gòu)進(jìn)行的某些更改或記錄數(shù)據(jù)中的更改或事件操作。

登錄觸發(fā)器

登錄觸發(fā)器將為響應(yīng) LOGIN 事件而激發(fā)存儲(chǔ)過(guò)程。與 SQL Server 實(shí)例建立用戶會(huì)話時(shí)將引發(fā)此事件。登錄觸發(fā)器將在登錄的身份驗(yàn)證階段完成之后且用戶會(huì)話實(shí)際建立之前激發(fā)。因此,來(lái)自觸發(fā)器內(nèi)部且通常將到達(dá)用戶的所有消息(例如錯(cuò)誤消息和來(lái)自 PRINT 語(yǔ)句的消息)會(huì)傳送到 SQL Server 錯(cuò)誤日志。如果身份驗(yàn)證失敗,將不激發(fā)登錄觸發(fā)器。

觸發(fā)器的工作原理

觸發(fā)器觸發(fā)時(shí):

  • 系統(tǒng)自動(dòng)在內(nèi)存中創(chuàng)建INSERTED表或DELETED表;
  • 只讀,不允許修改,觸發(fā)器執(zhí)行完成后,自動(dòng)刪除。

INSERTED表:

  • 臨時(shí)保存了插入或更新后的記錄行;
  • 可以從INSERTED表中檢查插入的數(shù)據(jù)是否滿足業(yè)務(wù)需求;
  • 如果不滿足,則向用戶發(fā)送報(bào)告錯(cuò)誤消息,并回滾插入操作。

DELETED表:

  • 臨時(shí)保存了刪除或更新前的記錄行;
  • 可以從DELETED表中檢查被刪除的數(shù)據(jù)是否滿足業(yè)務(wù)需求;
  • 如果不滿足,則向用戶報(bào)告錯(cuò)誤消息,并回滾插入操作。

INSERTED表和DELETED表對(duì)照:

修改操作記錄 INSERTED DELETED
增加(INSERT)記錄 存放新增的記錄 /
刪除(DELETE)記錄 / 存放被刪除的記錄
修改(UPDATE)記錄 存放更新后的記錄 存放更新前的記錄

創(chuàng)建觸發(fā)器

創(chuàng)建觸發(fā)器的語(yǔ)法:

CREATE TRIGGER trigger_name ON table_name

[WITH ENCRYPTION]

FOR | AFTER | INSTEAD

OF [DELETE, INSERT, UPDATE]

AS

T-SQL語(yǔ)句

GO

注:

*WITH ENCRYPTION 表示加密觸發(fā)器定義的SQL文本

DELETE, INSERT, UPDATE指定觸發(fā)器的類型*

觸發(fā)器示例

創(chuàng)建學(xué)生表

create table student(    
stu_id int identity(1,1) primary key,    
stu_name varchar(10),    
stu_gender char(2),    
stu_age int
)

(提示:可以左右滑動(dòng)代碼)

創(chuàng)建INSERT觸發(fā)器

--創(chuàng)建INSERT觸發(fā)器
create trigger trig_insert
on student after insert
as
begin    
  --判斷student_sum表是否存在        
  if object_id(N'student_sum',N'U') is null
  --創(chuàng)建存儲(chǔ)學(xué)生人數(shù)的student_sum表    
  create table student_sum(
  stuCount int default(0)
  );
  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; 
  --把更新后總的學(xué)生數(shù)插入到student_sum表中
end


--測(cè)試觸發(fā)器trig_insert
--功能是向student插入數(shù)據(jù)的同時(shí)級(jí)聯(lián)插入到student_sum表中,更新stuCount
--因?yàn)槭呛笥|發(fā)器,所以先插入數(shù)據(jù)后,才觸發(fā)觸發(fā)器trig_insert;
insert into student(stu_name,stu_gender,stu_age)
values('呂布','男',30);
select stuCount 學(xué)生總?cè)藬?shù) from student_sum;     
insert into student(stu_name,stu_gender,stu_age)
values('貂蟬','女',30);             
select stuCount 學(xué)生總?cè)藬?shù) from student_sum;
insert into student(stu_name,stu_gender,stu_age)
values('曹阿瞞','男',40);                 
select stuCount 學(xué)生總?cè)藬?shù) from student_sum;

執(zhí)行上面的語(yǔ)句后,結(jié)果如下圖所示:

圖片

既然定義了學(xué)生總數(shù)表student_sum表是向student表中插入數(shù)據(jù)后才計(jì)算學(xué)生總數(shù)的,所以學(xué)生總數(shù)表應(yīng)該禁止用戶向其中插入數(shù)據(jù)

--創(chuàng)建insert_forbidden,禁止用戶向student_sum表中插入數(shù)據(jù)
create trigger insert_forbidden
on student_sum after insert
as
begin    
  RAISERROR('禁止直接向該表中插入記錄,操作被禁止',1,1)
  --raiserror 是用于拋出一個(gè)錯(cuò)誤
  rollback transaction
end
--觸發(fā)觸發(fā)器insert_forbidden
insert student_sum (stuCount) 
values(5);

結(jié)果如下:

圖片

創(chuàng)建DELETE觸發(fā)器

用戶執(zhí)行DELETE操作,就會(huì)激活DELETE觸發(fā)器,從而控制用戶能夠從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)記錄,觸發(fā)DELETE觸發(fā)器后,用戶刪除的記錄會(huì)被添加到DELETED表中,原來(lái)表的相應(yīng)記錄被刪除,所以在DELETED表中查看刪除的記錄。

--創(chuàng)建delete觸發(fā)器
create trigger trig_delete
on student after delete
as
begin    
  select stu_id as 已刪除的學(xué)生編號(hào),
  stu_name stu_gender,
  stu_age
  from deleted
end;


--執(zhí)行一條delete語(yǔ)句觸發(fā)trig_delete觸發(fā)器
delete from student where stu_id=1;

結(jié)果如下:

圖片

創(chuàng)建UPDATE觸發(fā)器

UPDATE觸發(fā)器是當(dāng)用戶在指定表上執(zhí)行UPDATE語(yǔ)句時(shí)被調(diào)用被調(diào)用,這種類型的觸發(fā)器用來(lái)約束用戶對(duì)數(shù)據(jù)的修改。UPDATE觸發(fā)器可以執(zhí)行兩種操作:更新前的記錄存儲(chǔ)在DELETED表中,更新后的記錄存儲(chǔ)在INSERTED表中。

--創(chuàng)建update觸發(fā)器
create trigger trig_update
on student after update
as
begin    
  declare @stuCount int;
  select @stuCount=count(*) from student;
  update student_sum set stuCount =@stuCount;

  select stu_id as 更新前學(xué)生編號(hào),
  stu_name as 更新前學(xué)生姓名 from deleted;

  select stu_id as 更新后學(xué)生編號(hào),
  stu_name as 更新后學(xué)生姓名 from inserted;
end
--創(chuàng)建完成,執(zhí)行一條update語(yǔ)句觸發(fā)trig_update觸發(fā)器
update student set stu_name='張飛' 
where stu_id=2;

結(jié)果如下:

圖片

創(chuàng)建替代觸發(fā)器

與前面介紹的三種AFTER觸發(fā)器不同,SQL Server服務(wù)器在執(zhí)行AFTER觸發(fā)器的SQL代碼后,先建立臨時(shí)的INSERTED表和DELETED表,然后執(zhí)行代碼中對(duì)數(shù)據(jù)庫(kù)操作,最后才激活觸發(fā)器中的代碼。而對(duì)于替代(INSTEAD OF)觸發(fā)器,SQL Server服務(wù)器在執(zhí)行觸發(fā)INSTEAD OF觸發(fā)器的代碼時(shí),先建立臨時(shí)的INSERTED表和DELETED表,然后直接觸發(fā)INSTEAD OF觸發(fā)器,而拒絕執(zhí)行用戶輸入的DML操作語(yǔ)句。

--創(chuàng)建instead of觸發(fā)器 
create trigger trig_insteadOf
on student instead of insert
as 
begin    
  declare @stuAge int;
  select @stuAge=(select stu_age from inserted)
  if(@stuAge >120)
  select '插入年齡錯(cuò)誤' as '失敗原因'
end

創(chuàng)建完成,執(zhí)行一條INSERT語(yǔ)句觸發(fā)觸發(fā)器trig_insteadOf

圖片

批注

觸發(fā)器在早期的數(shù)據(jù)處理過(guò)程中經(jīng)常使用到,特別是在處理一些因某些動(dòng)作而需要對(duì)其他表進(jìn)行調(diào)整的邏輯時(shí)。但是隨著數(shù)據(jù)量的增長(zhǎng),觸發(fā)器對(duì)數(shù)據(jù)庫(kù)的性能影響越來(lái)越大,容易造成數(shù)據(jù)庫(kù)性能降低。所以觸發(fā)器在數(shù)據(jù)量大的場(chǎng)景是禁止使用的,但是其邏輯處理功能還是被一直保留,說(shuō)明其還是有較深的應(yīng)用場(chǎng)景,需要我們掌握它的相關(guān)用法。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7349

    瀏覽量

    95055
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    807

    瀏覽量

    46963
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3849

    瀏覽量

    85491
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2065

    瀏覽量

    63576
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    什么是觸發(fā)器 觸發(fā)器工作原理作用

    ”,分別稱為置“1”端和置“0”端。常見的觸發(fā)器有R-S觸發(fā)器、D觸發(fā)器和J-K觸發(fā)器等三種,下面簡(jiǎn)單說(shuō)明它們的工作原理。類型種類按邏輯功能
    發(fā)表于 12-25 17:09

    鎖存觸發(fā)器工作原理是什么

    鎖存工作原理是什么?鎖存的動(dòng)態(tài)特性及其應(yīng)用有哪些?觸發(fā)器工作原理是什么?觸發(fā)器的電路結(jié)構(gòu)
    發(fā)表于 11-03 06:48

    rs觸發(fā)器工作原理

    rs觸發(fā)器工作原理 一、電路組成及符號(hào) 基本RS
    發(fā)表于 01-21 13:23 ?1.2w次閱讀
    rs<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>

    CMOS觸發(fā)器的結(jié)構(gòu)與工作原理

    CMOS觸發(fā)器的結(jié)構(gòu)與工作原理     CMOS D觸發(fā)器足主-從結(jié)構(gòu)形式的一種邊沿觸發(fā)器,CMOS T型觸發(fā)器
    發(fā)表于 10-17 08:52 ?8042次閱讀
    CMOS<b class='flag-5'>觸發(fā)器</b>的結(jié)構(gòu)與<b class='flag-5'>工作原理</b>

    JK觸發(fā)器工作原理詳細(xì)介紹

    JK觸發(fā)器工作原理詳細(xì)介紹 JK觸發(fā)器,采用與或非電路結(jié)構(gòu),它的工作原理為:CP為0時(shí),觸發(fā)器處于一個(gè)穩(wěn)態(tài);CP由0變1時(shí),
    發(fā)表于 03-08 13:47 ?5.5w次閱讀

    D觸發(fā)器工作原理是什么?

    D觸發(fā)器工作原理是什么? 邊沿D 觸發(fā)器: 負(fù)跳沿觸發(fā)的主從觸發(fā)器工作時(shí),必須在正跳沿前加
    發(fā)表于 03-08 13:56 ?7.1w次閱讀
    D<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>是什么?

    什么是RS觸發(fā)器,RS觸發(fā)器工作原理是什么?

    什么是RS觸發(fā)器,RS觸發(fā)器工作原理是什么? 主從RS觸發(fā)器
    發(fā)表于 03-08 14:00 ?3.2w次閱讀

    施密特觸發(fā)器電路及工作原理詳解_施密特觸發(fā)器特點(diǎn)_施密特觸發(fā)器作用

    本文介紹了什么是施密特觸發(fā)器、施密特觸發(fā)器的主要特點(diǎn),其次介紹了施密特觸發(fā)器電路工作原理詳解,最后介紹了施密特觸發(fā)器的具體
    發(fā)表于 01-16 11:50 ?5.1w次閱讀
    施密特<b class='flag-5'>觸發(fā)器</b>電路及<b class='flag-5'>工作原理</b>詳解_施密特<b class='flag-5'>觸發(fā)器</b>特點(diǎn)_施密特<b class='flag-5'>觸發(fā)器</b>的<b class='flag-5'>作用</b>

    jk邊沿觸發(fā)器工作原理

    本文開始介紹了JK觸發(fā)器工作特性與邊沿JK觸發(fā)器的特點(diǎn),其次介紹了邊沿JK觸發(fā)器工作原理與特點(diǎn),最后介紹了集成邊沿式JK
    發(fā)表于 01-30 17:17 ?3.9w次閱讀
    jk邊沿<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>

    一文看懂單穩(wěn)態(tài)觸發(fā)器工作原理作用

    本文開始介紹了單穩(wěn)態(tài)觸發(fā)器電路組成和單穩(wěn)態(tài)觸發(fā)器的四種基本電路圖,其次詳細(xì)闡述了單穩(wěn)態(tài)觸發(fā)器工作原理,最后介紹了單穩(wěn)態(tài)觸發(fā)器
    的頭像 發(fā)表于 03-27 10:02 ?7.8w次閱讀
    一文看懂單穩(wěn)態(tài)<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>及<b class='flag-5'>作用</b>

    觸發(fā)器作用_觸發(fā)器的特點(diǎn)介紹

    本文開始介紹了觸發(fā)器的定義和觸發(fā)器的特點(diǎn),其次闡述了觸發(fā)器的分類和觸發(fā)器作用,最后介紹了觸發(fā)器
    發(fā)表于 03-27 17:35 ?2.2w次閱讀

    單穩(wěn)態(tài)觸發(fā)器有哪些_單穩(wěn)態(tài)觸發(fā)器工作原理介紹

    本文開始闡述了單穩(wěn)態(tài)觸發(fā)器工作特點(diǎn)和單穩(wěn)態(tài)觸發(fā)器的分類,其次闡述了單穩(wěn)態(tài)觸發(fā)器工作原理,最后介紹了常用的CD4098單穩(wěn)態(tài)
    的頭像 發(fā)表于 03-28 15:41 ?4.4w次閱讀
    單穩(wěn)態(tài)<b class='flag-5'>觸發(fā)器</b>有哪些_單穩(wěn)態(tài)<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>介紹

    單穩(wěn)態(tài)觸發(fā)器芯片有哪些_單穩(wěn)態(tài)觸發(fā)器工作原理

    本文主要介紹了單穩(wěn)態(tài)觸發(fā)器芯片有哪些_單穩(wěn)態(tài)觸發(fā)器工作原理。單穩(wěn)態(tài)觸發(fā)器只有一個(gè)穩(wěn)定狀態(tài),一個(gè)暫穩(wěn)態(tài)。在外加脈沖的作用下,單穩(wěn)態(tài)
    的頭像 發(fā)表于 03-28 18:22 ?3.2w次閱讀
    單穩(wěn)態(tài)<b class='flag-5'>觸發(fā)器</b>芯片有哪些_單穩(wěn)態(tài)<b class='flag-5'>觸發(fā)器</b><b class='flag-5'>工作原理</b>

    jk觸發(fā)器和t觸發(fā)器工作原理、特點(diǎn)和應(yīng)用

    JK觸發(fā)器和T觸發(fā)器都是數(shù)字電路中常用的觸發(fā)器,它們?cè)诖鎯?chǔ)和傳遞信息方面發(fā)揮著重要作用。然而,它們?cè)诠δ芎蛻?yīng)用上存在一定的差異。 一、JK觸發(fā)器
    的頭像 發(fā)表于 08-28 09:43 ?9617次閱讀

    rs觸發(fā)器工作原理 rs觸發(fā)器和sr觸發(fā)器的區(qū)別

    RS觸發(fā)器(Reset-Set觸發(fā)器)和SR觸發(fā)器(Set-Reset觸發(fā)器)是數(shù)字電路中常用的兩種基本觸發(fā)器。它們?cè)谶壿嫻δ芎蛻?yīng)用上有所不
    的頭像 發(fā)表于 10-21 10:06 ?1.1w次閱讀
    水富县| 通城县| 马公市| 图们市| 安福县| 汾西县| 榆中县| 开鲁县| 孟村| 潞西市| 延长县| 南澳县| 岳池县| 修文县| 毕节市| 博乐市| 湘阴县| 和硕县| 博爱县| 兴安盟| 于田县| 聂拉木县| 黄大仙区| 南陵县| 平阴县| 兴宁市| 乌拉特中旗| 仪征市| 新昌县| 天台县| 珠海市| 麻城市| 汝阳县| 交口县| 康平县| 南阳市| 光泽县| 绥中县| 留坝县| 将乐县| 安龙县|