最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLServer中的觸發(fā)器基本語(yǔ)法與作用

 更新時(shí)間:2021年09月18日 10:06:56   作者:fy_hanxu  
觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,它不同于之前的我們介紹的存儲(chǔ)過(guò)程.觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)被自動(dòng)調(diào)用執(zhí)行的。而存儲(chǔ)過(guò)程可以通過(guò)存儲(chǔ)過(guò)程的名稱被調(diào)用。本文給大家介紹SQLServer中的觸發(fā)器基本語(yǔ)法與作用,感興趣的朋友一起學(xué)習(xí)吧

什么是觸發(fā)器?

觸發(fā)器是在對(duì)表進(jìn)行插入、更新或刪除操作時(shí)自動(dòng)執(zhí)行的存儲(chǔ)過(guò)程。 觸發(fā)器對(duì)表進(jìn)行插入、更新、刪除的時(shí)候會(huì)自動(dòng)執(zhí)行的特殊存儲(chǔ)過(guò)程。觸發(fā)器一般用在check約束更加復(fù)雜的約束上面。觸發(fā)器和普通的存儲(chǔ)過(guò)程的區(qū)別是:觸發(fā)器是當(dāng)對(duì)某一個(gè)表進(jìn)行操作。諸如:update、insert、delete這些操作的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用執(zhí)行該表上對(duì)應(yīng)的觸發(fā)器。SQL Server 2005中觸發(fā)器可以分為兩類:DML觸發(fā)器和DDL觸發(fā)器,其中DDL觸發(fā)器它們會(huì)影響多種數(shù)據(jù)定義語(yǔ)言語(yǔ)句而激發(fā),這些語(yǔ)句有create、alter、drop語(yǔ)句。

SQL Server為每個(gè)觸發(fā)器都創(chuàng)建了兩個(gè)專用表﹕Inserted表和Deleted表。

觸發(fā)器通常用于強(qiáng)制業(yè)務(wù)規(guī)則

觸發(fā)器是一種高級(jí)約束,可以定義比用CHECK 約束更為復(fù)雜的約束 :可執(zhí)行復(fù)雜的SQL語(yǔ)句(if/while/case)、可引用其它

表中的列

觸發(fā)器定義在特定的表上,與表相關(guān)。

自動(dòng)觸發(fā)執(zhí)行

不能直接調(diào)用

是一個(gè)事務(wù)(可回滾)使用觸發(fā)器的好處觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改,不過(guò),通過(guò)級(jí)聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。觸發(fā)器可以強(qiáng)制比用CHECK約束定義的約束更為復(fù)雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定義錯(cuò)誤信息。觸發(fā)器也可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策。一個(gè)表中的多個(gè)同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對(duì)策以響應(yīng)同一個(gè)修改語(yǔ)句。

DML觸發(fā)器分為:

1、 after觸發(fā)器(之后觸發(fā))

a、 insert觸發(fā)器

b、 update觸發(fā)器

c、 delete觸發(fā)器

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

CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE]
AS
T-SQL語(yǔ)句
GO

注意:WITH ENCRYPTION表示加密觸發(fā)器定義的SQL文本 DELETE, INSERT, UPDATE指定觸發(fā)器的類型 insert 觸發(fā)器示例

/*創(chuàng)建insert觸發(fā)器,在上網(wǎng)記錄表recordInfo上創(chuàng)建插入觸發(fā)器*/
create trigger tr_insert_recordInfo
on recordInfo
for insert
as
/*定義變量,用于臨時(shí)存儲(chǔ)插入的會(huì)員號(hào)、電腦編號(hào)和卡的編號(hào)*/
declare @cardId char()
declare @PCId int
declare @CardNumber char()
/*從inserted臨時(shí)表中獲取插入的記錄行的信息,包括電腦的編號(hào)、卡的編號(hào)*/
select @PCId=PCId,@cardId=CardId from inserted
/*根據(jù)電腦編號(hào)修改電腦的使用狀態(tài)*/
update PCInfo set PCUse= where PCId=@PCId
/*根據(jù)卡的編號(hào)查詢會(huì)員號(hào)*/
select @CardNumber=CardNumber from cardinfo where CardId=@cardid
/*顯示上機(jī)成功的信息*/
print '上機(jī)成功!會(huì)員號(hào)是:'+@CardNumber+'機(jī)器號(hào)是:'+convert(char(),@PCId)
go
----插入測(cè)試數(shù)據(jù),會(huì)員號(hào)為的上機(jī)
set nocount on --不顯示sql語(yǔ)句影響的記錄行數(shù)
declare @CardId int ---聲明一個(gè)存儲(chǔ)卡的編號(hào)的變量
---根據(jù)會(huì)員號(hào)查處卡的編號(hào)
select @cardId=cardid from cardinfo where cardNumber='c' 
---向recordInfo表中插入一條記錄信息,卡的編號(hào)、電腦編號(hào)和上機(jī)時(shí)間
insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,getDate())
----查看結(jié)果
select * from recordInfo
select * from PCInfo

update觸發(fā)器示例

---創(chuàng)建delete觸發(fā)器,在上網(wǎng)記錄表RecordInfo上創(chuàng)建刪除觸發(fā)器
create trigger tr_delete_recordInfo
on recordInfo
for delete
as
if exists(select * from sysobjects where name='backRecordInfo')
----如果backrecordInfo表存在,就添加記錄即可
insert into backRecordInfo select * from deleted
else
----創(chuàng)建backRecordInfo表,從deleted中獲取被刪除的數(shù)據(jù)
select * into backRecordInfo from deleted
print'backRecordInfo表備份數(shù)據(jù)成功,備份表中的數(shù)據(jù)為:'
select * from backRecordInfo
go
-------關(guān)鍵代碼------
----測(cè)試delete觸發(fā)器,刪除數(shù)據(jù)
set nocount on
delete from recordInfo
---查看結(jié)果
print'記錄表中的數(shù)據(jù)為:'
select * from recordInfo

delete觸發(fā)器示例

-------關(guān)鍵代碼------
create trigger tr_update_recordInfo
on recordInfo
for update
as
declare @beforePCId int
declare @afterPCId int
select @beforePCId =PCId from deleted
select @afterPCId=PCID from inserted
---根據(jù)電腦編號(hào)修改使用狀態(tài)-----
---根據(jù)以前使用的電腦編號(hào)把電腦的使用狀態(tài)改為:
update PCInfo set PCUse= where PCId=@beforePCId
---根據(jù)現(xiàn)在使用的電腦編號(hào)把電腦的使用狀態(tài)改為:
update PCInfo set PCUse= where PCId=@afterPCId
----顯示電腦換機(jī)成功
print'換機(jī)成功!從'+convert(varchar(),@beforePCId)+'號(hào)電腦換到'+convert(varchar(),@afterPCId)+'號(hào)電腦'
go
/*測(cè)試update觸發(fā)器,修改電腦編號(hào)*/
--顯示更改前,記錄表中的數(shù)據(jù)
print'更改前,記錄表中的數(shù)據(jù)'
select * from recordInfo
--顯示更改前,電腦表中的數(shù)據(jù)
print'更改前,電腦表中的數(shù)據(jù)'
select * from PCInfo
set nocount on
---把電腦號(hào)為的改為
update recordInfo set PCId= where PCId= 
---查看結(jié)果
print'更改后,記錄表中的數(shù)據(jù)'
select * from recordInfo
print'更改后,電腦表中的數(shù)據(jù)'
select * from PCInfo

instead of觸發(fā)器的使用 instead of觸發(fā)器的使用范圍,instead of 觸發(fā)器可以同時(shí)在數(shù)據(jù)表和視圖中使用。通常在以下幾種情況下,建議使用instead of觸發(fā)器: 數(shù)據(jù)庫(kù)里的數(shù)據(jù)禁止修改:例如電信部門(mén)的通話記錄是不能修改的,一旦修改,則通話費(fèi)用的計(jì)數(shù)將不準(zhǔn)確。 有可能要回滾修改的SQL語(yǔ)句 在視圖中使用觸發(fā)器 用自己的方式去修改數(shù)據(jù) instead of觸發(fā)器示例

---創(chuàng)建update觸發(fā)器,在上網(wǎng)記錄表recordInfo上創(chuàng)建修改(列)觸發(fā)器
create trigger tr_updateColum1_recordInfo
on recordInfo
instead of insert
as
declare @cardbalance int --聲明用于存儲(chǔ)用戶余額的變量
declare @CardId int --聲明用于存儲(chǔ)用戶卡的編號(hào)的變量
declare @PCId int --聲明用于存儲(chǔ)電腦編號(hào)的變量
---inserted臨時(shí)表中獲取插入的記錄行信息,包括電腦編號(hào)、卡的編號(hào)
select @cardId=cardId,@PCId=PCId from inserted
select @cardbalance=cardBalance from cardInfo where CardId=@CardId
print'您的余額為:'+convert(varchar(10),@cardBalance) ---打印余額信息
if(@cardBalance<2) ---判斷余額多少,看能否正常上機(jī)
print'余額小于元,不能上機(jī)。請(qǐng)盡快充值!'
else
----根據(jù)電腦的編號(hào)修改電腦的使用狀態(tài)更改為正在使用
update PCInfo set PCUse=1 where PCId=@PCId
----向recordInfo表插入上機(jī)記錄
insert into recordInfo(cardId,PCId,beginTime)values(@CardId,@PCId,getdate())
print'上機(jī)成功'
-------關(guān)鍵代碼------
set nocount on
declare @cardId int ---聲明一個(gè)存儲(chǔ)卡的編號(hào)的變量
---根據(jù)會(huì)員號(hào)查出卡的編號(hào)
select @cardId=cardId from cardInfo where cardNumber='c001'
----向recordInfo表中插入一條記錄信息,卡的編號(hào)、電腦的編號(hào)和上機(jī)時(shí)間
insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())
select * from recordInfo
select * from PCInfo

以上所述是小編給大家介紹的SQLSever中的觸發(fā)器基本語(yǔ)法與作用的相關(guān)內(nèi)容,希望對(duì)大家有所幫助!

相關(guān)文章

  • SQL觸發(fā)器實(shí)例講解

    SQL觸發(fā)器實(shí)例講解

    為觸發(fā)器?在SQL Server里面也就是對(duì)某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程
    2012-04-04
  • 教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧

    教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧

    員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫(kù)中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班
    2013-11-11
  • MSSQL基本語(yǔ)法及實(shí)例操作語(yǔ)句

    MSSQL基本語(yǔ)法及實(shí)例操作語(yǔ)句

    這篇文章介紹了MSSQL的基本語(yǔ)法及實(shí)例操作語(yǔ)句,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SQL分頁(yè)語(yǔ)句的三種方案

    SQL分頁(yè)語(yǔ)句的三種方案

    這篇文章介紹了SQL分頁(yè)語(yǔ)句的三種方案,有需要的朋友可以參考一下
    2013-10-10
  • SqlServer數(shù)據(jù)庫(kù)腳本執(zhí)行命令行指令方式

    SqlServer數(shù)據(jù)庫(kù)腳本執(zhí)行命令行指令方式

    這篇文章主要介紹了SqlServer數(shù)據(jù)庫(kù)腳本執(zhí)行命令行指令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SQLServer 數(shù)據(jù)修復(fù)命令DBCC一覽

    SQLServer 數(shù)據(jù)修復(fù)命令DBCC一覽

    MS Sql Server 提供了很多數(shù)據(jù)庫(kù)修復(fù)的命令,當(dāng)數(shù)據(jù)庫(kù)質(zhì)疑或是有的無(wú)法完成讀取時(shí)可以嘗試這些修復(fù)命令。
    2009-11-11
  • SQL Server 常用函數(shù)使用方法小結(jié)

    SQL Server 常用函數(shù)使用方法小結(jié)

    這篇文章主要介紹了SQL Server 常用函數(shù)使用方法小結(jié),需要的朋友可以參考下
    2017-05-05
  • 關(guān)于SQL表中drop?table和delete?table的區(qū)別

    關(guān)于SQL表中drop?table和delete?table的區(qū)別

    刪表是一個(gè)比較危險(xiǎn)的操作,這次給了個(gè)機(jī)會(huì)就想嘗試下,記得在mysql表中有兩種操作,drop與delete,但是在maxcompute產(chǎn)品中嘗試時(shí),該產(chǎn)品只支持drop操作。這里說(shuō)下二者操作的區(qū)別,需要的朋友可以參考下
    2023-01-01
  • SQL Server 存儲(chǔ)過(guò)程解析

    SQL Server 存儲(chǔ)過(guò)程解析

    微軟的SQL Server的存儲(chǔ)過(guò)程機(jī)制能夠通過(guò)對(duì)Transact-SQL語(yǔ)句進(jìn)行組合而大大地簡(jiǎn)化了數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)程。
    2009-03-03
  • sqlserver 不能將值NULL插入列id(列不允許有空值解決)

    sqlserver 不能將值NULL插入列id(列不允許有空值解決)

    Microsoft OLE DB Provider for SQL Server 錯(cuò)誤 '80040e2f' 不能將值 NULL 插入列 'id',表 'web.dbo.dingdan';列不允許有空值。INSERT 失敗
    2013-06-06

最新評(píng)論

上虞市| 福建省| 黄山市| 车致| 久治县| 阿拉善左旗| 龙海市| 察隅县| 上饶市| 乡宁县| 毕节市| 绍兴市| 综艺| 象州县| 荃湾区| 黑河市| 芷江| 东乌珠穆沁旗| 酒泉市| 右玉县| 开封县| 新宁县| 监利县| 金昌市| 九寨沟县| 全椒县| 桓台县| 凌海市| 太白县| 浦县| 梓潼县| 南阳市| 石门县| 阳东县| 宿松县| 攀枝花市| 伊春市| 高阳县| 习水县| 泰州市| 青铜峡市|