亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

        2)dml觸發(fā)器 這個針對表達數(shù)據(jù)更新

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

                        insert 觸發(fā)器:

                        delete觸發(fā)器

                        update觸發(fā)器

        3)登錄觸發(fā)器

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

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

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

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

執(zhí)行update語句

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

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

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

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

3

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

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

準備數(shù)據(jù)

工欲善其事,必先利其器,(準備數(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,'論語'	,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 是一個功能, 用一個就好了
AS
  T-SQL語句
GO

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

for 和after   -- 其實就是同一個功能,

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

1.insert觸發(fā)器

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

--判斷數(shù)據(jù)庫中,是否存在這個觸發(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

測試:

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

結果:

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;
    

測試:

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

測試

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

結果:

補充:

update列級更新

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

別急,我們可以用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 

測試:

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 

 測試

drop table book

結果

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

dml觸發(fā)器:

enable |disable trigger triger_name on table_name ;

ddl觸發(fā)器:

enable | disable trigger triger_name on database;

總結

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

相關文章

最新評論