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

sql?server中的觸發(fā)器用法實(shí)例詳解

 更新時(shí)間:2024年03月22日 09:49:30   作者:guokeeiron  
這篇文章主要給大家介紹了關(guān)于sql?server中觸發(fā)器用法的相關(guān)資料,SQL Server觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,它們?cè)跀?shù)據(jù)庫(kù)中的表上自動(dòng)執(zhí)行,需要的朋友可以參考下

1.觸發(fā)器的定義

觸發(fā)器其實(shí)就是一個(gè)特殊的存儲(chǔ)過(guò)程,這個(gè)存儲(chǔ)過(guò)程呢,不能調(diào)用罷了, 而是當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候才觸發(fā)了這個(gè)過(guò)程,;

2.觸發(fā)器的分類(lèi)

        1) ,ddl觸發(fā)器, 針對(duì)數(shù)據(jù)庫(kù)的更新變化

                主要是以create,drop,alter開(kāi)頭的語(yǔ)句的觸發(fā)

        2)dml觸發(fā)器 這個(gè)針對(duì)表達(dá)數(shù)據(jù)更新

                after |for 觸發(fā)器(動(dòng)作完成之后觸發(fā))

                        insert 觸發(fā)器:

                        delete觸發(fā)器

                        update觸發(fā)器

        3)登錄觸發(fā)器

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

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

在dml觸發(fā)器執(zhí)行過(guò)程中, 會(huì)產(chǎn)生兩張臨時(shí)表 inserted and  deleted  在執(zhí)行完畢后自動(dòng)釋放;

順序insert觸發(fā)器delete觸發(fā)器update觸發(fā)器
1執(zhí)行insert語(yǔ)句,在表中插入數(shù)據(jù)執(zhí)行delete語(yǔ)句,刪除數(shù)據(jù)

執(zhí)行update語(yǔ)句

,修改數(shù)據(jù)

2在臨時(shí)表inserted中插入新數(shù)據(jù)的一個(gè)副本在deleteed表中插入刪除的數(shù)據(jù)的副本

a:首先備份要更新的數(shù)據(jù),插入到deleted表中

b:備份完成后,將更新數(shù)據(jù)插入到inserted 表中

3

觸發(fā)器對(duì)數(shù)據(jù)進(jìn)行檢驗(yàn), 確定是否會(huì)滾或者其他操作觸發(fā)器對(duì)刪除數(shù)據(jù)檢查, 來(lái)執(zhí)行其他操作插入新的數(shù)據(jù)

4.觸發(fā)器的應(yīng)用

準(zhǔn)備數(shù)據(jù)

工欲善其事,必先利其器,(準(zhǔn)備數(shù)據(jù)):

create table book (
	bid int primary key  not null ,
	bname varchar(200)  not null , 
	bauther varchar(100)   ,
	bprice decimal(10,2) 
)

insert into book(bid,bname,bprice,bauther)
				values (1,'論語(yǔ)'	,25.6 ,'孔子'),
					   (2,'天龍八部',25.6 ,'金庸') ,
					   (3,'雪山飛狐',32.7 ,'金庸'),
					   (4,'平凡的世',35.8 ,'路遙' ) ,
					   (5,'史記'    ,54.8 ,'司馬遷') ,
					   (6,'狂人日記',35.5  ,'魯迅')	

創(chuàng)建觸發(fā)器的格式:

CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]  --給觸發(fā)器文本加密
FOR|after |instead of  [DELETE, INSERT, UPDATE]   ---多加一句after和for 是一個(gè)功能, 用一個(gè)就好了
AS
  T-SQL語(yǔ)句
GO

 [WITH ENCRYPTION]  --給觸發(fā)器文本加密

for 和after   -- 其實(shí)就是同一個(gè)功能,

instead of  就是執(zhí)行某個(gè)操作之前

1.insert觸發(fā)器

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

--判斷數(shù)據(jù)庫(kù)中,是否存在這個(gè)觸發(fā)器
IF (object_id('tr_insert_book','tr') is not null) 
    drop trigger tr_insert_book
go
create trigger tr_insert_book
on book
instead of  insert 
as 
begin 
    declare @bid int ;
    select @bid = bid from inserted ;
    insert into books(bid) values(@bid);
    print'插入成功';
end

測(cè)試:

insert into book values(8,'鹿鼎記','金庸',60)

結(jié)果:

2.delete觸發(fā)器

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

IF(OBJECT_ID('TR_DELETE_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_DELETE_BOOK
GO

CREATE trigger TR_DELETE_BOOK
ON BOOK
FOR DELETE 
AS 
BEGIN 
 
    print'數(shù)據(jù)備份';
    
    if(object_id('book_back','U') is not null ) 
        insert into book_back select * from deleted; 
    else 
        select * into book_back from deleted;
    print '備份完成'
end;
    

測(cè)試:

delete from book where bid =1
select * from book_back

少了bid=1 的數(shù)據(jù) 

book_back成功備份;

3.update 觸發(fā)器

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

IF(OBJECT_ID('TR_UPDATE_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_UPDATE_BOOK
GO

CREATE TRIGGER TR_UPDATE_BOOK
ON BOOK 
AFTER UPDATE
AS 
BEGIN 
    waitfor delay '00:00:02'
    select * from book;
END

測(cè)試

update book set bname ='金瓶梅' ,bauter='未知',bprice =12345 where bid =8

結(jié)果:

補(bǔ)充:

update列級(jí)更新

需求, 比如book的bid是主鍵 ,那就不能更改, 我們應(yīng)該這么辦呢?

別急,我們可以用update()函數(shù)

IF(OBJECT_ID('TR_UPDATE1_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_UPDATE1_BOOK
GO

create trigger TR_UPDATE1_BOOK
on book
instead of update
as 
begin 
    if(update(bid))
    begin
        print'主鍵不能更改!!!!';
        rollback; 
    end 
end 

測(cè)試:

update book set bid =1 
select * from book

DDL觸發(fā)器

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

IF(OBJECT_ID('TR_drop_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_drop_BOOK
GO
create trigger TR_drop_BOOK
on database 
instead of DROP_TABLE,ALTER_TABLE
as 
begin 
    print'別想著干壞事!!!!好好工作'
    rollback;
end 

 測(cè)試

drop table book

結(jié)果

5.觸發(fā)器的啟用和禁用

dml觸發(fā)器:

enable |disable trigger triger_name on table_name ;

ddl觸發(fā)器:

enable | disable trigger triger_name on database;

總結(jié)

到此這篇關(guān)于sql server中的觸發(fā)器用法的文章就介紹到這了,更多相關(guān)sql server觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

宁波市| 合水县| 霸州市| 上虞市| 建宁县| 论坛| 康乐县| 闻喜县| 天气| 亚东县| 巩义市| 大关县| 克什克腾旗| 徐闻县| 综艺| 策勒县| 南乐县| 绥阳县| 敦煌市| 石家庄市| 益阳市| 海晏县| 原平市| 毕节市| 获嘉县| 合山市| 盐亭县| 班戈县| 若羌县| 香格里拉县| 乡宁县| 濮阳市| 清水河县| 沙洋县| 洪江市| 济阳县| 铜山县| 涟源市| 南投市| 临海市| 贡山|