T SQL 語句(六) 觸發器操作

2021-07-26 20:20:37 字數 4461 閱讀 5610

一、觸發器簡介

1、觸發器的功能:

a、實現比約束更為複雜的資料約束

b、可以檢查 sql 所做的操作是否被允許

c、修改其他資料庫裡表的資料

d、可以一次呼叫多個儲存過程

e、傳送sql mail

f、返回自定義錯誤資訊

g、修改原來要操作的 sql 語句

h、防止資料表結構更改或表被刪除

2、觸發器的種類主要分為dml 觸發器和ddl 觸發器兩種,其中dml觸發器又分為after 和 instead of 觸發器

二、建立 dml 觸發器

-- 乙個表針對每個操作可以定義多個after 觸發器,但是instead of觸發器對每個操作只能建立乙個

create trigger trigger_insert on news after insert as print '插入了一條記錄'

gocreate trigger trigger_update on news after update as print '修改了一條記錄'

gocreate trigger trigger_delete on news after delete as print '刪除了一條記錄'

gocreate trigger trigger_change

on [order]

after insert,update,delete

as exec master..xp_sendmail 'tom','訂單有更改'

gocreate trigger trigger_order_insert

on [order]

after insert,update

as if (select discount from inserted) > 0.6

begin

print '折扣不能大於 0.6'

rollback transaction

endgo

三、觸發器排序

使用 sp_settriggerorder 儲存過程進行觸發器排序,其引數均為字串,引數一是觸發器名稱,引數二是啟用觸發器的順序引數,可以為 first,last和none,引數三是啟用觸發器的動作,可以是 insert,update 和 delete

create trigger trigger_update_age_employee

on employee

after update

as print '更新員工年齡'

gocreate trigger trigger_update_name_employee

on employee

after update

as print '更新員工姓名'

goupdate employee set age = 10 where id=1 -- 進行觀察

exec sp_settriggerorder

'trigger_update_age_employee','last',update

goupdate employee set age = 10 where id=11 -- 觸發器執行的順序改變了

**四、instead of 觸發器 **

after 觸發器只能在資料表中使用,而 instead of 觸發器可以在資料表和檢視中使用。以下情況建議使用 instead of 觸發器:

1、資料庫的資料禁止修改,可以使用 instead of 觸發器來跳過 update 修改記錄的 sql 語句

2、有可能需要回滾修改的 sql 語句,instead of 觸發器的回滾效率比 after 高。

3、在檢視中使用觸發器

4、用自己的方式修改資料,使用 instead of 觸發器來控制資料的修改方式和流程。

create trigger trigger_insert_employee

on employee

instead of insert

as print 'employee 表插入資料'

go  

exec sp_help 'trigger_insert_employee' -- 檢視觸發器資訊

exec sp_helptext 'trigger_insert_employee' -- 檢視觸發器sql文字

五、修改 dml 觸發器

修改觸發器的語法與修改儲存過程語法類似,只是將 create 改變成 alter。觸發器重新命名使用 sp_name 儲存過程

六、刪除 dml 觸發器

drop trigger trigger_insert_employee
七、啟用和禁用 dml 觸發器
alter table employee

disable trigger all -- 禁止 employee 的所有觸發器

alter table employee

enable trigger trigger_insert_employee -- 啟用某個觸發器

八、建立 ddl 觸發器

ddl 觸發器是sql server 2005 以後新增的觸發器型別,它在響應 ddl 語句時觸發,一般用於在資料庫中執行管理任務。

create trigger trigger_t1

on all server -- ddl 觸發器作用到當前伺服器上所有資料庫,on 可以指定某個資料庫物件

for drop_table,alter_table --使用for或after是乙個意思,但ddl觸發器不支援instead of觸發器。drop_table是啟用 ddl 觸發器的事件

as print '刪除表或修改表結構!'

-- 建立資料庫 ddl 語句操作記錄表

create table table_ddl_log(

id int not null identity(1,1) primary key,

[event] nvarchar(100),-- 事件

[server] nvarchar(100), -- 伺服器名

[database] nvarchar(100), -- 資料庫名

[schema] nvarchar(100),-- 架構名

[sql] nvarchar(max), -- sql語句

[operator] nvarchar(100),

[date] datetime2 default getdate())go

-- 建立 ddl 語句記錄觸發器

alter trigger trigger_ddl

on database -- 指定當前資料庫

for ddl_database_level_events

as declare @log xml

set @log = eventdata()

insert ddl_log values(

@log.value('(/event_instance/eventtype)[1]','nvarchar(100)'),

@log.value('(/event_instance/servername)[1]','nvarchar(100)'),

@log.value('(/event_instance/databasename)[1]','nvarchar(100)'),

@log.value('(/event_instance/schemaname)[1]','nvarchar(100)'),

@log.value('(/event_instance/tsqlcommand)[1]','nvarchar(4000)'),

convert(nvarchar(100),current_user),

getdate()

);go

九、觸發器的使用

1、在觸發器中使用 @@rowcount 獲取此次資料操作受影響行數;

2、在觸發器中使用 @@identity 獲取插入記錄的編號;

3、在update和insert觸發器裡可以使用 update(欄位名) 來判斷某個字段是否被更改。

create trigger trigger_update_name_employee

on employee

instead of update

as set nocount on -- 不記錄行數提高效能,這是個執行時設定語句,不是編譯時語句

if update(name)

begin

print '名字不能修改'

raiserror('名字一旦確定不能修改',16,5)

endgoupdate employee set name = '張三' where id = 1

T SQL語句建立觸發器

create trigger 觸發器名 on 表或檢視 for after instead of 操作時機 insert,update,delete assql語句 例1 要求 在order test表建立insert觸發器,當向order test表插入一行,如果cust test表中對應 記錄s...

理解T SQL 觸發器

觸發器是一種響應特定事件的特殊型別的儲存過程。有兩種型別的觸發器 資料定義語言 ddl 和資料操作語言 dml 觸發器。ddl能夠響應某種方式 create,alter,drop 修改資料庫結構時激發 dml是附加在特定表和檢視上的 程式不能顯式呼叫觸發器,觸發器 是某種事件產生後被自動執行。ddl...

理解T SQL 觸發器

觸發器是一種響應特定事件的特殊型別的儲存過程。有兩種型別的觸發器 資料定義語言 ddl 和資料操作語言 dml 觸發器。ddl能夠響應某種方式 create,alter,drop 修改資料庫結構時激發 dml是附加在特定表和檢視上的 程式不能顯式呼叫觸發器,觸發器 是某種事件產生後被自動執行。ddl...